From 272bf37088c6054f1376c7b40f8ea37db99fabbf Mon Sep 17 00:00:00 2001 From: Adam Goldsmith Date: Sun, 6 Dec 2020 09:42:02 -0500 Subject: [PATCH 1/2] 1.52 --- unpacked.ttslua | 1484 +- unpacked.yaml | 27 +- unpacked/3DText 65eb7e.yaml | 2 +- unpacked/Bag All Player Cards 15bb07.yaml | 1030 + .../Card .18 Derringer (2) f8a977.yaml | 45 + .../Card .18 Derringer 101a41.yaml | 45 + .../Card .25 Automatic a5087b.yaml | 45 + .../Card .32 Colt (2) c026c9.yaml | 45 + .../Card .32 Colt b0f851.yaml | 45 + .../Card .35 Winchester (Taboo) 41e560.yaml | 45 + .../Card .35 Winchester ebdd78.yaml | 45 + .../Card .41 Derringer (2) f57af7.yaml | 45 + .../Card .41 Derringer fe2db3.yaml | 45 + .../Card .45 Automatic (2) fe0cc0.yaml | 45 + .../Card .45 Automatic 12660b.yaml | 45 + .../Card .45 Thompson (3) b492cb.yaml | 45 + .../Card .45 Thompson (3) d4dbc7.yaml | 45 + .../Card .45 Thompson 2c6509.yaml | 45 + .../Card A Chance Encounter (2) 0edef1.yaml | 45 + .../Card A Chance Encounter 3f3488.yaml | 45 + .../Card A Glimmer of Hope f21109.yaml | 45 + .../Card A Test of Will (1) 4cfcc7.yaml | 45 + .../Card A Test of Will (2) 71a760.yaml | 45 + .../Card A Test of Will 48e516.yaml | 45 + .../Card Abandoned and Alone 79b4af.yaml | 45 + .../Card Abbess Allegria Di Biase 1e7f1b.yaml | 45 + .../Card Abigail Foreman (4) 97e9ce.yaml | 45 + .../Card Able Bodied 051742.yaml | 45 + .../Card Abyssal Tome (2) a2d392.yaml | 45 + .../Card Accursed Fate 85e7d9.yaml | 45 + .../Card Accursed Follower ef91a9.yaml | 45 + ...rd Ace in the Hole (3) (Taboo) e5d5f0.yaml | 45 + .../Card Ace in the Hole (3) 074858.yaml | 45 + .../Card Ace of Rods (1) 52a677.yaml | 45 + .../Card Ace of Swords (1) c4d436.yaml | 45 + .../Card Across Space and Time fb943f.yaml | 45 + .../Card Act of Desperation 0bea17.yaml | 45 + .../Card Adaptable (1) 731d2a.yaml | 45 + .../Card Against All Odds (2) c077bf.yaml | 45 + .../Card Agency Backup (5) d6eda3.yaml | 45 + ...d Alchemical Transmutation (2) 283e54.yaml | 45 + .../Card Alchemical Transmutation 54832d.yaml | 45 + .../Card Alejandro Vela c49b4b.yaml | 45 + .../Card Alice Luxley ae20e0.yaml | 45 + .../Card All In (5) (Taboo) ff1dfe.yaml | 45 + .../Card All In (5) 7d3a27.yaml | 45 + .../Card Alter Fate (1) 9e4e11.yaml | 45 + .../Card Alter Fate (3) 83c86b.yaml | 45 + .../Card Alyssa Graham 53867b.yaml | 45 + .../Card Ambush (1) a1fd61.yaml | 45 + .../Card Amnesia 2210c1.yaml | 45 + .../Card Analytical Mind 7b6ab5.yaml | 45 + .../Card Anatomical Diagrams a8e495.yaml | 45 + .../Card Ancient Ankh 0ce113.yaml | 45 + .../Card Ancient Stone (1) 9bc46e.yaml | 45 + .../Card Ancient Stone (4) 3289b0.yaml | 45 + .../Card Ancient Stone (4) 863f91.yaml | 45 + .../Card Ancient Stone (4) 9c56d3.yaml | 45 + .../Card Angered Spirits d8705c.yaml | 45 + .../Card Anna Kaslow (4) 03a4de.yaml | 45 + ...nother Day, Another Dollar (3) 006d44.yaml | 45 + ...rd Anything You Can Do, Better 2c563c.yaml | 45 + .../Card Aquinnah (1) 9393ec.yaml | 45 + .../Card Aquinnah (3) fb9dbb.yaml | 45 + .../Card Arbiter of Fates 4fbdb2.yaml | 45 + .../Card Arcane Enlightenment e69708.yaml | 45 + .../Card Arcane Initiate (3) 65b30d.yaml | 45 + .../Card Arcane Initiate 7307c4.yaml | 45 + .../Card Arcane Insight (4) 536b52.yaml | 45 + .../Card Arcane Research e425d0.yaml | 45 + .../Card Arcane Studies (2) 644af9.yaml | 45 + .../Card Arcane Studies (4) ca23d4.yaml | 45 + .../Card Arcane Studies 9e4505.yaml | 45 + .../Card Archaic Glyphs (3) 3d35aa.yaml | 45 + .../Card Archaic Glyphs (3) 66d5a3.yaml | 45 + .../Card Archaic Glyphs (3) a14a11.yaml | 45 + .../Card Archaic Glyphs cbfc12.yaml | 45 + .../Card Armageddon 3feff1.yaml | 45 + .../Card Armor of Ardennes (5) f7a9ab.yaml | 45 + .../Card Arrogance b2e5b0.yaml | 45 + .../Card Art Student 07a8f0.yaml | 45 + .../Card Astounding Revelation 7686cb.yaml | 45 + .../Card Astral Travel 31d087.yaml | 45 + .../Card Atychiphobia a3bc7a.yaml | 45 + .../Card Augur cf9ca8.yaml | 45 + .../Card August Lindquist 83b588.yaml | 45 + .../Card Azure Flame (3) c5fb42.yaml | 45 + .../Card Azure Flame (5) 0ee874.yaml | 45 + .../Card Azure Flame 17319c.yaml | 45 + .../Card Backpack (2) 389a34.yaml | 45 + .../Card Backpack f59085.yaml | 45 + .../Card Backstab (3) 7baf75.yaml | 45 + .../Card Backstab cdfd9f.yaml | 45 + .../Card Bait and Switch (3) 864fb6.yaml | 45 + .../Card Bait and Switch 2c2d9a.yaml | 45 + .../Card Bandolier (2) e8b7ad.yaml | 45 + .../Card Bandolier 82775a.yaml | 45 + .../Card Banish (1) a00fca.yaml | 45 + .../Card Baron Samedi 16ad5d.yaml | 45 + .../Card Barricade (3) 2e3115.yaml | 45 + .../Card Barricade edb554.yaml | 45 + .../Card Baseball Bat 48e103.yaml | 45 + .../Card Bauta 9c9196.yaml | 45 + .../Card Bear Trap 74840a.yaml | 45 + .../Card Beat Cop (2) 7001be.yaml | 45 + .../Card Beat Cop 7d4749.yaml | 45 + .../Card Becky 587589.yaml | 45 + .../Card Belly of the Beast dffa9d.yaml | 45 + .../Card Beloved b4666d.yaml | 45 + .../Card Beretta M1918 (4) 91da6b.yaml | 45 + .../Card Bind Monster (2) ba1460.yaml | 45 + .../Card Blackjack (2) 37a2b5.yaml | 45 + .../Card Blackjack 097dcc.yaml | 45 + .../Card Blade of Ark'at db8043.yaml | 45 + .../Card Blessed Blade cf4571.yaml | 45 + .../Card Blinding Light (2) 8254d4.yaml | 45 + .../Card Blinding Light 30f860.yaml | 45 + .../Card Blood Eclipse (1) 5efc92.yaml | 45 + .../Card Blood Eclipse (3) 53d765.yaml | 45 + .../Card Blood Pact (3) 64e131.yaml | 45 + .../Card Blood Pact fc709b.yaml | 45 + .../Card Blood-Rite eafd12.yaml | 45 + .../Card Bloodlust aafc17.yaml | 45 + .../Card Bloodstained Dagger d71f11.yaml | 45 + .../Card Book of Psalms cc1ef3.yaml | 45 + .../Card Book of Shadows (1) 35166c.yaml | 45 + .../Card Book of Shadows (3) 296dc8.yaml | 45 + .../Card Borrowed Time (3) 0db666.yaml | 45 + .../Card Bought in Blood 275dc3.yaml | 45 + .../Card Bounty Contracts 4d9b32.yaml | 45 + .../Card Boxing Gloves (3) 54293e.yaml | 45 + .../Card Boxing Gloves db4a43.yaml | 45 + .../Card Breaking and Entering 31cfbf.yaml | 45 + .../Card Brother Xavier (1) 3c9617.yaml | 45 + .../Card Brute Force (1) fb9b7e.yaml | 45 + .../Card Bulletproof Vest (3) c4cf62.yaml | 45 + .../Card Burglary (2) 2aeb8a.yaml | 45 + .../Card Burglary bc3451.yaml | 45 + .../Card Burning the Midnight Oil 0d29be.yaml | 45 + .../Card Bury Them Deep e6efe6.yaml | 45 + .../Card Butterfly Effect (1) 22fc6c.yaml | 45 + .../Card Call of the Unknown 86feae.yaml | 45 + .../Card Called by the Mists e628de.yaml | 45 + .../Card Calling in Favors 9b9e8b.yaml | 45 + .../Card Cat Burglar (1) 2fe723.yaml | 45 + .../Card Catling Gun deea7a.yaml | 45 + .../Card Caught Red-Handed ecd087.yaml | 45 + .../Card Celaeno Fragments d287bc.yaml | 45 + .../Card Chainsaw (4) d40f4e.yaml | 45 + .../Card Charisma (3) 9e6c55.yaml | 45 + .../Card Charles Ross, Esq. 4a2a36.yaml | 45 + .../Card Charon's Obol (1) 1dbc95.yaml | 45 + .../Card Cheap Shot (2) 0b963c.yaml | 45 + .../Card Cheap Shot b8c93a.yaml | 45 + .../Card Cheat Death (5) 3add54.yaml | 45 + .../Card Cherished Keepsake (1) 5a2b49.yaml | 45 + .../Card Cherished Keepsake 215cec.yaml | 45 + .../Card Chew Toy of Nightmares bbf1af.yaml | 45 + .../Card Chicago Typewriter (4) ecfa42.yaml | 45 + .../Card Chronophobia eeb330.yaml | 45 + .../Card Chuck Fergus (5) 0e72b6.yaml | 45 + .../Card Clairvoyance (3) f5d382.yaml | 45 + .../Card Clairvoyance (5) e21200.yaml | 45 + .../Card Clairvoyance b67371.yaml | 45 + .../Card Clarity of Mind (3) a53344.yaml | 45 + .../Card Clarity of Mind 8e57b8.yaml | 45 + .../Card Clasp of Black Onyx f295d9.yaml | 45 + .../Card Clean Them Out 3319be.yaml | 45 + .../Card Cloak of the Outer Realm 4e1e79.yaml | 45 + .../Card Close Call (2) 6aae86.yaml | 45 + .../Card Colt Vest Pocket (2) 8dda2d.yaml | 45 + .../Card Colt Vest Pocket 5a305e.yaml | 45 + .../Card Combat Training (1) bd3ecc.yaml | 45 + .../Card Connect the Dots 13413d.yaml | 45 + .../Card Contraband (2) 620b6e.yaml | 45 + .../Card Contraband b4ad29.yaml | 45 + .../Card Copycat (3) de40c8.yaml | 45 + .../Card Cornered (2) c6c260.yaml | 45 + .../Card Counterpunch (2) 92436b.yaml | 45 + .../Card Counterpunch 20645e.yaml | 45 + .../Card Counterspell (2) 2236f6.yaml | 45 + .../Card Coup de Grâce 2240f9.yaml | 45 + .../Card Cover Up ca25bc.yaml | 45 + .../Card Crack the Case 8dce44.yaml | 45 + .../Card Crisis of Faith 8b68f4.yaml | 45 + .../Card Crisis of Identity 367aac.yaml | 45 + .../Card Cryptic Grimoire fbfa24.yaml | 45 + .../Card Cryptic Research (4) 5d25b1.yaml | 45 + .../Card Cryptic Writings (2) 870bdc.yaml | 45 + .../Card Cryptic Writings ff2776.yaml | 45 + .../Card Cryptographic Cipher 4f3142.yaml | 45 + .../Card Crystal Pendulum 6c3156.yaml | 45 + ...ard Crystalline Elder Sign (3) 8f871b.yaml | 45 + .../Card Crystallizer of Dreams e3bd71.yaml | 45 + .../Card Cunning Distraction e8ea95.yaml | 45 + .../Card Cunning e2767a.yaml | 45 + .../Card Curiosity 9e5cd2.yaml | 45 + .../Card Curse of the Rougarou 569b06.yaml | 45 + .../Card Custom Ammunition (3) f03baa.yaml | 45 + .../Card Daisy's Tote Bag 321cb7.yaml | 45 + .../Card Daredevil (2) b3cad4.yaml | 45 + .../Card Daredevil e4688b.yaml | 45 + .../Card Daring 91e53c.yaml | 45 + .../Card Daring Maneuver (2) fc82a5.yaml | 45 + .../Card Daring Maneuver cc6b14.yaml | 45 + .../Card Dario El-Amin 5ec1a2.yaml | 45 + .../Card Dark Future 3aa40e.yaml | 45 + .../Card Dark Horse 1b4434.yaml | 45 + .../Card Dark Insight f08934.yaml | 45 + .../Card Dark Memory 580a4d.yaml | 45 + .../Card Dark Memory c025bf.yaml | 45 + .../Card Dark Pact dd3d09.yaml | 45 + .../Card Dark Prophecy da7613.yaml | 45 + .../Card Dark Ritual b2b554.yaml | 45 + .../Card David Renfield 1f8539.yaml | 45 + .../Card Day of Reckoning a9d77d.yaml | 45 + .../Card Dayana Esperence (3) 4f2489.yaml | 45 + .../Card De Vermis Mysteriis (2) b40b98.yaml | 45 + .../Card Death • XIII (1) 2e5b03.yaml | 45 + .../Card Deciphered Reality (5) 8b0193.yaml | 45 + .../Card Decorated Skull (3) 946a58.yaml | 45 + .../Card Decorated Skull 07350b.yaml | 45 + .../Card Decoy 2ee50e.yaml | 45 + .../Card Deduction (2) 95272b.yaml | 45 + .../Card Deduction b265c4.yaml | 45 + .../Card Deep Knowledge b176fc.yaml | 45 + .../Card Defiance (2) bf3dd1.yaml | 45 + .../Card Defiance 59b24f.yaml | 45 + .../Card Delay the Inevitable 683937.yaml | 45 + .../Card Delilah O'Rourke (3) 97a795.yaml | 45 + .../Card Delve Too Deep (Taboo) d4a68a.yaml | 45 + .../Card Delve Too Deep 14e212.yaml | 45 + .../Card Dendromorphosis 121b2d.yaml | 45 + .../Card Deny Existence (5) d24531.yaml | 45 + .../Card Deny Existence 8aa0c3.yaml | 45 + .../Card Desperate Search 45bdf0.yaml | 45 + .../Card Detached from Reality d12359.yaml | 45 + .../Card Detective's Colt 1911s f4bac6.yaml | 45 + .../Card Devil's Luck (1) 812685.yaml | 45 + .../Card Dig Deep (2) 0414b4.yaml | 45 + .../Card Dig Deep fc9e1b.yaml | 45 + .../Card Disc of Itzamna (2) b00b76.yaml | 45 + .../Card Disc of Itzamna d6c44a.yaml | 45 + .../Card Dodge e0dff3.yaml | 45 + .../Card Dog Monocle 041012.yaml | 45 + .../Card Dogcatchers 99800f.yaml | 45 + .../Card Doomed ba2ae1.yaml | 45 + ...Card Double or Nothing (Taboo) f98f6f.yaml | 45 + .../Card Double or Nothing efb09b.yaml | 45 + .../Card Double, Double (4) 0e0530.yaml | 45 + .../Card Dr. Elli Horowitz 27e7b3.yaml | 45 + .../Card Dr. Francis Morgan f03306.yaml | 45 + .../Card Dr. Henry Armitage 66197b.yaml | 45 + ... Dr. Milan Christopher (Taboo) 8ae314.yaml | 45 + .../Card Dr. Milan Christopher 9934d2.yaml | 45 + .../Card Dr. William T. Maleson 234ff6.yaml | 45 + .../Card Drawing Thin (Taboo) 3d08dc.yaml | 45 + .../Card Drawing Thin 6d9881.yaml | 45 + .../Card Drawing the Sign 3b3c0a.yaml | 45 + .../Card Drawn to the Flame a8298f.yaml | 45 + .../Card Dread Curse c54d7e.yaml | 45 + .../Card Dreaded End 4b2e72.yaml | 45 + .../Card Dream Diary (3) 5f9a10.yaml | 45 + .../Card Dream Diary (3) e5f9cb.yaml | 45 + .../Card Dream Diary (3) ea40f6.yaml | 45 + .../Card Dream Diary b81dcf.yaml | 45 + .../Card Dream Parasite ae16e8.yaml | 45 + .../Card Dream-Enhancing Serum 98c5af.yaml | 45 + .../Card Dream-Gate fa4c1e.yaml | 45 + .../Card Dreams of the Deep 13eaf0.yaml | 45 + .../Card Duke 876557.yaml | 45 + .../Card Dumb Luck (2) 0c433b.yaml | 45 + .../Card Dumb Luck f0e425.yaml | 45 + .../Card Dynamite Blast (2) e35bc2.yaml | 45 + .../Card Dynamite Blast (3) 14dcc4.yaml | 45 + .../Card Dynamite Blast 97986a.yaml | 45 + .../Card Déjà Vu (5) 719a45.yaml | 45 + .../Card Earl Sawyer f14dce.yaml | 45 + .../Card Easy Mark (1) cdbb37.yaml | 45 + .../Card Eat lead! (2) fc2629.yaml | 45 + .../Card Eat lead! a2c7ef.yaml | 45 + .../Card Eavesdrop 256da2.yaml | 45 + .../Card Eidetic Memory (3) 814ce2.yaml | 45 + .../Card Elder Sign Amulet (3) 324e49.yaml | 45 + .../Card Eldritch Inspiration (1) e84eff.yaml | 45 + .../Card Eldritch Inspiration ff3f17.yaml | 45 + .../Card Elina Harper 7e2896.yaml | 45 + .../Card Elusive (Taboo) 34140c.yaml | 45 + .../Card Elusive 833305.yaml | 45 + .../Card Emergency Aid 9c46da.yaml | 45 + .../Card Emergency Cache (2) 8948c4.yaml | 45 + .../Card Emergency Cache (3) 408cb5.yaml | 45 + .../Card Emergency Cache 510c0d.yaml | 45 + .../Card Empower Self (2) 3d22c4.yaml | 45 + .../Card Empower Self (2) 4c0f00.yaml | 45 + .../Card Empower Self (2) ffe4dd.yaml | 45 + .../Card Empty Vessel (4) c0d236.yaml | 45 + .../Card Enchanted Blade (3) 84b918.yaml | 45 + .../Card Enchanted Blade (3) d0de54.yaml | 45 + .../Card Enchanted Blade c7d9b5.yaml | 45 + .../Card Enchanted Skull 19094d.yaml | 45 + .../Card Encyclopedia (2) f5bcec.yaml | 45 + .../Card Encyclopedia dbb0e0.yaml | 45 + .../Card Enraptured a5c780.yaml | 45 + .../Card Esoteric Atlas (1) 0ce005.yaml | 45 + .../Card Esoteric Atlas (2) 2172e2.yaml | 45 + .../Card Essence of the Dream 6ad46b.yaml | 45 + .../Card Ethereal Form db90e2.yaml | 45 + .../Card Eucatastrophe (3) eaaee9.yaml | 45 + .../Card Eureka! ffa4f9.yaml | 45 + .../Card Ever Vigilant (1) bb640d.yaml | 45 + .../Card Evidence! (1) 3df5fb.yaml | 45 + .../Card Evidence! 2db518.yaml | 45 + .../Card Expedition Journal 9dc3d4.yaml | 45 + .../Card Expeditious Retreat (1) ea8324.yaml | 45 + .../Card Expose Weakness (1) 2e93fd.yaml | 45 + .../Card Expose Weakness (3) 77f92c.yaml | 45 + .../Card Extensive Research (1) 3dc25c.yaml | 45 + .../Card Extensive Research 013446.yaml | 45 + .../Card Extra Ammunition (1) f60263.yaml | 45 + .../Card Eye of Chaos 9a5782.yaml | 45 + .../Card False Awakening 0de10c.yaml | 45 + .../Card False Awakening 3bf831.yaml | 45 + .../Card False Covenant (2) 3442f5.yaml | 45 + .../Card Familiar Spirit 971d52.yaml | 45 + .../Card Family Inheritance 394603.yaml | 45 + .../Card Farsight (4) b4121c.yaml | 45 + .../Card Faustian Bargain 17d34b.yaml | 45 + .../Card Fearless (2) b2e27e.yaml | 45 + .../Card Fearless cd0ac1.yaml | 45 + .../Card Feed the Mind (3) bc4788.yaml | 45 + .../Card Feed the Mind a614de.yaml | 45 + .../Card Feline Discombobulator 7031aa.yaml | 45 + .../Card Fence (1) 2423e7.yaml | 45 + .../Card Fieldwork d6771f.yaml | 45 + .../Card Fight or Flight 00af4f.yaml | 45 + .../Card Final Rhapsody 2c901b.yaml | 45 + .../Card Fine Clothes 5cb973.yaml | 45 + .../Card Fine Print 39452d.yaml | 45 + .../Card Fingerprint Kit b9bb2a.yaml | 45 + .../Card Finn's Trusty .38 848d9c.yaml | 45 + .../Card Fire Axe 9da37c.yaml | 45 + .../Card Fire Extinguisher (1) 8a4673.yaml | 45 + .../Card First Aid (3) bc80ab.yaml | 45 + .../Card First Aid 5cd622.yaml | 45 + .../Card First Watch 0bb3da.yaml | 45 + .../Card Fishing Net c7b748.yaml | 45 + .../Card Five of Pentacles (1) 46187b.yaml | 45 + .../Card Flamethrower (5) (Taboo) 8f170b.yaml | 45 + .../Card Flamethrower (5) cf4f15.yaml | 45 + .../Card Flare (1) 017821.yaml | 45 + .../Card Flashlight bb1cce.yaml | 45 + .../Card Flesh Ward 52c686.yaml | 45 + .../Card Followed 0cc3e7.yaml | 45 + .../Card Fool me once... (1) b6506d.yaml | 45 + .../Card Foolishness fa777f.yaml | 45 + .../Card Forbidden Knowledge 80acd2.yaml | 45 + .../Card Forbidden Tome (3) 2f4507.yaml | 45 + .../Card Forbidden Tome (3) f375bf.yaml | 45 + .../Card Forbidden Tome 0a4d22.yaml | 45 + .../Card Forewarned (1) c17f2c.yaml | 45 + .../Card Fortuitous Discovery dacbf0.yaml | 45 + .../Card Fortune or Fate (2) e674e8.yaml | 45 + .../Card Foul Odor bc4a74.yaml | 45 + .../Card Four of Cups (1) dd4e2a.yaml | 45 + .../Card Friendly Human 448d3a.yaml | 45 + .../Card Galvanize (1) 9e7f6a.yaml | 45 + .../Card Garrote Wire (2) b45c82.yaml | 45 + .../Card Gate Box b8c891.yaml | 45 + .../Card Gavriella Mizrah 2237f4.yaml | 45 + .../Card Get over here! (2) 415ca2.yaml | 45 + .../Card Get over here! 5b0f86.yaml | 45 + .../Card Ghastly Revelation b7c503.yaml | 45 + .../Card Gilded Volto d0e108.yaml | 45 + ...rd Glimpse the Unthinkable (1) 6e4d54.yaml | 45 + ...rd Glimpse the Unthinkable (5) 090fcf.yaml | 45 + .../Card Glory 273584.yaml | 45 + .../Card Granny Orne (3) 52a66f.yaml | 45 + .../Card Granny Orne 1cccfe.yaml | 45 + .../Card Gravedigger's Shovel (2) 96a440.yaml | 45 + .../Card Gravedigger's Shovel 3fe6de.yaml | 45 + .../Card Graveyard Ghouls 80b7c6.yaml | 45 + .../Card Green Man Medallion c729ab.yaml | 45 + .../Card Gregory Gry 90bf93.yaml | 45 + .../Card Grete Wagner (3) b39b78.yaml | 45 + .../Card Grete Wagner f6dfe5.yaml | 45 + .../Card Grimm's Fairy Tales 1d75d0.yaml | 45 + .../Card Grisly Totem (3) 1433eb.yaml | 45 + .../Card Grisly Totem (3) 5fae20.yaml | 45 + .../Card Grisly Totem a20887.yaml | 45 + .../Card Grit Your Teeth a92a90.yaml | 45 + .../Card Grotesque Statue (2) 6b2e97.yaml | 45 + .../Card Grotesque Statue (4) 07bc04.yaml | 45 + .../Card Grounded (1) 98fc57.yaml | 45 + .../Card Guard Dog 08bdf1.yaml | 45 + .../Card Guardian Angel 3c0249.yaml | 45 + ...d Guardian of the Crystallizer aec357.yaml | 45 + .../Card Guidance bbfe9b.yaml | 45 + .../Card Guiding Spirit (1) f91e14.yaml | 45 + .../Card Guts (2) 219c78.yaml | 45 + .../Card Guts 8f7289.yaml | 45 + .../Card Hair of the Dog 61c4c5.yaml | 45 + .../Card Hallowed Mirror 312d38.yaml | 45 + .../Card Hand of Fate 1ad931.yaml | 45 + .../Card Handcuffs 5f33be.yaml | 45 + .../Card Hard Knocks (2) 15643b.yaml | 45 + .../Card Hard Knocks 68744b.yaml | 45 + .../Card Haste (2) 1bd139.yaml | 45 + .../Card Hatchet Man 857238.yaml | 45 + .../Card Haunted 249d83.yaml | 45 + .../Card Hawk-Eye Folding Camera 5ada0a.yaml | 45 + .../Card Healing Words bba97a.yaml | 45 + .../Card Heirloom of Hyperborea 23c694.yaml | 45 + .../Card Heirloom of Hyperborea bf151d.yaml | 45 + .../Card Hemispheric Map (3) d2663c.yaml | 45 + .../Card Henry Wan 9df9df.yaml | 45 + .../Card Heroic Rescue (2) 93381d.yaml | 45 + .../Card Heroic Rescue bb0f6a.yaml | 45 + .../Card Hiding Spot dd130e.yaml | 45 + .../Card High Roller (2) ce1b89.yaml | 45 + ...d Higher Education (3) (Taboo) 833501.yaml | 45 + .../Card Higher Education (3) d48b25.yaml | 45 + .../Card Higher Education 8595fb.yaml | 45 + .../Card Hired Dogs 44bc00.yaml | 45 + .../Card Hired Muscle (1) cdd6aa.yaml | 45 + .../Card Holy Rosary fa1d67.yaml | 45 + .../Card Hoods 785f68.yaml | 45 + .../Card Hope 45c582.yaml | 45 + .../Card Hospital Debts 47d6c9.yaml | 45 + .../Card Hot Streak (2) f2508d.yaml | 45 + .../Card Hot Streak (4) 4eb231.yaml | 45 + .../Card Howl of Clyhf'ford 952924.yaml | 45 + .../Card Hyperawareness (2) 23c3e5.yaml | 45 + .../Card Hyperawareness e5dd39.yaml | 45 + .../Card Hypnotic Gaze (2) e2bc49.yaml | 45 + .../Card Hypnotic Gaze 8f3c8e.yaml | 45 + .../Card Hypnotic Therapy 7f1b48.yaml | 45 + .../Card Hypochondria 88ee43.yaml | 45 + .../Card I'll see you in hell! 84ba9d.yaml | 45 + .../Card I'm done runnin'! d8a324.yaml | 45 + .../Card I'm outta here! 62cf25.yaml | 45 + .../Card I've got a plan! (2) 344e90.yaml | 45 + .../Card I've got a plan! acd0da.yaml | 45 + .../Card I've had worse… (2) 76147b.yaml | 45 + .../Card I've had worse… (4) 3b6834.yaml | 45 + .../Card Ichtaca 29fc24.yaml | 45 + .../Card If it bleeds... acf2b0.yaml | 45 + .../Card Impromptu Barrier 9591ac.yaml | 45 + .../Card Improvisation 9aee7f.yaml | 45 + .../Card Improvisation 9ef062.yaml | 45 + .../Card Improvised Weapon 30f90b.yaml | 45 + .../Card In the Know (1) 7b42b6.yaml | 45 + .../Card In the Shadows 2561b9.yaml | 45 + .../Card Indebted b2ef43.yaml | 45 + .../Card Ineffable Truth (3) 943332.yaml | 45 + .../Card Ineffable Truth (5) f00301.yaml | 45 + .../Card Ineffable Truth c6caf6.yaml | 45 + .../Card Infighting (3) c803ba.yaml | 45 + .../Card Inquiring Mind 5c3aea.yaml | 45 + .../Card Inspiring Presence 80628f.yaml | 45 + .../Card Intel Report 5115d9.yaml | 45 + .../Card Internal Injury 4fb446.yaml | 45 + .../Card Interrogate c70ad8.yaml | 45 + .../Card Intrepid 99d061.yaml | 45 + .../Card Investments b65011.yaml | 45 + .../Card Jake Williams 7c958e.yaml | 45 + .../Card Jenny's Twin .45s d87128.yaml | 45 + .../Card Jerome Davids d99735.yaml | 45 + .../Card Jessica Hyde (1) b8380d.yaml | 45 + .../Card Jewel of Aureolus (3) 6bae15.yaml | 45 + .../Card Jim's Trumpet 03c6a7.yaml | 45 + .../Card Joey The Rat Vigil (3) 48c9ff.yaml | 45 + .../Card Joey The Rat Vigil b51688.yaml | 45 + .../Card John & Jessie Burke cfb393.yaml | 45 + .../Card Keen Eye (3) 2f9de4.yaml | 45 + .../Card Keen Eye 0dc75e.yaml | 45 + .../Card Keep Faith 8b46b2.yaml | 45 + .../Card Kerosene (1) 25ad44.yaml | 45 + .../Card Key of Ys (5) (Taboo) 244d61.yaml | 45 + .../Card Key of Ys (5) 1c98ff.yaml | 45 + .../Card Khopesh of the Abyss dc674e.yaml | 45 + .../Card Kleptomania 447a08.yaml | 45 + .../Card Knife 0ab3f1.yaml | 45 + ...ard Knowledge is Power (Taboo) eccb8a.yaml | 45 + .../Card Knowledge is Power 6de21b.yaml | 45 + .../Card Knuckleduster 5690d1.yaml | 45 + .../Card Kukri 756a35.yaml | 45 + .../Card Laboratory Assistant c18ebe.yaml | 45 + .../Card Lady Esprit 37a76b.yaml | 45 + .../Card Lantern (2) bda4fd.yaml | 45 + .../Card Lantern e66002.yaml | 45 + .../Card Last Chance 1fe462.yaml | 45 + .../Card Leadership (2) 80fafa.yaml | 45 + .../Card Leadership 83d8d7.yaml | 45 + .../Card Leather Coat (1) 5b1550.yaml | 45 + .../Card Leather Coat 593deb.yaml | 45 + .../Card Leather Jacket dfbc13.yaml | 45 + .../Card Leo De Luca (1) 27446e.yaml | 45 + .../Card Leo De Luca eaa415.yaml | 45 + .../Card Lesson Learned (2) 037b2e.yaml | 45 + .../Card Let God sort them out... d3dcf1.yaml | 45 + .../Card Let me handle this! 36c0cb.yaml | 45 + .../Card Library Docent (1) fab3a9.yaml | 45 + .../Card Lightning Gun (5) 2d362c.yaml | 45 + .../Card Liquid Courage (1) 5065a6.yaml | 45 + .../Card Liquid Courage c33a10.yaml | 45 + .../Card Lita Chantler 3c1944.yaml | 45 + .../Card Live and Learn 050ba1.yaml | 45 + .../Card Lockpicks (1) edd6c4.yaml | 45 + .../Card Lockpicks cc11e4.yaml | 45 + .../Card Lodge Debts acce72.yaml | 45 + .../Card Logical Reasoning (4) 1258c6.yaml | 45 + .../Card Logical Reasoning 812175.yaml | 45 + .../Card Lola Santiago (3) 8bec05.yaml | 45 + .../Card Lone Wolf dc3b07.yaml | 45 + .../Card Lonnie Ritter ad0ef0.yaml | 45 + .../Card Look what I found! (2) fd393b.yaml | 45 + .../Card Look what I found! 88d3c0.yaml | 45 + .../Card Lost Soul 4f903e.yaml | 45 + .../Card Lt. Wilson Stewart 4120f3.yaml | 45 + .../Card Lucid Dreaming (2) 122e98.yaml | 45 + .../Card Lucky Cigarette Case (3) 0feb74.yaml | 45 + .../Card Lucky Cigarette Case c607c5.yaml | 45 + .../Card Lucky Dice (2) 9dd911.yaml | 45 + .../Card Lucky! (2) 439af2.yaml | 45 + .../Card Lucky! (3) 04d33d.yaml | 45 + .../Card Lucky! ce0dd5.yaml | 45 + .../Card Lupara (3) a6af13.yaml | 45 + .../Card Lure (1) d88407.yaml | 45 + .../Card Lure (2) 1a90a4.yaml | 45 + .../Card M1918 BAR (4) b1ad65.yaml | 45 + .../Card Machete (Taboo) 6411d5.yaml | 45 + .../Card Machete 86ee68.yaml | 45 + .../Card Madame Labranche 1ee492.yaml | 45 + .../Card Magnifying Glass (1) 378e84.yaml | 45 + .../Card Magnifying Glass 8cc0a6.yaml | 45 + .../Card Mano a Mano (1) c55160.yaml | 45 + .../Card Mano a Mano (2) 14424c.yaml | 45 + .../Card Manual Dexterity (2) 982716.yaml | 45 + .../Card Manual Dexterity 679b13.yaml | 45 + .../Card Mariner's Compass 4e2d75.yaml | 45 + .../Card Marksmanship (1) 6a9021.yaml | 45 + .../Card Mauser C96 (2) 725690.yaml | 45 + .../Card Mauser C96 f32343.yaml | 45 + .../Card Meat Cleaver a57f19.yaml | 45 + .../Card Medical Texts ba16cb.yaml | 45 + .../Card Medico Della Peste 6179d5.yaml | 45 + .../Card Mi-Go Weapon 2fc31c.yaml | 45 + .../Card Mind Over Matter (2) 9b1c5b.yaml | 45 + .../Card Mind Wipe (1) 5d6e57.yaml | 45 + .../Card Mind Wipe (3) e72762.yaml | 45 + .../Card Mind over Matter 8cf335.yaml | 45 + .../Card Mind's Eye (2) ad58aa.yaml | 45 + ...atonic Archaeology Funding (4) 1a1b58.yaml | 45 + .../Card Miss Doyle (1) e1aedf.yaml | 45 + .../Card Mists of R'lyeh (2) 3d57b4.yaml | 45 + .../Card Mists of R'lyeh (4) 68fce2.yaml | 45 + .../Card Mists of R'lyeh 5558f1.yaml | 45 + .../Card Mitch Brown f91fd9.yaml | 45 + .../Card Mk 1 Grenades (4) 0ab574.yaml | 45 + .../Card Mob Enforcer b239d7.yaml | 45 + .../Card Molly Maxwell 692ced.yaml | 45 + .../Card Moment of Respite (3) 523b76.yaml | 45 + .../Card Momentum (1) d753d7.yaml | 45 + .../Card Money Talks 276477.yaml | 45 + .../Card Monster Slayer (5) e21854.yaml | 45 + .../Card Monster Slayer 63b3e5.yaml | 45 + .../Card Monstrous Transformation 96ae32.yaml | 45 + .../Card Moonlight Ritual 1cd2bd.yaml | 45 + .../Card Moonstone 0d006f.yaml | 45 + .../Card More Bark Than Bite 29bafb.yaml | 45 + .../Card Moxie (1) 5fe780.yaml | 45 + .../Card Mr. Rook (Taboo) a8afba.yaml | 45 + .../Card Mr. Rook 1339b0.yaml | 45 + .../Card Mysteries Remain 274daa.yaml | 45 + .../Card Mysterious Raven 59e40d.yaml | 45 + .../Card Mystifying Song 3b8cb7.yaml | 45 + .../Card Naomi O'Bannion 7f7ecc.yaml | 45 + .../Card Narcolepsy 57e648.yaml | 45 + .../Card Narrow Escape f6ff32.yaml | 45 + .../Card Nautical Prowess 9d6e9a.yaml | 45 + .../Card Neither Rain nor Snow 6da7c4.yaml | 45 + .../Card Newspaper (2) 9bcdee.yaml | 45 + .../Card Newspaper ee20c9.yaml | 45 + .../Card Nightmare Bauble (3) d6f6f1.yaml | 45 + .../Card Nihilism fc4168.yaml | 45 + .../Card Nimble b8843c.yaml | 45 + ...Card No Sense of Space or Time 1e6cae.yaml | 45 + .../Card No Stone Unturned (5) 1f3f16.yaml | 45 + .../Card No Stone Unturned 44cf4a.yaml | 45 + .../Card Not without a fight! d1d7fa.yaml | 45 + .../Card Nothing Left to Lose (3) f0389b.yaml | 45 + .../Card Obfuscation 5ec6d0.yaml | 45 + .../Card Obscure Studies c5d8a9.yaml | 45 + .../Card Obsessive a2e7d7.yaml | 45 + .../Card Occult Evidence 3586e6.yaml | 45 + .../Card Occult Invocation 010509.yaml | 45 + .../Card Occult Lexicon 5d6728.yaml | 45 + .../Card Occult Scraps 6aea76.yaml | 45 + .../Card Offer You Cannot Refuse e27c93.yaml | 45 + .../Card Old Book of Lore (3) 8a0060.yaml | 45 + .../Card Old Book of Lore 063fd8.yaml | 45 + .../Card Old Hunting Rifle (3) 44a37f.yaml | 45 + .../Card Old Keyring 5888da.yaml | 45 + .../Card Old Shoe 87f6b9.yaml | 45 + .../Card Olive McBride 9683d0.yaml | 45 + .../Card On Your Own (3) 2ebdf1.yaml | 45 + .../Card On Your Own (3) b0c61c.yaml | 45 + .../Card On the Hunt a13ca4.yaml | 45 + .../Card On the Lam f7095f.yaml | 45 + .../Card One-Two Punch (5) 8ffa44.yaml | 45 + .../Card One-Two Punch 22bb1e.yaml | 45 + .../Card Oops! (2) 70772b.yaml | 45 + .../Card Oops! 59d89b.yaml | 45 + .../Card Open Gate a33acd.yaml | 45 + .../Card Opportunist (2) 63f145.yaml | 45 + .../Card Opportunist a88392.yaml | 45 + .../Card Ornate Bow (3) 2acced.yaml | 45 + .../Card Otherworld Codex (2) df0e22.yaml | 45 + .../Card Otherworldly Compass (2) 19ab7c.yaml | 45 + .../Card Out of Body Experience d64b8f.yaml | 45 + .../Card Out of Doggie Treats 197242.yaml | 45 + .../Card Overpower (2) 017e1f.yaml | 45 + .../Card Overpower 5ab9f4.yaml | 45 + .../Card Overzealous 88a9b3.yaml | 45 + .../Card Painkillers 0c859f.yaml | 45 + .../Card Pantalone 7f1927.yaml | 45 + .../Card Paradoxical Covenant (2) 541ee9.yaml | 45 + .../Card Parallel Fates 47bdba.yaml | 45 + .../Card Paranoia c17498.yaml | 45 + .../Card Pathfinder (1) (Taboo) ecbea8.yaml | 45 + .../Card Pathfinder (1) 7f99cc.yaml | 45 + .../Card Patrice's Violin ea0007.yaml | 45 + .../Card Pay Day (1) 9f0b34.yaml | 45 + .../Card Pendant of the Queen 9b0dcf.yaml | 45 + .../Card Penny White 73bccf.yaml | 45 + .../Card Perception (2) 96b5ed.yaml | 45 + .../Card Perception c6ac19.yaml | 45 + .../Card Perseverance 0a390e.yaml | 45 + .../Card Persuasion 1b0235.yaml | 45 + .../Card Pet Oozeling 26398a.yaml | 45 + .../Card Peter Sylvestre (2) e1e098.yaml | 45 + .../Card Peter Sylvestre ffdeb5.yaml | 45 + .../Card Physical Training (2) d708d9.yaml | 45 + .../Card Physical Training (4) ab51ce.yaml | 45 + .../Card Physical Training 1165db.yaml | 45 + .../Card Pickpocketing (2) 2f4db2.yaml | 45 + .../Card Pickpocketing da7c01.yaml | 45 + .../Card Pilfer (3) e503ce.yaml | 45 + .../Card Pilfer cc9563.yaml | 45 + .../Card Plan of Action 96fd5d.yaml | 45 + .../Card Plucky (1) 86b9c5.yaml | 45 + .../Card Pnakotic Manuscripts (5) 344d98.yaml | 45 + .../Card Pocket Portal 1ab785.yaml | 45 + .../Card Poisoned 819f52.yaml | 45 + .../Card Police Badge (2) da46e0.yaml | 45 + .../Card Powder of Ibn Ghazi f96ed0.yaml | 45 + .../Card Practice Makes Perfect 1ac667.yaml | 45 + .../Card Predestined ec7702.yaml | 45 + .../Card Premonition e470cd.yaml | 45 + .../Card Prepared for the Worst 831b6b.yaml | 45 + ...Card Preposterous Sketches (2) 5e32a5.yaml | 45 + .../Card Preposterous Sketches 60b353.yaml | 45 + .../Card Prescient 7e7873.yaml | 45 + .../Card Priest of Two Faiths (1) 48e4a3.yaml | 45 + .../Card Professor Warren Rice 42806b.yaml | 45 + .../Card Promise of Power d8b64b.yaml | 45 + .../Card Prophesy 493b03.yaml | 45 + ...ard Protective Incantation (1) 599209.yaml | 45 + .../Card Psychosis d83baf.yaml | 45 + .../Card Puzzle Box 44334c.yaml | 45 + .../Card Quantum Flux edd34a.yaml | 45 + .../Card Quick Learner (4) 3bbc0b.yaml | 45 + .../Card Quick Study (2) 092e92.yaml | 45 + .../Card Quick Thinking (Taboo) 308967.yaml | 45 + .../Card Quick Thinking 99989c.yaml | 45 + .../Card Rabbit's Foot (3) 3f91af.yaml | 45 + .../Card Rabbit's Foot f34090.yaml | 45 + .../Card Randall Cho 1bfb78.yaml | 45 + .../Card Randolph Carter b04c8e.yaml | 45 + .../Card Randolph Carter d253a6.yaml | 45 + .../Card Rational Thought 1c7a00.yaml | 45 + .../Card Read the Signs 75eca5.yaml | 45 + .../Card Recall the Future (2) a06aa7.yaml | 45 + .../Card Recharge (2) e27b3c.yaml | 45 + .../Card Recharge (4) 591789.yaml | 45 + .../Card Reckless Assault 3ff641.yaml | 45 + .../Card Reckless c45e67.yaml | 45 + .../Card Relentless af3efd.yaml | 45 + .../Card Reliable (1) 102fad.yaml | 45 + .../Card Relic Hunter (3) 3c959c.yaml | 45 + .../Card Relic of Ages 35bc58.yaml | 45 + .../Card Relic of Ages 7667ef.yaml | 45 + .../Card Relic of Ages 87718c.yaml | 45 + .../Card Relic of Ages e27a30.yaml | 45 + .../Card Research Librarian 8f91ce.yaml | 45 + .../Card Resourceful 334f03.yaml | 45 + .../Card Rex's Curse 033a35.yaml | 45 + .../Card Righteous Hunt (1) 491c09.yaml | 45 + .../Card Riot Whistle 55fc3d.yaml | 45 + .../Card Rise to the Occasion (3) bb501b.yaml | 45 + .../Card Rise to the Occasion 358387.yaml | 45 + .../Card Rite of Sanctification 88865b.yaml | 45 + .../Card Rite of Seeking (2) 4f2668.yaml | 45 + .../Card Rite of Seeking (4) 194adb.yaml | 45 + .../Card Rite of Seeking 29b842.yaml | 45 + .../Card Ritual Candles 0a4db3.yaml | 45 + ...ard Robes of Endless Night (2) ef43db.yaml | 45 + .../Card Robes of Endless Night d9292f.yaml | 45 + .../Card Roland's .38 Special 49a91e.yaml | 45 + .../Card Rookie Mistake e567ff.yaml | 45 + .../Card Run For Your Life 0f32e8.yaml | 45 + .../Card Sacred Covenant (2) 87226d.yaml | 45 + .../Card Sacrifice (1) f2877e.yaml | 45 + .../Card Sacrificial Beast 46812e.yaml | 45 + .../Card Safeguard (2) 7dc42a.yaml | 45 + .../Card Safeguard 8d6ae6.yaml | 45 + .../Card Sawed-Off Shotgun (5) 4f5f0f.yaml | 45 + .../Card Say Your Prayers 5c3dd0.yaml | 45 + .../Card Scavenging (2) ff4aea.yaml | 45 + .../Card Scavenging 1b76c9.yaml | 45 + .../Card Scene of the Crime ab37af.yaml | 45 + .../Card Scientific Theory (1) 3a0df6.yaml | 45 + .../Card Scrapper (3) (Taboo) fcffa3.yaml | 45 + .../Card Scrapper (3) dffe4a.yaml | 45 + .../Card Scrapper c8505c.yaml | 45 + .../Card Scroll of Prophecies 0d926f.yaml | 45 + ... Scroll of Secrets (3) (Taboo) 5839e4.yaml | 45 + ... Scroll of Secrets (3) (Taboo) a2136a.yaml | 45 + .../Card Scroll of Secrets (3) 0b12ac.yaml | 45 + .../Card Scroll of Secrets (3) 194d88.yaml | 45 + ...Card Scroll of Secrets (Taboo) 19b705.yaml | 45 + .../Card Scroll of Secrets 230835.yaml | 45 + .../Card Scrounge for Supplies 7651f3.yaml | 45 + .../Card Scrying (3) e58d2a.yaml | 45 + .../Card Scrying 8a927c.yaml | 45 + .../Card Scrying Mirror 6446d1.yaml | 45 + .../Card Sea Change Harpoon 4e405d.yaml | 45 + ...ard Seal of the Elder Sign (5) 91e890.yaml | 45 + ...d Seal of the Seventh Sign (5) 05da68.yaml | 45 + .../Card Search for the Truth 4156cf.yaml | 45 + .../Card Searching for Izzie cd94e3.yaml | 45 + .../Card Second Wind baef55.yaml | 45 + .../Card Seeking Answers (2) c1365d.yaml | 45 + .../Card Seeking Answers f69e10.yaml | 45 + ...rd Segment of Onyx (1) (Taboo) 922d4c.yaml | 45 + .../Card Segment of Onyx (1) ff9f23.yaml | 45 + .../Card Self-Centered eff3c8.yaml | 45 + .../Card Self-Destructive 2204cc.yaml | 45 + .../Card Self-Sacrifice 5e808d.yaml | 45 + .../Card Sell Your Soul 180b5b.yaml | 45 + .../Card Sergeant Monroe 5630c2.yaml | 45 + .../Card Serpents of Yig 14c396.yaml | 45 + .../Card Shadow Agents 9be144.yaml | 45 + .../Card Shards of the Void (3) b94d12.yaml | 45 + .../Card Sharp Vision (1) 4d9a97.yaml | 45 + .../Card Sharpshooter (3) 7f27d6.yaml | 45 + .../Card Shell Shock bcf406.yaml | 45 + ...Card Shining Trapezohedron (4) b4b991.yaml | 45 + .../Card Shocking Discovery f4dd3d.yaml | 45 + .../Card Shortcut (2) 9bd7cf.yaml | 45 + .../Card Shortcut d4fd4a.yaml | 45 + .../Card Shotgun (4) c92ea3.yaml | 45 + .../Card Showmanship ad63bc.yaml | 45 + .../Card Shrewd Analysis 658d38.yaml | 45 + .../Card Shrivelling (3) b3ce16.yaml | 45 + .../Card Shrivelling (5) 7a33b2.yaml | 45 + .../Card Shrivelling 914053.yaml | 45 + .../Card Shroud of Shadows a565d5.yaml | 45 + .../Card Sign Magick 05d263.yaml | 45 + .../Card Silas's Net 4f11a2.yaml | 45 + .../Card Silver Twilight Acolyte 16a89d.yaml | 45 + .../Card Siren Call b9fbff.yaml | 45 + .../Card Sixth Sense (4) 060943.yaml | 45 + .../Card Sixth Sense 6eceef.yaml | 45 + .../Card Sleight of Hand (Taboo) 5a51d1.yaml | 45 + .../Card Sleight of Hand 819aee.yaml | 45 + .../Card Slip Away (2) 4a45c6.yaml | 45 + .../Card Slip Away cf1d4e.yaml | 45 + .../Card Small Favor bf5a5f.yaml | 45 + .../Card Smite the Wicked e68658.yaml | 45 + .../Card Smoking Pipe 603e29.yaml | 45 + .../Card Smuggled Goods 1f3880.yaml | 45 + .../Card Snare Trap (2) f66dd9.yaml | 45 + .../Card Sneak Attack (2) 5f19e0.yaml | 45 + .../Card Sneak Attack b18b33.yaml | 45 + .../Card Sneak By d099f4.yaml | 45 + .../Card Solemn Vow ef7c11.yaml | 45 + ...d Something Worth Fighting For a3f105.yaml | 45 + .../Card Song of the Dead (2) 2ae3ce.yaml | 45 + .../Card Soothing Melody 53f076.yaml | 45 + .../Card Sophie f8c873.yaml | 45 + .../Card Spectral Razor 8e8a14.yaml | 45 + .../Card Spectral Web 863f1a.yaml | 45 + .../Card Spiked Collar 6012db.yaml | 45 + .../Card Spirit Athame (1) 90a106.yaml | 45 + .../Card Spirit-Speaker a33470.yaml | 45 + .../Card Spiritual Resolve (5) 26922c.yaml | 45 + .../Card Split the Angle 67e006.yaml | 45 + ... Springfield M1903 (4) (Taboo) a7da13.yaml | 45 + .../Card Springfield M1903 (4) a7944d.yaml | 45 + .../Card St. Hubert's Key 423d46.yaml | 45 + .../Card Stand Together (3) cd7b97.yaml | 45 + .../Card Stand Together 7ec473.yaml | 45 + .../Card Stargazing (1) 968a26.yaml | 45 + .../Card Stars of Hyades 1890d0.yaml | 45 + .../Card Steadfast 4e1d91.yaml | 45 + .../Card Stealth (3) 26a3bf.yaml | 45 + .../Card Stealth ddee79.yaml | 45 + .../Card Stick to the Plan (3) 82d62c.yaml | 45 + .../Card Stirring Up Trouble (1) e99f0d.yaml | 45 + .../Card Storm of Spirits (3) 1e9213.yaml | 45 + .../Card Storm of Spirits 9c922f.yaml | 45 + .../Card Strange Solution (4) 4874bc.yaml | 45 + .../Card Strange Solution (4) 9afe23.yaml | 45 + .../Card Strange Solution (4) d96e4b.yaml | 45 + .../Card Strange Solution (4) fa61ba.yaml | 45 + .../Card Strange Solution 565b6b.yaml | 45 + .../Card Stray Cat f474b1.yaml | 45 + .../Card Streetwise (3) (Taboo) 88a481.yaml | 45 + .../Card Streetwise (3) d7dbac.yaml | 45 + .../Card Streetwise a973aa.yaml | 45 + .../Card Stroke of Luck (2) 06228f.yaml | 45 + .../Card Stubborn Detective 4ea68b.yaml | 45 + .../Card Studious (3) 4ea716.yaml | 45 + .../Card Stunning Blow 58c435.yaml | 45 + .../Card Suggestion (1) 0ec9bf.yaml | 45 + .../Card Suggestion (4) e7f37b.yaml | 45 + .../Card Summoned Hound (1) ab4fb3.yaml | 45 + .../Card Summoned Nightgaunt cf96b9.yaml | 45 + .../Card Sure Gamble (3) 308be1.yaml | 45 + .../Card Surprising Find (1) ff59dd.yaml | 45 + .../Card Survival Instinct (2) be4abe.yaml | 45 + .../Card Survival Instinct 078efb.yaml | 45 + .../Card Survival Knife (2) c1d796.yaml | 45 + .../Card Survival Knife 4d971e.yaml | 45 + .../Card Swift Reflexes c2d211.yaml | 45 + .../Card Swift Reload (2) 2cfa4f.yaml | 45 + .../Card Switchblade (2) (Taboo) 842d41.yaml | 45 + .../Card Switchblade (2) 2fba3b.yaml | 45 + .../Card Switchblade 213853.yaml | 45 + .../Card Sword Cane 9c32e2.yaml | 45 + .../Card Take Heart cc6e4d.yaml | 45 + .../Card Take the Initiative 50fb37.yaml | 45 + .../Card Take the Wheel ed4256.yaml | 45 + .../Card Taunt (2) 9956d5.yaml | 45 + .../Card Taunt (3) 85fe46.yaml | 45 + .../Card Taunt d5cac6.yaml | 45 + .../Card Teachings of the Order 90fdb0.yaml | 45 + .../Card Teamwork eab2ed.yaml | 45 + .../Card Telescopic Sight (3) db2c81.yaml | 45 + .../Card Tempt Fate 33f906.yaml | 45 + .../Card Tennessee Sour Mash (3) b5e5f1.yaml | 45 + .../Card Tennessee Sour Mash (3) cbe256.yaml | 45 + .../Card Tennessee Sour Mash be33f5.yaml | 45 + .../Card Terrible Secret 06322f.yaml | 45 + .../Card Tetsuo Mori 08e5a6.yaml | 45 + .../Card The 13th Vision c1ce8e.yaml | 45 + .../Card The Bell Tolls 6cbc01.yaml | 45 + .../Card The Black Book ae3775.yaml | 45 + .../Card The Black Cat (5) 16e57b.yaml | 45 + .../Card The Chthonian Stone (3) 698fcc.yaml | 45 + .../Card The Chthonian Stone 6527a4.yaml | 45 + .../Card The Codex of Ages 0e4a82.yaml | 45 + .../Card The Council's Coffer (2) 0e39c2.yaml | 45 + .../Card The Dirge of Reason fe68c6.yaml | 45 + .../Card The Eye of Truth (5) d6085d.yaml | 45 + ...Card The Gold Pocket Watch (4) 62d930.yaml | 45 + .../Card The Home Front b80459.yaml | 45 + .../Card The Hungering Blade (1) bbd11b.yaml | 45 + .../Card The King in Yellow 016b72.yaml | 45 + ...ard The Man in the Pallid Mask 6720ef.yaml | 45 + .../Card The Moon • XVIII (1) e80bd8.yaml | 45 + ...d The Necronomicon (5) (Taboo) 9fa2a5.yaml | 45 + .../Card The Necronomicon (5) 96ba38.yaml | 45 + .../Card The Necronomicon 6b2550.yaml | 45 + .../Card The Necronomicon d45f10.yaml | 45 + .../Card The Painted World 170538.yaml | 45 + .../Card The Painted World dfd48b.yaml | 45 + .../Card The Price of Failure dc5b38.yaml | 45 + .../Card The Red-Gloved Man (5) ad18a6.yaml | 45 + .../Card The Silver Key 61fd07.yaml | 45 + .../Card The Skeleton Key (2) f8dc01.yaml | 45 + .../Card The Stars Are Right 600a3c.yaml | 45 + .../Card The Tattered Cloak 5d30a1.yaml | 45 + .../Card The Thing That Follows da227d.yaml | 45 + .../Card The Tower • XVI d5c93d.yaml | 45 + .../Card The Truth Beckons ca1b5c.yaml | 45 + .../Card Thermos 5b14dc.yaml | 45 + .../Card Think on Your Feet (2) 3e0653.yaml | 45 + .../Card Think on Your Feet 6fec31.yaml | 45 + .../Card Thomas Dawson 1f7e6e.yaml | 45 + .../Card Three Aces (1) 30062e.yaml | 45 + .../Card Thrice-Damned Curiosity 3eef18.yaml | 45 + .../Card Through the Gates fd9c56.yaml | 45 + .../Card Tides of Fate 823e49.yaml | 45 + .../Card Time Warp (2) 4224db.yaml | 45 + .../Card Timeworn Brand (5) d3e55b.yaml | 45 + .../Card To Fight the Black Wind 00b6c3.yaml | 45 + .../Card Token of Faith 2ea0d0.yaml | 45 + .../Card Tommy Malloy c3a014.yaml | 45 + .../Card Tony's .38 Long Colt 1186a1.yaml | 45 + .../Card Tony's Quarry d6f8d1.yaml | 45 + .../Card Tooth of Eztli c1a687.yaml | 45 + .../Card Torrent of Power 79287f.yaml | 45 + .../Card Track Shoes 6fa7fa.yaml | 45 + .../Card Treasure Hunter (1) 18927e.yaml | 45 + .../Card Trench Coat ba560e.yaml | 45 + .../Card Trench Knife 0d4eb9.yaml | 45 + .../Card Trial by Fire 869d4c.yaml | 45 + .../Card True Grit e25dc1.yaml | 45 + .../Card True Survivor (3) 8837ff.yaml | 45 + .../Card True Understanding 4167c0.yaml | 45 + .../Card Trusted 1bc300.yaml | 45 + .../Card Truth from Fiction (2) 45cd73.yaml | 45 + .../Card Truth from Fiction d64c99.yaml | 45 + .../Card Try and Try Again (1) 3dc82f.yaml | 45 + .../Card Try and Try Again (3) f1b0f9.yaml | 45 + ...Card Twila Katherine Price (3) 9f76ec.yaml | 45 + .../Card Twilight Blade 223ba3.yaml | 45 + .../Card Unbound Beast 86cf9c.yaml | 45 + .../Card Uncage the Soul 45d2d2.yaml | 45 + .../Card Under Surveillance (1) cc8321.yaml | 45 + .../Card Unearth the Ancients f763e8.yaml | 45 + .../Card Unexpected Courage (2) 2f2190.yaml | 45 + .../Card Unexpected Courage acb83a.yaml | 45 + .../Card Universal Solvent 2f1166.yaml | 45 + .../Card Unsolved Case 22d886.yaml | 45 + ...Unspeakable Oath (Bloodthirst) a5be8b.yaml | 45 + ...d Unspeakable Oath (Cowardice) ea0fa1.yaml | 45 + ...d Unspeakable Oath (Curiosity) f6aba5.yaml | 45 + .../Card Until the End of Time 41a9ec.yaml | 45 + .../Card Valentino Rivas 726d1d.yaml | 45 + .../Card Vantage Point 2f9ab1.yaml | 45 + .../Card Vault of Knowledge 2fdcc9.yaml | 45 + .../Card Veda Whitsley a0c2da.yaml | 45 + .../Card Vengeful Hound ce3a1a.yaml | 45 + .../Card Venturer 0e2987.yaml | 45 + .../Card Versatile (2) eca1c8.yaml | 45 + .../Card Vicious Blow (2) d2e026.yaml | 45 + .../Card Vicious Blow 889121.yaml | 45 + .../Card Voice of Ra 0988b2.yaml | 45 + .../Card Voice of the Messenger f93ea8.yaml | 45 + .../Card Ward of Protection (2) 4d74f6.yaml | 45 + .../Card Ward of Protection (5) 7bc995.yaml | 45 + .../Card Ward of Protection 6656ad.yaml | 45 + .../Card Ward of Radiance 69116c.yaml | 45 + .../Card Warning Shot ec38db.yaml | 45 + .../Card Watch this! c40cb4.yaml | 45 + ...Watcher from Another Dimension 6945f7.yaml | 45 + .../Card Waylay da207b.yaml | 45 + .../Card Well Connected 66b7d5.yaml | 45 + .../Card Well Prepared (2) eea4ef.yaml | 45 + .../Card Well-Maintained (1) e454c3.yaml | 45 + .../Card Wendy's Amulet a56ffe.yaml | 45 + .../Card What Have You Done 2c76d9.yaml | 45 + .../Card Whispers from the Deep dd4a25.yaml | 45 + .../Card Whitton Greene (2) 854c79.yaml | 45 + .../Card Whitton Greene 3c5099.yaml | 45 + .../Card Will to Survive (3) 0027f2.yaml | 45 + .../Card Will to Survive dc4a2c.yaml | 45 + .../Card Winging It aa3984.yaml | 45 + .../Card Wish Eater 464ca1.yaml | 45 + .../Card Wither (4) f57a6f.yaml | 45 + .../Card Wither d946d9.yaml | 45 + .../Card Word of Command (2) 26853e.yaml | 45 + .../Card Working a Hunch eb6165.yaml | 45 + .../Card Wracked by Nightmares 97781f.yaml | 45 + .../Card Yaotl (1) a7358f.yaml | 45 + .../Card Yaztaroth 313167.yaml | 45 + .../Card You handle this one! dcdcea.yaml | 45 + .../Card You owe me one! d27d12.yaml | 45 + .../Card Your Worst Nightmare 406ab2.yaml | 45 + .../Card Zeal 695bb7.yaml | 45 + .../Card Zebulon Whateley 6714b2.yaml | 45 + .../Card Zoey's Cross 66d810.yaml | 45 + ...ardCustom Ancient Covenant (2) 436401.yaml | 45 + ...ustom Blasphemous Covenant (2) 10b087.yaml | 45 + .../CardCustom Daisy's Tote Bag cf41be.yaml | 45 + .../CardCustom Eldritch Sophist f6b1b6.yaml | 45 + ...CardCustom Enchanted Armor (2) dfe1ee.yaml | 45 + ...ardCustom Eye of the Djinn (2) d3f951.yaml | 45 + ...ardCustom Gaze of Ouraxsh (2) 34e9f8.yaml} | 14 +- .../CardCustom Hospital Debts bd323d.yaml | 45 + ...CardCustom Liber Omnium Finium 242a11.yaml | 45 + .../CardCustom Lucky Penny (2) 8d45ac.yaml | 45 + ...Custom Manipulate Destiny (2) bcc255.yaml} | 14 +- .../CardCustom On the Lam 9c4900.yaml | 45 + .../CardCustom Radiant Smite (1) 9103a5.yaml} | 14 +- .../CardCustom Ruth Westmacott 782e0a.yaml | 45 + .../CardCustom Ríastrad (1) d89190.yaml | 45 + .../CardCustom Signum Crucis (2) c21c1f.yaml | 45 + .../CardCustom Skeptic (1) d2cd42.yaml | 45 + .../CardCustom The Necronomicon 5b2e10.yaml | 45 + ...stom Third Time's a Charm (2) 27ff2d.yaml} | 14 +- .../CardCustom Tristan Botley (2) 039e47.yaml | 45 + .../Bag Random Basic Weaknesses 770c4e.yaml | 85 + .../Card Accursed Follower 483f9a.yaml | 45 + .../Card Accursed Follower 6d8407.yaml | 45 + .../Card Amnesia 2210c1.yaml | 45 + .../Card Amnesia 8598a4.yaml | 45 + .../Card Atychiphobia a3bc7a.yaml | 45 + .../Card Chronophobia 016e3c.yaml | 45 + .../Card Chronophobia eeb330.yaml | 45 + .../Card Dark Pact dd3d09.yaml | 45 + .../Card Day of Reckoning ffb62c.yaml | 45 + .../Card Dendromorphosis 121b2d.yaml | 45 + .../Card Doomed ba2ae1.yaml | 45 + .../Card Drawing the Sign 3b3c0a.yaml | 45 + .../Card Dread Curse 96eb52.yaml | 45 + .../Card Dread Curse 993595.yaml | 45 + .../Card Haunted 249d83.yaml | 45 + .../Card Hypochondria 88ee43.yaml | 45 + .../Card Indebted 8df93a.yaml | 45 + .../Card Indebted b2ef43.yaml | 45 + .../Card Internal Injury 4fb446.yaml | 45 + .../Card Internal Injury d28be6.yaml | 45 + .../Card Kleptomania 447a08.yaml | 45 + .../Card Mob Enforcer b239d7.yaml | 45 + .../Card Narcolepsy 57e648.yaml | 45 + .../Card Nihilism fc4168.yaml | 45 + .../Card Obsessive a2e7d7.yaml | 45 + .../Card Offer You Cannot Refuse e27c93.yaml | 45 + .../Card Overzealous 29766c.yaml | 45 + .../Card Overzealous 88a9b3.yaml | 45 + .../Card Paranoia 3575a3.yaml | 45 + .../Card Paranoia c17498.yaml | 45 + .../Card Psychosis d83baf.yaml | 45 + .../Card Reckless c45e67.yaml | 45 + .../Card Self-Centered eff3c8.yaml | 45 + .../Card Self-Destructive 2204cc.yaml | 45 + .../Card Silver Twilight Acolyte 16a89d.yaml | 45 + .../Card Stubborn Detective 4ea68b.yaml | 45 + .../Card The 13th Vision cebf6a.yaml | 45 + .../Card The 13th Vision e42f12.yaml | 45 + .../Card The Thing That Follows da227d.yaml | 45 + .../Card The Tower • XVI cc65f3.yaml | 45 + .../Card The Tower • XVI d5c93d.yaml | 45 + .../Card Through the Gates 31f72f.yaml | 45 + .../Card Through the Gates fd9c56.yaml | 45 + ...Unspeakable Oath (Bloodthirst) a5be8b.yaml | 45 + ...d Unspeakable Oath (Cowardice) ea0fa1.yaml | 45 + ...d Unspeakable Oath (Curiosity) f6aba5.yaml | 45 + .../Card Your Worst Nightmare 406ab2.yaml | 45 + unpacked/Custom_Model 032300.ttslua | 224 +- unpacked/Custom_Model 0a3b03.yaml | 6 +- unpacked/Custom_Model 0c05e4.yaml | 6 +- unpacked/Custom_Model 1769ed.ttslua | 224 +- unpacked/Custom_Model 37be78.ttslua | 224 +- unpacked/Custom_Model b486bd.yaml | 6 +- unpacked/Custom_Model d86b7c.ttslua | 224 +- ...tom_Model Custom Data Helper c0b834.ttslua | 70 +- unpacked/Custom_Model Neutral 5954d0.yaml | 2 +- unpacked/Custom_Model Neutral b79001.yaml | 2 +- unpacked/Custom_Model Neutral eec4ca.yaml | 2 +- ...ustom_Model_Bag Arkhamdb bag b85d6d.ttslua | 36 - .../Deck 4141fb.yaml | 46700 ---------------- .../Deck All Weaknesses dd549a.yaml | 2288 - ...Model_Bag Artifact Expansion b43c9c.ttslua | 503 + ...m_Model_Bag Artifact Expansion b43c9c.yaml | 119 + .../Bag Artifact Deck Setup 4285a6.ttslua} | 546 +- .../Bag Artifact Deck Setup 4285a6.yaml | 44 + .../CardCustom Undead Servant 73a303.yaml | 45 + .../CardCustom Venture Too Deep 371b1d.yaml | 45 + .../CardCustom Venture Too Deep 52b042.yaml | 45 + .../Deck Artifact Deck 485770.yaml | 3332 ++ ...fact Expansion Custom Upgrades f5bbf3.yaml | 362 + .../CardCustom Agatha Crane Mini 5f4b38.yaml | 45 + .../CardCustom Agatha Crane b564f3.yaml | 45 + .../CardCustom Daniela Reyes Mini 750b6f.yaml | 45 + .../CardCustom Daniela Reyes a8246c.yaml | 45 + ...ardCustom Darrell Simmons Mini 6d9f16.yaml | 45 + .../CardCustom Darrell Simmons dced09.yaml | 45 + .../CardCustom Kate Winthrop 13a465.yaml | 45 + .../CardCustom Kate Winthrop Mini f1896b.yaml | 45 + .../CardCustom Monterey Jack Mini 0e3906.yaml | 45 + .../CardCustom Monterey Jack b77c53.yaml | 45 + ...stom_Model Survivor turn token 41bfc7.yaml | 43 + ...tom_Model Survivor turn token 4ad11b.yaml} | 31 +- ...stom_Model Survivor turn token 6330da.yaml | 43 + ...stom_Model Survivor turn token 9e80b9.yaml | 43 + ...stom_Model Survivor turn token bde4a6.yaml | 43 + ...stom_Model Survivor turn token d6fdbf.yaml | 43 + ...stom_Model Survivor turn token d9fb86.yaml | 43 + ...stom_Model Survivor turn token de216f.yaml | 43 + ...stom_Model Survivor turn token e04b48.yaml | 43 + .../Custom_Model Turn token 0de2c4.yaml | 43 + .../Custom_Model Turn token 226716.yaml | 43 + .../Custom_Model Turn token 307044.yaml | 43 + .../Custom_Model Turn token 3ddfeb.yaml | 43 + .../Custom_Model Turn token 543164.yaml | 43 + .../Custom_Model Turn token 779aa6.yaml | 43 + .../Custom_Model_Bag Agatha ced1e0.ttslua | 29 + .../Custom_Model_Bag Agatha ced1e0.yaml | 51 + .../Deck Agatha Signatures b0efc9.yaml | 200 + ...ck Agatha Starter Bonded Cards d25df2.yaml | 184 + .../Deck Agatha Starter Deck 22456c.yaml | 1530 + .../Custom_Model_Bag Daniela b9fc9d.ttslua | 29 + .../Custom_Model_Bag Daniela b9fc9d.yaml | 53 + .../Deck Custom Tool Upgrades ec9fd8.yaml | 362 + ...eck Daniela Rogue Starter Deck 91ab4d.yaml | 1554 + .../Deck Daniela Signatures 22fe8e.yaml | 254 + ...k Daniela Starter Bonded Cards d43832.yaml | 184 + ... Daniela Survivor Starter Deck aff35f.yaml | 1538 + .../Custom_Model_Bag Darrell c3e12f.ttslua | 29 + .../Custom_Model_Bag Darrell c3e12f.yaml | 51 + ...rdCustom A Glimmer of Hope (3) d01579.yaml | 45 + .../Deck Darrell Signatures af72fc.yaml | 200 + .../Deck Darrell Starter Deck dc7a22.yaml | 1514 + .../Custom_Model_Bag Jack 2bff9c.ttslua | 29 + .../Custom_Model_Bag Jack 2bff9c.yaml | 51 + .../Deck Monterey Signatures c34beb.yaml | 200 + ... Monterey Starter Bonded Cards 1d867d.yaml | 184 + ...Monterey Survivor Starter Deck 775496.yaml | 1530 + .../Custom_Model_Bag Kate e3a45e.ttslua | 29 + .../Custom_Model_Bag Kate e3a45e.yaml | 51 + .../Card Essence of the Dream 6ad46b.yaml | 45 + .../Deck Kate Signatures 1cf901.yaml | 254 + .../Deck Kate Starter Deck d965e1.yaml | 1538 + ...l_Infinite_Bag Evidence Tokens 3068ef.yaml | 98 + ... Artifact Expansion User Guide 871d2f.yaml | 182 + .../Custom_Model_Bag Bless tokens afa06b.yaml | 8 +- .../Custom_Model_Bag Chaos Bag fea079.ttslua | 8 +- .../Custom_Tile.yaml | 6 +- ...del_Bag Clue Counter Swapper d919d6.ttslua | 544 +- .../Custom_Token Doom counter 19768a.ttslua | 262 +- .../Custom_Token Resources 3f22e5.ttslua | 260 +- .../Custom_Token Resources 4111de.ttslua | 260 +- .../Custom_Token Resources 891403.ttslua | 260 +- .../Custom_Token Resources db85d6.ttslua | 260 +- ...ommunity-Created Investigators ed4ca7.yaml | 2 + ...ergence Custom Investigators 84be1d.ttslua | 1004 +- ...Gender Swapped Investigators 33272e.ttslua | 1004 +- ...houghts Custom Investigators 991ff9.ttslua | 1004 +- ...vestigators and Player Cards 54bd65.ttslua | 1004 +- ...stom_Model_Bag Investigators fba392.ttslua | 1006 +- ...ustom_Model_Bag Player Cards 64ad17.ttslua | 1006 +- ... Pegasus Custom Investigator 84be1d.ttslua | 1004 +- ...on Pegasus Custom Investigator 84be1d.yaml | 8 +- ...CardCustom Maximillion Pegasus 16ccdc.yaml | 0 ...CardCustom Maximillion Pegasus 3ff7c0.yaml | 0 .../CardCustom Millennium Eye ef8ae4.yaml | 0 .../Deck 8a25c7.yaml | 0 ...Edition Custom Investigators 1fb7ce.ttslua | 1004 +- ...e Aeons Custom Investigators 991ff9.ttslua | 1004 +- unpacked/Custom_Model_Bag Core 2585f4.ttslua | 1004 +- unpacked/Custom_Model_Bag Core 2585f4.yaml | 6 +- .../Card Agnes Baker 25e2db.yaml | 45 - .../Card Wendy Adams 90ea00.yaml | 4 +- ...Model_Bag starter deck & cards 011254.yaml | 5 +- .../Card Dark Memory 382dfd.yaml | 45 + .../Card Dark Memory 7275bc.yaml | 12 +- .../Card Heirloom of Hyberborea 576d70.yaml | 12 +- .../Card Heirloom of Hyperborea 492fcf.yaml | 45 + .../Deck 456740.yaml | 42 +- ...Model_Bag starter deck & cards 02abdb.yaml | 2 +- .../Card Hospital Debts 527f1c.yaml | 18 +- ...2777c.yaml => Card On the Lam 2149a1.yaml} | 18 +- .../Deck 5dd52a.yaml | 60 +- .../Card Daisy's Tote Bag 321cb7.yaml | 14 +- .../Deck a9c187.yaml | 110 +- .../Deck Agnes Bakers d3cab5.yaml | 238 + .../Deck Daisy Walkers 1f564c.yaml | 60 +- .../Deck Roland Banks d3b405.yaml | 6 +- ...8.yaml => Deck Skids O'Tooles 2e7dd9.yaml} | 260 +- unpacked/Custom_Model_Bag Core 64a613.ttslua | 1004 +- ...om_Model_Bag 1 The Gathering 667111.ttslua | 546 +- .../Custom_Tile Core Difficulty 92d5f1.ttslua | 40 +- ...del_Bag 2 The Midnight Masks c38c96.ttslua | 546 +- .../Custom_Tile Core Set 8112ff.ttslua | 40 +- ...del_Bag 3 The Devourer Below 2130f0.ttslua | 546 +- ...stom_Tile The Devourer Below 37feeb.ttslua | 40 +- ...t of the Zealot Campaign Log e0c3e7.ttslua | 1356 +- .../Custom_Model_Bag Curse tokens bd0253.yaml | 6 +- .../Bag Challenge Scenarios fa4a1a.yaml | 11 +- .../Deck Bad Blood adc847.yaml | 238 + .../Bag Standalone ce36ec.yaml | 5 +- .../Bag Carnevale of Horrors 418547.yaml | 10 +- .../Deck Carnevale of Horrors 5d123b.yaml | 100 +- .../Deck Setup Resolution 579c60.yaml | 10 +- ...oken Scenario - EasyStandard b7af99.ttslua | 262 +- ...oken Scenario - EasyStandard e19c97.ttslua | 262 +- ...oken Scenario - EasyStandard 535979.ttslua | 262 +- ..._Token Scenario - HardExpert 9ed124.ttslua | 262 +- ... Murder at the Excelsior Hotel 8c5a09.yaml | 10 +- ...g The Blob That Ate Everything c40cac.yaml | 10 +- .../Bag War of the Outer Gods a644c3.yaml | 41 + .../Deck Children of Paradise 6f56e0.yaml | 468 + .../Deck Death of Stars db0ac4.yaml | 468 + .../Deck Swarm of Assimilation a5b82d.yaml | 468 + .../Deck War of the Outer Gods 3111c8.yaml | 2424 + .../Custom_Token Scenario 2da146.ttslua | 262 +- .../Custom_Token Scenario dd61f1.ttslua | 262 +- .../Bag The Innsmouth Conspiracy 2e936e.yaml | 11 +- .../Deck Devil Reef 8cbe29.yaml | 1810 + .../Custom_Model_Bag Guardian 1d802b.ttslua | 1004 +- .../Custom_Model_Bag Guardian 1d802b.yaml | 7 +- .../Card Keen Eye 0dc75e.yaml | 45 + .../Card Machete 273797.yaml | 2 +- .../Card Physical Training 45a012.yaml | 6 +- .../Card Relentless af3efd.yaml | 2 +- .../Card Riot Whistle 55fc3d.yaml | 2 +- .../Card Rite of Sanctification 7db258.yaml | 2 +- .../Card Safeguard 8d6ae6.yaml | 2 +- .../Card Solemn Vow 660d08.yaml | 2 +- ...d Something Worth Fighting For 826897.yaml | 2 +- .../Card Survival Knife 840b3d.yaml | 2 +- .../Card Tetsuo Mori 82ee35.yaml | 2 +- .../Card Trench Knife ca8448.yaml | 2 +- .../Card True Grit f2f912.yaml | 2 +- .../Card Venturer 293e8d.yaml | 2 +- ...> Custom_Model_Bag Guardian 626787.ttslua} | 1004 +- .../Custom_Model_Bag Guardian 626787.yaml | 122 + .../Card .32 Colt f8d22e.yaml | 0 .../Card .35 Winchester 0a7642.yaml | 0 .../Card .45 Automatic ce4f97.yaml | 0 .../Card .45 Thompson 4f6ede.yaml | 0 .../Card Alice Luxley b2fedd.yaml | 0 .../Card Bandolier 8b7da2.yaml | 0 .../Card Beat Cop 591f6f.yaml | 0 .../Card Blackjack e4c7c9.yaml | 0 .../Card Blessed Blade 59390b.yaml | 0 .../Card Book of Psalms 9230a8.yaml | 0 .../Card Boxing Gloves db4a43.yaml | 0 .../Card Clean Them Out 3319be.yaml | 0 .../Card Counterpunch 20645e.yaml | 0 .../Card Daring 86cf73.yaml | 0 .../Card Delay the Inevitable af4c03.yaml | 0 .../Card Dodge 7646d6.yaml | 0 .../Card Dynamite Blast 22c65b.yaml | 0 .../Card Eat lead! b58038.yaml | 0 .../Card Emergency Aid 7b6fd8.yaml | 0 .../Card Enchanted Blade bd34f2.yaml | 0 .../Card Evidence! 8475cc.yaml | 0 .../Card First Aid e29603.yaml | 0 .../Card First Watch 0da344.yaml | 0 .../Card Flesh Ward 52c686.yaml | 0 .../Card Get over here! 5b0f86.yaml | 0 .../Card Glory 273584.yaml | 0 .../Card Grete Wagner f6dfe5.yaml | 0 .../Card Guard Dog db2e8d.yaml | 0 .../Card Hallowed Mirror 460cb8.yaml | 0 .../Card Hand of Fate 930b6b.yaml | 0 .../Card Handcuffs 7dce77.yaml | 0 .../Card Heroic Rescue 724c85.yaml | 0 .../Card I'll see you in hell! 19507d.yaml | 0 .../Card If it bleeds... 6d3fdf.yaml | 0 .../Card Inspiring Presence b789ac.yaml | 0 .../Card Interrogate 60acf8.yaml | 0 .../Card Intrepid 88cd33.yaml | 0 .../Card Keen Eye 0dc75e.yaml | 45 + .../Card Leadership 7dc5e1.yaml | 0 .../Card Let me handle this! 195b7f.yaml | 0 .../Card Machete 273797.yaml | 0 .../Card Monster Slayer 63b3e5.yaml | 0 .../Card On The Hunt bf3261.yaml | 0 .../Card One-Two Punch 22bb1e.yaml | 0 .../Card Physical Training 45a012.yaml | 0 .../Card Prepared for the Worst 6aa477.yaml | 0 .../Card Relentless af3efd.yaml | 0 .../Card Riot Whistle 55fc3d.yaml | 0 .../Card Rite of Sanctification 7db258.yaml | 0 .../Card Safeguard 8d6ae6.yaml | 0 .../Card Scene of the Crime ca17b8.yaml | 0 .../Card Second Wind 5fa99a.yaml | 0 .../Card Self-Sacrifice 184380.yaml | 0 .../Card Solemn Vow 660d08.yaml | 0 ...d Something Worth Fighting For 826897.yaml | 0 .../Card Stand Together 7ec473.yaml | 0 .../Card Steadfast c634a0.yaml | 0 .../Card Survival Knife 840b3d.yaml | 0 .../Card Take the Initiative a88e8d.yaml | 0 .../Card Taunt 8a25a0.yaml | 0 .../Card Teamwork 55ce00.yaml | 0 .../Card Tetsuo Mori 82ee35.yaml | 0 .../Card Trench Knife ca8448.yaml | 0 .../Card True Grit f2f912.yaml | 0 .../Card Trusted cc23ea.yaml | 0 .../Card Venturer 293e8d.yaml | 0 .../Card Vicious Blow ea9ad0.yaml | 0 .../Card Warning Shot 9eeca1.yaml | 0 .../Custom_Model_Bag Guardian bc3210.yaml | 121 - .../Custom_Model_Bag Guardian cd002a.ttslua | 1004 +- .../Custom_Model_Bag Guardian cd002a.yaml | 9 +- .../Card Blood Eclipse (3) 537351.yaml | 2 +- .../Card Counterpunch (2) 92436b.yaml | 4 +- .../Card Custom Ammunition (3) 0c278c.yaml | 4 +- .../Card Dynamite Blast (2) 2b76c6.yaml | 2 +- .../Card Dynamite Blast (3) 14dcc4.yaml | 2 +- .../Card Eat lead! (2) c4018c.yaml | 4 +- .../Card Get over here! (2) 415ca2.yaml | 4 +- .../Card Heroic Rescue (2) 93381d.yaml | 2 +- .../Card I've had worse... (2) e3ae5c.yaml | 4 +- .../Card I've had worse... (4) 5a4bb5.yaml | 2 +- .../Card Lesson Learned (2) 037b2e.yaml | 2 +- .../Card Mano a Mano (2) 14424c.yaml | 6 +- .../Card Monster Slayer (5) 661c3f.yaml | 2 +- .../Card One-Two Punch (5) 8ffa44.yaml | 2 +- .../Card Radiant Smite (1) 3a726b.yaml | 45 + .../Card Reliable (1) 187591.yaml | 2 +- .../Card Righteous Hunt (1) 491c09.yaml | 10 +- .../Card Stand Together (3) 3accaf.yaml | 2 +- .../Card Taunt (2) d93397.yaml | 2 +- .../Card Taunt (3) 85fe46.yaml | 2 +- .../Card Telescopic Sight (3) 2badf6.yaml | 2 +- .../Card Well-Maintained (1) 0c2f37.yaml | 6 +- .../Custom_Model_Bag Guardian 7d3988.ttslua} | 1004 +- .../Custom_Model_Bag Guardian 7d3988.yaml | 122 + .../Card .32 Colt (2) 15fa11.yaml | 0 .../Card .45 Automatic (2) e1ef43.yaml | 0 .../Card .45 Thompson (3) 650903.yaml | 0 .../Card Ace of Swords (1) 32b458.yaml | 0 .../Card Agency Backup (5) f54b74.yaml | 0 .../Card Ambush (1) 36ffa9.yaml | 0 .../Card Armor of Ardennes (5) 1c0bcd.yaml | 0 .../Card Bandolier (2) bdffae.yaml | 0 .../Card Beat Cop (2) 1e7f9a.yaml | 0 .../Card Blackjack (2) e56d1d.yaml | 0 .../Card Blood Eclipse (1) 5efc92.yaml | 0 .../Card Blood Eclipse (3) 537351.yaml | 0 .../Card Boxing Gloves (3) 54293e.yaml | 0 .../Card Brother Xavier (1) 5a7137.yaml | 0 .../Card Combat Training (1) 88fdeb.yaml | 0 .../Card Counterpunch (2) 92436b.yaml | 2 +- .../Card Custom Ammunition (3) 0c278c.yaml | 0 .../Card Dynamite Blast (2) 2b76c6.yaml | 0 .../Card Dynamite Blast (3) 14dcc4.yaml | 0 .../Card Eat lead! (2) c4018c.yaml | 0 .../Card Empty Vessel (4) 043971.yaml | 0 .../Card Enchanted Blade (3) 5cfb72.yaml | 0 .../Card Ever Vigilant (1) ab620e.yaml | 0 .../Card Evidence! (1) 3df5fb.yaml | 0 .../Card Extra Ammunition (1) 5761c7.yaml | 0 .../Card First Aid (3) 80d5e3.yaml | 0 .../Card Flamethrower (5) 066c18.yaml | 0 .../Card Fool me once... (1) 596620.yaml | 0 .../Card Galvanize (1) 9e7f6a.yaml | 0 .../Card Get over here! (2) 415ca2.yaml | 0 .../Card Grete Wagner (3) b39b78.yaml | 0 .../Card Heroic Rescue (2) 93381d.yaml | 0 .../Card I've had worse... (2) e3ae5c.yaml | 0 .../Card I've had worse... (4) 5a4bb5.yaml | 0 .../Card Keen Eye (3) 22256f.yaml | 0 .../Card Kerosene (1) 218e04.yaml | 0 .../Card Leadership (2) 80fafa.yaml | 0 .../Card Lesson Learned (2) 037b2e.yaml | 0 .../Card Lightning Gun (5) 639a09.yaml | 0 .../Card M1918 BAR (4) 6c6340.yaml | 0 .../Card Mano a Mano (1) 88d2ba.yaml | 0 .../Card Mano a Mano (2) 14424c.yaml | 0 .../Card Marksmanship (1) 1408ad.yaml | 0 .../Card Mk 1 Grenades (4) afef79.yaml | 0 .../Card Monster Slayer (5) 661c3f.yaml | 0 .../Card One-Two Punch (5) 8ffa44.yaml | 0 .../Card Overpower (2) 017e1f.yaml | 0 .../Card Physical Training (2) 62392c.yaml | 0 .../Card Physical Training (4) ab51ce.yaml | 0 .../Card Police Badge (2) 2901ee.yaml | 0 .../Card Radiant Smite (1) 3a726b.yaml | 45 + .../Card Reliable (1) 187591.yaml | 0 .../Card Righteous Hunt (1) 491c09.yaml | 4 +- .../Card Sacred Covenant (2) 87226d.yaml | 0 .../Card Safeguard (2) 7dc42a.yaml | 0 .../Card Shotgun (4) 3a622d.yaml | 0 .../Card Spiritual Resolve (5) 7ab680.yaml | 0 .../Card Springfield M1903 (4) 3b042e.yaml | 0 .../Card Stand Together (3) 3accaf.yaml | 0 .../Card Stick to the Plan (3) a26425.yaml | 0 .../Card Survival Knife (2) c1d796.yaml | 0 .../Card Taunt (2) d93397.yaml | 0 .../Card Taunt (3) 85fe46.yaml | 0 .../Card Telescopic Sight (3) 2badf6.yaml | 0 .../Card The Hungering Blade (1) 17f807.yaml | 0 .../Card Vicious Blow (2) 8f5533.yaml | 0 .../Card Well Prepared (2) 1fc1f4.yaml | 0 .../Card Well-Maintained (1) 0c2f37.yaml | 2 +- .../Custom_Model_Bag Guardian a3401d.yaml | 121 - .../Custom_Model_Bag Leaked Items 42cd6e.yaml | 2 +- ...aml => Bag A Light in the Fog a4ef2f.yaml} | 20 +- ...ardCustom Eye of the Djinn (2) ff6e31.yaml | 45 + .../CardCustom Lucky Penny (2) 845053.yaml | 45 + .../Bag Horror in High Gear 183657.yaml | 16 +- .../Custom_Model_Bag Mystic 6117a1.ttslua | 1004 +- unpacked/Custom_Model_Bag Mystic 6117a1.yaml | 7 +- .../Card Abyssal Tome (2) a2d392.yaml | 45 + ...d Alchemical Transmutation (2) d74e66.yaml | 2 +- .../Card Arcane Initiate (3) 45e559.yaml | 2 +- .../Card Arcane Studies (2) f89dd6.yaml | 2 +- .../Card Arcane Studies (4) 0e808b.yaml | 4 +- .../Card Azure Flame (3) c5fb42.yaml | 2 +- .../Card Azure Flame (5) 0ee874.yaml | 2 +- .../Card Blood Pact (3) 86ed13.yaml | 2 +- .../Card Book of Shadows (3) 17c6c8.yaml | 2 +- .../Card Clairvoyance (3) 604ed6.yaml | 2 +- .../Card Clairvoyance (5) e21200.yaml | 2 +- .../Card Clarity of Mind (3) 598837.yaml | 2 +- ...ard Crystalline Elder Sign (3) 8c0e3b.yaml | 2 +- .../Card Dayana Esperence (3) fcd9ce.yaml | 2 +- .../Card De Vermis Mysteriis (2) cb968f.yaml | 2 +- .../Card Empower Self (2) 31051f.yaml | 2 +- .../Card Empower Self (2) b49ef1.yaml | 2 +- .../Card Empower Self (2) fea03b.yaml | 4 +- .../Card Enchanted Blade (3) 053015.yaml | 2 +- .../Card Grotesque Statue (2) 6b2e97.yaml | 4 +- .../Card Grotesque Statue (4) f71c08.yaml | 2 +- .../Card Ineffable Truth (3) 943332.yaml | 2 +- .../Card Ineffable Truth (5) f00301.yaml | 2 +- .../Card Jewel of Aureolus (3) 0919cf.yaml | 4 +- .../Card Mind's Eye (2) 4e86c1.yaml | 2 +- .../Card Mists of R'lyeh (2) 3d57b4.yaml | 2 +- .../Card Mists of R'lyeh (4) 0e2b00.yaml | 6 +- .../Card Paradoxical Covenant (2) 541ee9.yaml | 2 +- .../Card Recall the Future (2) bdddfa.yaml | 2 +- .../Card Rite of Seeking (2) 426c61.yaml | 4 +- .../Card Rite of Seeking (4) ea3df4.yaml | 2 +- ...ard Robes of Endless Night (2) ef43db.yaml | 2 +- .../Card Scroll of Secrets (3) bb9d20.yaml | 2 +- .../Card Scrying (3) 2b7765.yaml | 2 +- ...d Seal of the Seventh Sign (5) 8272e9.yaml | 2 +- .../Card Shards of the Void (3) f651e8.yaml | 2 +- ...Card Shining Trapezohedron (4) ef7b23.yaml | 2 +- .../Card Shrivelling (3) f1654d.yaml | 2 +- .../Card Shrivelling (5) bb7d83.yaml | 2 +- .../Card Sixth Sense (4) b9dd5d.yaml | 2 +- .../Card Song of the Dead (2) d4d8c4.yaml | 6 +- .../Card The Chthonian Stone (3) 698fcc.yaml | 2 +- ...Card Twila Katherine Price (3) b9b811.yaml | 2 +- .../Card Wither (4) c78082.yaml | 2 +- .../Custom_Model_Bag Mystic 2c2b99.yaml | 125 - .../Custom_Model_Bag Mystic eca770.ttslua} | 1004 +- .../Custom_Model_Bag Mystic eca770.yaml | 126 + .../Card Abyssal Tome (2) a2d392.yaml | 45 + ...d Alchemical Transmutation (2) d74e66.yaml | 0 .../Card Arcane Initiate (3) 45e559.yaml | 0 .../Card Arcane Studies (2) f89dd6.yaml | 0 .../Card Arcane Studies (4) 0e808b.yaml | 0 .../Card Azure Flame (3) c5fb42.yaml | 0 .../Card Azure Flame (5) 0ee874.yaml | 0 .../Card Banish (1) 2403fa.yaml | 0 .../Card Bind Monster (2) 8f6cb3.yaml | 0 .../Card Blinding Light (2) fa4a56.yaml | 0 .../Card Blood Pact (3) 86ed13.yaml | 0 .../Card Book of Shadows (1) becb9c.yaml | 0 .../Card Book of Shadows (3) 17c6c8.yaml | 0 .../Card Clairvoyance (3) 604ed6.yaml | 0 .../Card Clairvoyance (5) e21200.yaml | 0 .../Card Clarity of Mind (3) 598837.yaml | 0 .../Card Counterspell (2) 4fb7c0.yaml | 0 ...ard Crystalline Elder Sign (3) 8c0e3b.yaml | 0 .../Card Dayana Esperence (3) fcd9ce.yaml | 0 .../Card De Vermis Mysteriis (2) cb968f.yaml | 0 .../Card Defiance (2) c311be.yaml | 0 .../Card Deny Existence (5) d26b84.yaml | 0 .../Card Eldritch Inspiration (1) e84eff.yaml | 0 .../Card Empower Self (2) 31051f.yaml | 0 .../Card Empower Self (2) b49ef1.yaml | 0 .../Card Empower Self (2) fea03b.yaml | 0 .../Card Enchanted Blade (3) 053015.yaml | 0 .../Card Fearless (2) e53458.yaml | 0 .../Card Four of Cups (1) f9a151.yaml | 0 .../Card Grotesque Statue (2) 6b2e97.yaml | 0 .../Card Grotesque Statue (4) f71c08.yaml | 0 .../Card Grounded (1) 7da732.yaml | 0 .../Card Guts (2) 219c78.yaml | 0 .../Card Hypnotic Gaze (2) e2bc49.yaml | 0 .../Card Ineffable Truth (3) 943332.yaml | 0 .../Card Ineffable Truth (5) f00301.yaml | 0 .../Card Jewel of Aureolus (3) 0919cf.yaml | 0 .../Card Mind Wipe (1) 3c7e85.yaml | 0 .../Card Mind Wipe (3) 82d9bb.yaml | 0 .../Card Mind's Eye (2) 4e86c1.yaml | 0 .../Card Mists of R'lyeh (2) 3d57b4.yaml | 0 .../Card Mists of R'lyeh (4) 0e2b00.yaml | 0 .../Card Paradoxical Covenant (2) 541ee9.yaml | 0 ...ard Protective Incantation (1) c2f6b1.yaml | 0 .../Card Recall the Future (2) bdddfa.yaml | 0 .../Card Recharge (2) f560b1.yaml | 0 .../Card Recharge (4) 591789.yaml | 0 .../Card Rite of Seeking (2) 426c61.yaml | 0 .../Card Rite of Seeking (4) ea3df4.yaml | 0 ...ard Robes of Endless Night (2) ef43db.yaml | 0 .../Card Sacrifice (1) ef52e6.yaml | 0 .../Card Scroll of Secrets (3) bb9d20.yaml | 0 .../Card Scrying (3) 2b7765.yaml | 0 ...ard Seal of the Elder Sign (5) 918fde.yaml | 0 ...d Seal of the Seventh Sign (5) 8272e9.yaml | 0 .../Card Shards of the Void (3) f651e8.yaml | 0 ...Card Shining Trapezohedron (4) ef7b23.yaml | 0 .../Card Shrivelling (3) f1654d.yaml | 0 .../Card Shrivelling (5) bb7d83.yaml | 0 .../Card Sixth Sense (4) b9dd5d.yaml | 0 .../Card Song of the Dead (2) d4d8c4.yaml | 0 .../Card Spirit Athame (1) a1c372.yaml | 0 .../Card Stargazing (1) 9c0a3d.yaml | 0 .../Card Storm of Spirits (3) a906ee.yaml | 0 .../Card Summoned Hound (1) 0e8b75.yaml | 0 .../Card The Chthonian Stone (3) 698fcc.yaml | 0 .../Card Time Warp (2) ec3a71.yaml | 0 ...Card Twila Katherine Price (3) b9b811.yaml | 0 .../Card Ward of Protection (2) 443992.yaml | 0 .../Card Ward of Protection (5) fc4caf.yaml | 0 .../Card Wither (4) c78082.yaml | 0 .../Card Word of Command (2) 16154f.yaml | 0 .../Custom_Model_Bag Mystic b4d9bf.ttslua | 1004 +- unpacked/Custom_Model_Bag Mystic b4d9bf.yaml | 11 +- .../Card Blood Pact fc709b.yaml | 45 + .../Card Clairvoyance b67371.yaml | 2 +- .../Card Clarity of Mind e563d5.yaml | 2 +- .../Card Crystal Pendulum 6c3156.yaml | 2 +- .../Card David Renfield 3120e7.yaml | 2 +- .../Card Enchanted Blade 0e459d.yaml | 2 +- .../Card Eye of Chaos 9a5782.yaml | 2 +- .../Card Familiar Spirit 971d52.yaml | 4 +- .../Card Forbidden Knowledge 7cf231.yaml | 2 +- .../Card Healing Words 4abb47.yaml | 2 +- .../Card Holy Rosary 98aa6a.yaml | 2 +- .../Card Ineffable Truth c6caf6.yaml | 2 +- .../Card Mists of R'lyeh 64fcdf.yaml | 2 +- .../Card Olive McBride 715974.yaml | 6 +- .../Card Rite of Seeking 8b39e9.yaml | 2 +- .../Card Ritual Candles d2776c.yaml | 2 +- .../Card Robes of Endless Night d9292f.yaml | 2 +- .../Card Scroll of Prophecies ebdac9.yaml | 2 +- .../Card Scroll of Secrets c63ec7.yaml | 2 +- .../Card Scrying 24a147.yaml | 2 +- .../Card Scrying Mirror 6446d1.yaml | 2 +- .../Card Shrivelling e16d74.yaml | 2 +- .../Card Shroud of Shadows a565d5.yaml | 2 +- .../Card Sign Magick 4fe0b8.yaml | 2 +- .../Card Sixth Sense b7efb5.yaml | 2 +- .../Card St. Hubert's Key 5905a9.yaml | 4 +- .../Card Sword Cane c99da7.yaml | 2 +- .../Card The Chthonian Stone 916f1c.yaml | 2 +- .../Card Wither 5792ab.yaml | 2 +- .../Custom_Model_Bag Mystic 17e533.ttslua} | 1004 +- .../Custom_Model_Bag Mystic 17e533.yaml | 119 + .../Card Alchemical Transmutation 7d133c.yaml | 0 .../Card Alyssa Graham a26795.yaml | 0 .../Card Arcane Initiate 4287c0.yaml | 0 .../Card Arcane Research fee183.yaml | 0 .../Card Arcane Studies eb8234.yaml | 0 .../Card Armageddon 3feff1.yaml | 0 .../Card Astral Travel 8bb57d.yaml | 0 .../Card Azure Flame 17319c.yaml | 0 .../Card Blinding Light 00d05a.yaml | 0 .../Card Blood Pact fc709b.yaml | 45 + .../Card Clairvoyance b67371.yaml | 0 .../Card Clarity of Mind e563d5.yaml | 0 .../Card Crystal Pendulum 6c3156.yaml | 0 .../Card Dark Prophecy 74b8d4.yaml | 0 .../Card David Renfield 3120e7.yaml | 0 .../Card Defiance 946958.yaml | 0 .../Card Delve too Deep b83784.yaml | 0 .../Card Deny Existence 62db13.yaml | 0 .../Card Drawn to the Flame b36f5e.yaml | 0 .../Card Eldritch Inspiration a268ef.yaml | 0 .../Card Enchanted Blade 0e459d.yaml | 0 .../Card Enraptured 0ce7b8.yaml | 0 .../Card Ethereal Form ee51d8.yaml | 0 .../Card Eye of Chaos 9a5782.yaml | 0 .../Card Familiar Spirit 971d52.yaml | 0 .../Card Fearless f21135.yaml | 0 .../Card Forbidden Knowledge 7cf231.yaml | 0 .../Card Healing Words 4abb47.yaml | 0 .../Card Holy Rosary 98aa6a.yaml | 0 .../Card Hypnotic Gaze e546c0.yaml | 0 .../Card Ineffable Truth c6caf6.yaml | 0 .../Card Mists of R'lyeh 64fcdf.yaml | 0 .../Card Moonlight Ritual 247824.yaml | 0 .../Card Olive McBride 715974.yaml | 0 .../Card Open Gate dfc9b0.yaml | 0 .../Card Parallel Fates 47bdba.yaml | 0 .../Card Premonition 348395.yaml | 0 .../Card Prescient 7e7873.yaml | 0 .../Card Promise of Power c619af.yaml | 0 .../Card Prophesy e0906c.yaml | 0 .../Card Quantum Flux 562eb1.yaml | 0 .../Card Read the Signs 4f33d5.yaml | 0 .../Card Rite of Seeking 8b39e9.yaml | 0 .../Card Ritual Candles d2776c.yaml | 0 .../Card Robes of Endless Night d9292f.yaml | 0 .../Card Scroll of Prophecies ebdac9.yaml | 0 .../Card Scroll of Secrets c63ec7.yaml | 0 .../Card Scrying 24a147.yaml | 0 .../Card Scrying Mirror 6446d1.yaml | 0 .../Card Shrivelling e16d74.yaml | 0 .../Card Shroud of Shadows a565d5.yaml | 0 .../Card Sign Magick 4fe0b8.yaml | 0 .../Card Sixth Sense b7efb5.yaml | 0 .../Card Spectral Razor b6bccc.yaml | 0 .../Card St. Hubert's Key 5905a9.yaml | 0 .../Card Storm of Spirits e792b0.yaml | 0 .../Card Sword Cane c99da7.yaml | 0 .../Card The Chthonian Stone 916f1c.yaml | 0 .../Card Tides of Fate 78b142.yaml | 0 .../Card Torrent of Power 9f2514.yaml | 0 .../Card Uncage the Soul a82830.yaml | 0 .../Card Voice of Ra 0988b2.yaml | 0 .../Card Ward of Protection 9bee5a.yaml | 0 .../Card Ward of Radiance b22438.yaml | 0 .../Card Wither 5792ab.yaml | 0 .../Custom_Model_Bag Mystic ee21f7.yaml | 118 - .../Custom_Model_Bag Neutral a4d0e8.ttslua | 1004 +- unpacked/Custom_Model_Bag Neutral a4d0e8.yaml | 2 +- .../Custom_Model_Bag Neutral 06b03b.ttslua | 1004 +- .../Custom_Model_Bag Neutral aef7dd.ttslua | 1004 +- unpacked/Custom_Model_Bag Neutral aef7dd.yaml | 5 +- .../Card Emergency Cache (3) 73aab3.yaml | 2 +- .../Card Manipulate Destiny (2) 5606b3.yaml | 45 + .../Card Moment of Respite (3) d78375.yaml | 2 +- .../Custom_Model_Bag Neutral 3559eb.ttslua | 503 + .../Custom_Model_Bag Neutral 3559eb.yaml | 74 + .../Card Ace of Rods (1) eef2a9.yaml | 0 .../Card Anna Kaslow (4) cd426b.yaml | 0 .../Card Backpack (2) 8be56a.yaml | 0 .../Card Bulletproof Vest (3) 8737b5.yaml | 0 .../Card Charisma (3) 67dfca.yaml | 0 .../Card Elder Sign Amulet (3) 0aece0.yaml | 0 .../Card Emergency Cache (2) 1b1f60.yaml | 0 .../Card Emergency Cache (3) 73aab3.yaml | 0 .../Card Hemispheric Map (3) 519cc4.yaml | 0 .../Card Key of Ys (5) 1ea991.yaml | 0 .../Card Lucid Dreaming (2) b5763a.yaml | 0 .../Card Manipulate Destiny (2) 5606b3.yaml | 45 + .../Card Moment of Respite (3) d78375.yaml | 0 .../Card Ornate Bow (3) 08097a.yaml | 0 .../Card Relic Hunter (3) fa4c7c.yaml | 0 .../Card The Black Cat (5) 2acaa8.yaml | 0 .../Card The Council's Coffer (2) 79ef94.yaml | 0 .../Card The Red-Gloved Man (5) 6b6ed9.yaml | 0 .../Card Timeworn Brand (5) cf212b.yaml | 0 .../Card Versatile (2) c1124f.yaml | 0 .../Custom_Model_Bag Neutral 574514.ttslua | 503 - .../Custom_Model_Bag Neutral 574514.yaml | 73 - .../Custom_Model_Bag Neutral c5261f.ttslua | 1004 +- .../Custom_Model_Bag Neutral 3fe354.ttslua | 1004 +- ...odel_Bag Promo Investigators 5fe24e.ttslua | 1004 +- ..._Model_Bag Promo Investigators 5fe24e.yaml | 15 +- ....yaml => Card Gloria Goldberg 8de7e4.yaml} | 18 +- ...Return to The Dunwich Legacy ce9130.ttslua | 1006 +- ... 1a Extracurricular Activity d33f7e.ttslua | 1006 +- ...stom_Tile The Dunwich Legacy a74352.ttslua | 42 +- ...Bag 1b The House Always Wins f52082.ttslua | 1006 +- ...stom_Tile The Dunwich Legacy 1d6227.ttslua | 42 +- ..._Bag 2 The Miskatonic Museum 87897a.ttslua | 1006 +- ...m_Tile The Miskatonic Museum 4b5e17.ttslua | 50 +- ...g 3 The Essex County Express d92b86.ttslua | 1006 +- ...ile The Essex County Express 247967.ttslua | 50 +- ...del_Bag 4 Blood on the Altar 1536e7.ttslua | 1006 +- ...stom_Tile Blood on the Altar 92b54a.ttslua | 50 +- ...g 5 Undimensioned and Unseen a82dde.ttslua | 1006 +- ...ile Undimensioned and Unseen 393c71.ttslua | 50 +- ...odel_Bag 6 Where Doom Awaits 175a29.ttslua | 1006 +- ...ustom_Tile Where Doom Awaits a621ae.ttslua | 50 +- ...Bag 7 Lost in Time and Space 1fca6b.ttslua | 1006 +- ..._Tile Lost in Time and Space 64a607.ttslua | 50 +- ... Dunwich Legacy Campaign Log 3f6ab6.ttslua | 1338 +- ... Return to The Forgotten Age 479ff3.ttslua | 1006 +- ... Return to The Untamed Wilds 85a0c2.ttslua | 1004 +- ...ustom_Tile The Forgotten Age e95200.ttslua | 40 +- ... Return to The Doom of Eztli 110ce2.ttslua | 1004 +- ...ustom_Tile The Doom of Eztli 294ec4.ttslua | 48 +- ... 3 Return to Threads of Fate 499940.ttslua | 1004 +- .../Custom_Tile Threads of Fate 7a95f6.ttslua | 48 +- ...eturn to The Boundary Beyond 952af4.ttslua | 1004 +- ...tom_Tile The Boundary Beyond 010761.ttslua | 48 +- ...o Heart of the Elders Part 1 5abc8f.ttslua | 1004 +- ...tom_Tile Heart of the Elders 493cb1.ttslua | 48 +- ...o Heart of the Elders Part 2 3ccabf.ttslua | 1004 +- ...turn to The City of Archives e73427.ttslua | 1004 +- ...om_Tile The City of Archives 2fb6dc.ttslua | 48 +- ...Return to The Depths of Yoth 9c986e.ttslua | 1004 +- ...stom_Tile The Depths of Yoth 7aa4e3.ttslua | 48 +- ...oken Scenario - EasyStandard dd61f1.ttslua | 262 +- ..._Token Scenario - HardExpert 2da146.ttslua | 262 +- ... 8 Return to Shattered Aeons 5e83e7.ttslua | 1004 +- .../Custom_Tile Shattered Aeons 6dc72a.ttslua | 42 +- ... 9 Return to Secret Scenario 496395.ttslua | 1004 +- ...e Forgotten Age Campaign Log 48b154.ttslua | 1380 +- ...eturn to The Path to Carcosa e9889a.ttslua | 1006 +- ...tom_Model_Bag 1 Curtain Call 83ccd4.ttslua | 776 +- ...tom_Tile The Path to Carcosa 16562e.ttslua | 42 +- ...om_Model_Bag 2 The Last King 6730a1.ttslua | 776 +- ...stom_Model_Bag 2 The Last King 6730a1.yaml | 48 +- .../Card Ballroom c605d3.yaml | 2 +- .../Card Courtyard 981fa3.yaml | 2 +- .../Card Dining Room aa08d4.yaml | 2 +- .../Card Discovering the Truth 985957.yaml | 2 +- .../Card Foyer 4b6478.yaml | 2 +- .../Card Gallery cce10d.yaml | 2 +- .../Card Living Room b3c25b.yaml | 2 +- .../Card Scenario dd2d33.yaml | 2 +- .../Card Setup 93a42f.yaml | 2 +- .../Custom_Tile The Last King 857d0d.ttslua | 48 +- ...om_Tile The Last King Helper 47a40e.ttslua | 74 + ...stom_Tile The Last King Helper 47a40e.yaml | 44 + .../Deck Agenda Deck 041cfc.yaml | 2 +- .../Deck Bystanders dc02e3.yaml | 2 +- .../Deck Encounter Deck 9869cb.yaml | 2 +- .../Deck Sickening Reality 59504e.yaml | 4 +- ...del_Bag 3 Echoes of the Past 42d2dc.ttslua | 776 +- ...stom_Tile Echoes of the Past 452210.ttslua | 50 +- ...l_Bag 4 The Unspeakable Oath e7efa6.ttslua | 776 +- ...om_Tile The Unspeakable Oath 87f45e.ttslua | 50 +- ...del_Bag 5 A Phantom of Truth bd4167.ttslua | 776 +- ...stom_Tile A Phantom of Truth b20b8d.ttslua | 50 +- ..._Model_Bag 6 The Pallid Mask eb48ff.ttslua | 776 +- .../Custom_Tile The Pallid Mask bb070d.ttslua | 50 +- ...Model_Bag 7 Black Stars Rise dd8b0d.ttslua | 776 +- ...m_Model_Bag 7 Black Stars Rise dd8b0d.yaml | 2 +- ...oisterKnight's Hall Randomizer 5bd383.yaml | 2 +- .../Bag New Chaos Token 425d3a.yaml | 16 +- .../Bag Setup Randomizer 7c8232.yaml | 10 +- .../Bag Setup Bag b29b71.ttslua | 546 +- .../Bag Setup Bag d14543.ttslua | 546 +- .../Card Abbey Church 106f19.yaml | 2 +- .../Card Broken Steps 38d12d.yaml | 2 +- .../Card Broken Steps c2651e.yaml | 2 +- .../Card Chœur Gothique b52eaf.yaml | 2 +- .../Card Chœur Gothique c7ee02.yaml | 6 +- .../Card Grand Rue 20de8b.yaml | 2 +- .../Card North Tower 69eae5.yaml | 4 +- .../Card North Tower c0362a.yaml | 4 +- .../Card Outer Wall 014bd6.yaml | 4 +- .../Card Outer Wall db972a.yaml | 2 +- .../Card Porte de l'Avancée c647a3.yaml | 2 +- .../Card Scenario 1163a0.yaml | 2 +- .../Card Setup 93a42f.yaml | 2 +- ...Custom_Tile Black Stars Rise 20c21d.ttslua | 50 +- .../Deck Encounter Deck c380e4.yaml | 4 +- ...stom_Model_Bag 8 Dim Carcosa ce5d30.ttslua | 776 +- .../Custom_Tile Dim Carcosa 9afdfd.ttslua | 50 +- ...om_Tile Carcosa Campaign Log ae8317.ttslua | 1510 +- ...n to the Night of the Zealot 56270d.ttslua | 1006 +- ...ag 1 Return to The Gathering 41ebd8.ttslua | 546 +- .../Custom_Tile Core Difficulty 527f29.ttslua | 40 +- ...Return to The Midnight Masks bcc86c.ttslua | 546 +- .../Custom_Tile Core Difficulty 47f3de.ttslua | 40 +- ...Return to The Devourer Below 604753.ttslua | 546 +- ...t of the Zealot Campaign Log e0c3e7.ttslua | 1356 +- unpacked/Custom_Model_Bag Rogue 68d7b8.ttslua | 1004 +- .../Custom_Model_Bag Rogue 21d547.ttslua | 1004 +- unpacked/Custom_Model_Bag Rogue deaa6d.ttslua | 1004 +- unpacked/Custom_Model_Bag Rogue deaa6d.yaml | 10 +- .../Card .41 Derringer (2) f57af7.yaml | 4 +- .../Card .45 Thompson (3) d4dbc7.yaml | 2 +- .../Card Ace in the Hole (3) 074858.yaml | 2 +- ...nother Day, Another Dollar (3) 006d44.yaml | 2 +- .../Card Backstab (3) 7baf75.yaml | 2 +- .../Card Beretta M1918 (4) 91da6b.yaml | 2 +- .../Card Borrowed Time (3) 0db666.yaml | 2 +- .../Card Burglary (2) 2aeb8a.yaml | 2 +- .../Card Cheap Shot (2) 0b963c.yaml | 2 +- .../Card Cheat Death (5) 3add54.yaml | 4 +- .../Card Chicago Typewriter (4) ecfa42.yaml | 6 +- .../Card Chuck Fergus (5) 0e72b6.yaml | 2 +- .../Card Colt Vest Pocket (2) bab03b.yaml | 2 +- .../Card Contraband (2) 620b6e.yaml | 2 +- .../Card Daring Maneuver (2) fc82a5.yaml | 4 +- .../Card Decorated Skull (3) 981f41.yaml | 2 +- .../Card Delilah O'Rourke (3) b81c84.yaml | 2 +- .../Card Double, Double (4) 0e0530.yaml | 2 +- .../Card False Covenant (2) 3442f5.yaml | 2 +- .../Card Garrote Wire (2) 117b7c.yaml | 2 +- .../Card Hard Knocks (2) 15643b.yaml | 4 +- .../Card Haste (2) 1bd139.yaml | 2 +- .../Card High Roller (2) ce1b89.yaml | 6 +- .../Card Hot Streak (2) f2508d.yaml | 2 +- .../Card Hot Streak (4) 4eb231.yaml | 4 +- .../Card Joey The Rat Vigil (3) 7b918b.yaml | 4 +- .../Card Lola Santiago (3) 8bec05.yaml | 2 +- .../Card Lucky Cigarette Case (3) 0feb74.yaml | 2 +- .../Card Lucky Dice (2) 9dd911.yaml | 2 +- .../Card Lupara (3) a6af13.yaml | 2 +- .../Card Mauser C96 (2) fc20b9.yaml | 2 +- .../Card Pickpocketing (2) 2f4db2.yaml | 2 +- .../Card Pilfer (3) e503ce.yaml | 2 +- .../Card Priest of Two Faiths (1) 48e4a3.yaml | 45 + .../Card Sawed-Off Shotgun (5) e1c0f8.yaml | 2 +- .../Card Sharpshooter (3) 7f27d6.yaml | 4 +- .../Card Slip Away (2) 4a45c6.yaml | 2 +- .../Card Sneak Attack (2) 5f19e0.yaml | 2 +- .../Card Stealth (3) 26a3bf.yaml | 4 +- .../Card Streetwise (3) d7dbac.yaml | 2 +- .../Card Suggestion (1) 0ec9bf.yaml | 2 +- .../Card Suggestion (4) e7f37b.yaml | 2 +- .../Card Sure Gamble (3) 308be1.yaml | 2 +- .../Card Swift Reload (2) 2cfa4f.yaml | 2 +- .../Card Switchblade (2) 2fba3b.yaml | 2 +- .../Card Tennessee Sour Mash (3) b5e5f1.yaml | 4 +- ...Card The Gold Pocket Watch (4) 62d930.yaml | 2 +- .../Card The Moon • XVIII (1) e80bd8.yaml | 2 +- .../Card The Skeleton Key (2) f8dc01.yaml | 2 +- .../Card Think on Your Feet (2) 3e0653.yaml | 2 +- .../Card Treasure Hunter (1) 18927e.yaml | 2 +- .../Card Under Surveillance (1) cc8321.yaml | 45 + .../Custom_Model_Bag Rogue 6c6b22.ttslua | 503 + .../Custom_Model_Bag Rogue 6c6b22.yaml | 125 + .../Card .41 Derringer (2) f57af7.yaml | 0 .../Card .45 Thompson (3) d4dbc7.yaml | 0 .../Card Ace in the Hole (3) 074858.yaml | 0 .../Card Adaptable (1) 731d2a.yaml | 0 .../Card All In (5) 7d3a27.yaml | 0 ...nother Day, Another Dollar (3) 006d44.yaml | 0 .../Card Backstab (3) 7baf75.yaml | 0 .../Card Beretta M1918 (4) 91da6b.yaml | 0 .../Card Borrowed Time (3) 0db666.yaml | 0 .../Card Burglary (2) 2aeb8a.yaml | 0 .../Card Cat Burglar (1) 2fe723.yaml | 0 .../Card Charon's Obol (1) 1dbc95.yaml | 0 .../Card Cheap Shot (2) 0b963c.yaml | 0 .../Card Cheat Death (5) 3add54.yaml | 0 .../Card Chicago Typewriter (4) ecfa42.yaml | 0 .../Card Chuck Fergus (5) 0e72b6.yaml | 0 .../Card Colt Vest Pocket (2) bab03b.yaml | 0 .../Card Contraband (2) 620b6e.yaml | 0 .../Card Copycat (3) de40c8.yaml | 0 .../Card Daredevil (2) b3cad4.yaml | 0 .../Card Daring Maneuver (2) fc82a5.yaml | 0 .../Card Decorated Skull (3) 981f41.yaml | 0 .../Card Delilah O'Rourke (3) b81c84.yaml | 0 .../Card Double, Double (4) 0e0530.yaml | 0 .../Card Easy Mark (1) cdbb37.yaml | 0 .../Card False Covenant (2) 3442f5.yaml | 0 .../Card Fence (1) 2423e7.yaml | 0 .../Card Garrote Wire (2) 117b7c.yaml | 0 .../Card Hard Knocks (2) 15643b.yaml | 0 .../Card Haste (2) 1bd139.yaml | 0 .../Card High Roller (2) ce1b89.yaml | 0 .../Card Hired Muscle (1) cdd6aa.yaml | 0 .../Card Hot Streak (2) f2508d.yaml | 0 .../Card Hot Streak (4) 4eb231.yaml | 0 .../Card Joey The Rat Vigil (3) 7b918b.yaml | 0 .../Card Leo de Luca (1) 27446e.yaml | 0 .../Card Liquid Courage (1) 5065a6.yaml | 0 .../Card Lockpicks (1) edd6c4.yaml | 0 .../Card Lola Santiago (3) 8bec05.yaml | 0 .../Card Lucky Cigarette Case (3) 0feb74.yaml | 0 .../Card Lucky Dice (2) 9dd911.yaml | 0 .../Card Lupara (3) a6af13.yaml | 0 .../Card Manual Dexterity (2) 982716.yaml | 0 .../Card Mauser C96 (2) fc20b9.yaml | 0 .../Card Momentum (1) d753d7.yaml | 0 .../Card Moxie (1) 5fe780.yaml | 0 .../Card Opportunist (2) 63f145.yaml | 0 .../Card Pay Day (1) eaa415.yaml | 0 .../Card Pickpocketing (2) 2f4db2.yaml | 0 .../Card Pilfer (3) e503ce.yaml | 0 .../Card Priest of Two Faiths (1) 48e4a3.yaml | 45 + .../Card Sawed-Off Shotgun (5) e1c0f8.yaml | 0 .../Card Sharpshooter (3) 7f27d6.yaml | 2 +- .../Card Skeptic (1) 37882c.yaml | 0 .../Card Slip Away (2) 4a45c6.yaml | 0 .../Card Sneak Attack (2) 5f19e0.yaml | 0 .../Card Stealth (3) 26a3bf.yaml | 2 +- .../Card Streetwise (3) d7dbac.yaml | 0 .../Card Suggestion (1) 0ec9bf.yaml | 0 .../Card Suggestion (4) e7f37b.yaml | 0 .../Card Sure Gamble (3) 308be1.yaml | 0 .../Card Swift Reload (2) 2cfa4f.yaml | 0 .../Card Switchblade (2) 2fba3b.yaml | 0 .../Card Tennessee Sour Mash (3) b5e5f1.yaml | 0 ...Card The Gold Pocket Watch (4) 62d930.yaml | 0 .../Card The Moon • XVIII (1) e80bd8.yaml | 0 .../Card The Skeleton Key (2) f8dc01.yaml | 0 .../Card Think on Your Feet (2) 3e0653.yaml | 0 .../Card Three Aces (1) 30062e.yaml | 0 .../Card Treasure Hunter (1) 18927e.yaml | 0 .../Card Under Surveillance (1) cc8321.yaml | 45 + .../Custom_Model_Bag Rogue fa4d49.ttslua | 503 - .../Custom_Model_Bag Rogue fa4d49.yaml | 123 - .../Custom_Model_Bag Seeker 1e7fc5.ttslua | 1004 +- unpacked/Custom_Model_Bag Seeker 1e7fc5.yaml | 9 +- ...=> Card Dr. Milan Christopher 4ee663.yaml} | 2 +- .../Card The Truth Beckons ca1b5c.yaml | 45 + .../Card Truth from Fiction b57f33.yaml | 4 +- .../Card Unearth the Ancients bc0fb2.yaml | 2 +- .../Card Vantage Point c03b59.yaml | 2 +- .../Card Working a Hunch 05660e.yaml | 2 +- .../Custom_Model_Bag Seeker d257cb.ttslua | 503 + .../Custom_Model_Bag Seeker d257cb.yaml | 122 + .../Card Anatomical Diagrams e957df.yaml | 0 .../Card Arcane Enlightenment e69708.yaml | 0 .../Card Archaic Glyphs 560b32.yaml | 0 .../Card Art Student 7dfe08.yaml | 0 .../Card Astounding Revelation 70406e.yaml | 0 .../Card Barricade 38217d.yaml | 0 .../Card Burning the Midnight Oil 0d29be.yaml | 0 .../Card Celaeno Fragments d287bc.yaml | 0 .../Card Charles Ross, Esq. 176d57.yaml | 0 .../Card Connect the Dots 94abd7.yaml | 0 .../Card Crack the Case d83a35.yaml | 0 .../Card Cryptic Grimoire af84e6.yaml | 0 .../Card Cryptic Writings ff2776.yaml | 0 .../Card Cryptographic Cipher 27258f.yaml | 0 .../Card Curiosity fb48a9.yaml | 0 .../Card Deduction e7f376.yaml | 0 .../Card Deep Knowledge adde8d.yaml | 0 .../Card Disc of Itzamna d6c44a.yaml | 0 .../Card Dr. Elli Horowitz 7973c0.yaml | 0 .../Card Dr. Milan Christopher 4ee663.yaml} | 2 +- .../Card Dr. William T. Maleson 5e0769.yaml | 0 .../Card Dream Diary 52f66c.yaml | 0 .../Card Dream-Enhancing Serum 1c353d.yaml | 0 .../Card Eldritch Sophist 53d103.yaml | 0 .../Card Encyclopedia dbb0e0.yaml | 0 .../Card Eureka! 244e5d.yaml | 0 .../Card Extensive Research 013446.yaml | 0 .../Card Feed the Mind a614de.yaml | 0 .../Card Fieldwork 922850.yaml | 0 .../Card Fingerprint Kit b73951.yaml | 0 .../Card Forbidden Tome 0a4d22.yaml | 0 .../Card Ghastly Revelation bf4815.yaml | 0 .../Card Grisly Totem d5bad4.yaml | 0 .../Card Guidance f8e2fb.yaml | 0 .../Card Hawk-Eye Folding Camera 05125c.yaml | 0 .../Card Higher Education 8595fb.yaml | 0 .../Card Hyperawareness 9902a8.yaml | 0 .../Card I've got a plan! 338973.yaml | 0 .../Card Inquiring Mind ba1c85.yaml | 0 .../Card Knowledge is Power 070246.yaml | 0 .../Card Laboratory Assistant 889177.yaml | 0 .../Card Logical Reasoning f6b017.yaml | 0 .../Card Magnifying Glass 2239d4.yaml | 0 .../Card Medical Texts 73172c.yaml | 0 .../Card Mind over Matter 6d5337.yaml | 0 .../Card Mr. Rook b3debc.yaml | 0 .../Card No Stone Unturned cc7761.yaml | 0 .../Card Occult Invocation 010509.yaml | 0 .../Card Occult Lexicon 3d6f47.yaml | 0 .../Card Old Book of Lore e13107.yaml | 0 .../Card Persuasion 7b6e14.yaml | 0 .../Card Plan of Action 3b9c2c.yaml | 0 .../Card Practice Makes Perfect 088c27.yaml | 0 .../Card Preposterous Sketches 65a64f.yaml | 0 .../Card Research Librarian 92890f.yaml | 0 .../Card Scroll of Secrets f475ca.yaml | 0 .../Card Seeking Answers e4f8ba.yaml | 0 .../Card Shortcut 00ade1.yaml | 0 .../Card Shrewd Analysis d950d8.yaml | 0 .../Card Strange Solution e5d521.yaml | 0 .../Card The Truth Beckons ca1b5c.yaml | 45 + .../Card Tooth of Eztli 7d0ada.yaml | 0 .../Card True Understanding 03bb19.yaml | 0 .../Card Truth from Fiction b57f33.yaml | 0 .../Card Unearth the Ancients bc0fb2.yaml | 0 .../Card Vantage Point c03b59.yaml | 0 .../Card Whitton Greene 3c5099.yaml | 0 .../Card Working a Hunch 05660e.yaml | 0 .../Custom_Model_Bag Seeker e328ea.ttslua | 503 - .../Custom_Model_Bag Seeker e328ea.yaml | 121 - .../Custom_Model_Bag Seeker 5ec2fb.ttslua | 1004 +- unpacked/Custom_Model_Bag Seeker 5ec2fb.yaml | 9 +- .../Card Barricade (3) 3469e0.yaml | 2 +- .../Card Cryptic Research (4) 791d5f.yaml | 4 +- .../Card Deciphered Reality (5) b98ff6.yaml | 4 +- .../Card Eidetic Memory (3) 423ea2.yaml | 2 +- .../Card Expose Weakness (3) d391c7.yaml | 4 +- .../Card Gaze of Ouraxsh (2) b7c316.yaml | 45 + ...rd Glimpse the Unthinkable (5) bdbca5.yaml | 2 +- .../Card I've got a plan! (2) 344e90.yaml | 2 +- .../Card Logical Reasoning (4) 6f6976.yaml | 2 +- .../Card Mind Over Matter (2) 9b1c5b.yaml | 2 +- .../Card No Stone Unturned (5) a641de.yaml | 6 +- ...Card Preposterous Sketches (2) 15a1bb.yaml | 2 +- .../Card Seeking Answers (2) c1365d.yaml | 2 +- .../Card Shortcut (2) 404410.yaml | 2 +- .../Card Truth from Fiction (2) fd3cda.yaml | 2 +- .../Custom_Model_Bag Seeker b2264c.ttslua | 503 + .../Custom_Model_Bag Seeker b2264c.yaml | 115 + .../Card Abigail Foreman (4) b63277.yaml | 0 .../Card Ancient Stone (1) 8b1863.yaml | 0 .../Card Arcane Insight (4) 6fab5a.yaml | 0 .../Card Barricade (3) 3469e0.yaml | 0 .../Card Blasphemous Covenant (2) 86d109.yaml | 0 .../Card Cryptic Research (4) 791d5f.yaml | 0 .../Card Cryptic Writings (2) 870bdc.yaml | 0 .../Card Death • XIII (1) add7c9.yaml | 0 .../Card Deciphered Reality (5) b98ff6.yaml | 0 .../Card Deduction (2) e0721f.yaml | 0 .../Card Disc of Itzamna (2) 117137.yaml | 0 .../Card Eidetic Memory (3) 423ea2.yaml | 0 .../Card Encyclopedia (2) d86b0d.yaml | 0 .../Card Esoteric Atlas (1) e50ca0.yaml | 0 .../Card Esoteric Atlas (2) 2172e2.yaml | 0 .../Card Expose Weakness (1) 97ed44.yaml | 0 .../Card Expose Weakness (3) d391c7.yaml | 0 .../Card Extensive Research (1) e07aab.yaml | 0 .../Card Farsight (4) b4121c.yaml | 0 .../Card Feed the Mind (3) 659f2d.yaml | 0 .../Card Forewarned (1) f22453.yaml | 0 .../Card Gaze of Ouraxsh (2) b7c316.yaml | 45 + ...rd Glimpse the Unthinkable (1) 6e4d54.yaml | 0 ...rd Glimpse the Unthinkable (5) bdbca5.yaml | 0 .../Card Grisly Totem (3) b722cd.yaml | 0 .../Card Higher Education (3) 0d3413.yaml | 0 .../Card Hyperawareness (2) e4ceae.yaml | 0 .../Card I've got a plan! (2) 344e90.yaml | 0 .../Card In the Know (1) 488fab.yaml | 0 .../Card Library Docent (1) fab3a9.yaml | 0 .../Card Logical Reasoning (4) 6f6976.yaml | 0 .../Card Magnifying Glass (1) 8343e5.yaml | 0 .../Card Mind Over Matter (2) 9b1c5b.yaml | 0 ...atonic Archaeology Funding (4) 1a1b58.yaml | 0 .../Card No Stone Unturned (5) a641de.yaml | 0 .../Card Old Book of Lore (3) 0d88ac.yaml | 0 .../Card Otherworld Codex (2) 5f8011.yaml | 0 .../Card Otherworldly Compass (2) 562c05.yaml | 0 .../Card Pathfinder (1) 683123.yaml | 0 .../Card Perception (2) 96b5ed.yaml | 0 .../Card Pnakotic Manuscripts (5) 300569.yaml | 0 ...Card Preposterous Sketches (2) 15a1bb.yaml | 0 .../Card Quick Study (2) 26d70e.yaml | 0 .../Card Scientific Theory (1) 8cdfc7.yaml | 0 .../Card Scroll of Secrets (3) cffeb0.yaml | 0 .../Card Seeking Answers (2) c1365d.yaml | 0 .../Card Segment of Onyx (1) bc498d.yaml | 0 .../Card Shortcut (2) 404410.yaml | 0 .../Card Stirring Up Trouble (1) e99f0d.yaml | 0 .../Card Studious (3) 384258.yaml | 0 .../Card Surprising Find (1) 0d3d1a.yaml | 0 .../Card The Eye of Truth (5) 552689.yaml | 0 .../Card The Necronomicon (5) 96ba38.yaml | 0 .../Card Truth from Fiction (2) fd3cda.yaml | 0 .../Card Whitton Greene (2) 854c79.yaml | 0 .../Deck Ancient Stone (4) 7b5a65.yaml | 0 .../Deck Archaic Glyphs (3) 22c4b1.yaml | 0 .../Deck Dream Diary (3) 6465d8.yaml | 0 .../Deck Forbidden Tome (3) 367e5c.yaml | 0 .../Deck Strange Solution (4) 4a29bd.yaml | 0 .../Custom_Model_Bag Seeker d99b16.ttslua | 503 - .../Custom_Model_Bag Seeker d99b16.yaml | 114 - ...g Starter Deck Investigators 35fb9c.ttslua | 1004 +- .../Custom_Model_Bag Survivor 9c814b.ttslua | 1004 +- .../Custom_Model_Bag Survivor 3c40d9.ttslua | 1004 +- .../Custom_Model_Bag Survivor c02830.ttslua | 1004 +- .../Custom_Model_Bag Survivor c02830.yaml | 8 +- .../Card A Chance Encounter (2) 6842aa.yaml | 2 +- .../Card A Test of Will (2) 71a760.yaml | 2 +- .../Card Against All Odds (2) b633d0.yaml | 2 +- .../Card Alter Fate (3) 5a1991.yaml | 4 +- .../Card Bait and Switch (3) 50acc5.yaml | 4 +- .../Card Butterfly Effect (1) 22fc6c.yaml | 45 + .../Card Close Call (2) 61d1e5.yaml | 2 +- .../Card Devil's Luck (1) ad6d9d.yaml | 2 +- .../Card Dumb Luck (2) 0c433b.yaml | 2 +- .../Card Eucatastrophe (3) 9dcdd3.yaml | 6 +- .../Card Flare (1) 910b12.yaml | 2 +- .../Card Fortune or Fate (2) 5010c5.yaml | 2 +- .../Card Infighting (3) 36bc5b.yaml | 6 +- .../Card Look what I found! (2) fd393b.yaml | 2 +- .../Card Lucky! (2) 002455.yaml | 2 +- .../Card Lucky! (3) 04d33d.yaml | 2 +- .../Card Lure (1) 76b07c.yaml | 4 +- .../Card Lure (2) ad0934.yaml | 2 +- .../Card Nothing Left to Lose (3) 6a8a9f.yaml | 4 +- .../Card Oops! (2) 9869ee.yaml | 4 +- .../Card Snare Trap (2) 234fae.yaml | 4 +- .../Card Third Time's a Charm (2) 45956a.yaml | 45 + .../Card True Survivor (3) 6a04c3.yaml | 4 +- .../Card Will to Survive (3) ac7db0.yaml | 2 +- .../Custom_Model_Bag Survivor 6e9c37.ttslua | 503 + .../Custom_Model_Bag Survivor 6e9c37.yaml | 121 + .../Card .18 Derringer (2) f8a977.yaml | 0 .../Card A Chance Encounter (2) 6842aa.yaml | 0 .../Card A Test of Will (1) 2d9585.yaml | 0 .../Card A Test of Will (2) 71a760.yaml | 0 .../Card Against All Odds (2) b633d0.yaml | 0 .../Card Alter Fate (1) 9e4e11.yaml | 0 .../Card Alter Fate (3) 5a1991.yaml | 0 .../Card Ancient Covenant (2) 840ba5.yaml | 0 .../Card Aquinnah (1) 630d65.yaml | 0 .../Card Aquinnah (3) bf6a7b.yaml | 0 .../Card Bait and Switch (3) 50acc5.yaml | 0 .../Card Brute Force (1) 7fe153.yaml | 0 .../Card Butterfly Effect (1) 22fc6c.yaml | 45 + .../Card Chainsaw (4) 382580.yaml | 0 .../Card Cherished Keepsake (1) 5a2b49.yaml | 0 .../Card Close Call (2) 61d1e5.yaml | 0 .../Card Cornered (2) a5fc16.yaml | 0 .../Card Devil's Luck (1) ad6d9d.yaml | 0 .../Card Dig Deep (2) a06013.yaml | 0 .../Card Dumb Luck (2) 0c433b.yaml | 0 .../Card Déjà Vu (5) 719a45.yaml | 0 .../Card Eucatastrophe (3) 9dcdd3.yaml | 0 .../Card Expeditious Retreat (1) ea8324.yaml | 0 .../Card Fire Extinguisher (1) dd0b79.yaml | 0 .../Card Five of Pentacles (1) 9d09f0.yaml | 0 .../Card Flare (1) 910b12.yaml | 0 .../Card Fortune or Fate (2) 5010c5.yaml | 0 .../Card Granny Orne (3) d88560.yaml | 0 .../Card Gravedigger's Shovel (2) e64769.yaml | 0 .../Card Grisly Totem (3) 4a5655.yaml | 0 .../Card Guiding Spirit (1) 13ae70.yaml | 0 .../Card Infighting (3) 36bc5b.yaml | 0 .../Card Jessica Hyde (1) a1c47b.yaml | 0 .../Card Lantern (2) b09d6f.yaml | 0 .../Card Leather Coat (1) 5b1550.yaml | 0 .../Card Look what I found! (2) fd393b.yaml | 0 .../Card Lucky! (2) 002455.yaml | 0 .../Card Lucky! (3) 04d33d.yaml | 0 .../Card Lure (1) 76b07c.yaml | 0 .../Card Lure (2) ad0934.yaml | 0 .../Card Miss Doyle (1) b337ac.yaml | 0 .../Card Newspaper (2) ea2337.yaml | 0 .../Card Nightmare Bauble (3) 1c8915.yaml | 0 .../Card Nothing Left to Lose (3) 6a8a9f.yaml | 0 .../Card Old Hunting Rifle (3) f69d7d.yaml | 0 .../Card On Your Own (3) 2ebdf1.yaml | 0 .../Card On Your Own (3) ce1a7d.yaml | 0 .../Card Oops! (2) 9869ee.yaml | 0 .../Card Peter Sylvestre (2) 584914.yaml | 0 .../Card Plucky (1) 2a37f3.yaml | 0 .../Card Quick Learner (4) 3bbc0b.yaml | 0 .../Card Rabbit's Foot (3) 00c4cc.yaml | 0 .../Card Rise to the Occasion (3) 0b9f53.yaml | 0 .../Card Scavenging (2) cda2e6.yaml | 0 .../Card Scrapper (3) c6c157.yaml | 0 .../Card Sharp Vision (1) 4d9a97.yaml | 0 .../Card Snare Trap (2) 234fae.yaml | 0 .../Card Stroke of Luck (2) bce471.yaml | 0 .../Card Survival Instinct (2) 1c3b8f.yaml | 0 .../Card Tennessee Sour Mash (3) 8cdf20.yaml | 0 .../Card Third Time's a Charm (2) 45956a.yaml | 45 + .../Card True Survivor (3) 6a04c3.yaml | 0 .../Card Try and Try Again (1) 35bbe8.yaml | 0 .../Card Try and Try Again (3) b8f774.yaml | 0 .../Card Unexpected Courage (2) 53d6d9.yaml | 0 .../Card Will to Survive (3) ac7db0.yaml | 0 .../Card Yaotl (1) 9f9e58.yaml | 0 .../Custom_Model_Bag Survivor f15fc1.ttslua | 503 - .../Custom_Model_Bag Survivor f15fc1.yaml | 119 - ..._Model_Bag The Circle Undone 0dcbe8.ttslua | 1004 +- ..._Model_Bag The Circle Undone 63e097.ttslua | 1004 +- ...odel_Bag 1 The Witching Hour 67a775.ttslua | 544 +- ...ustom_Tile The Circle Undone f697b0.ttslua | 42 +- ...el_Bag 2 At Death's Doorstep 7388bc.ttslua | 546 +- ...tom_Tile At Death's Doorstep b21125.ttslua | 46 +- ..._Model_Bag 3 The Secret Name 5c79d0.ttslua | 544 +- .../Custom_Tile The Secret Name b21125.ttslua | 46 +- ...Model_Bag 4 The Wages of Sin 1e45e8.ttslua | 544 +- ...Custom_Tile The Wages of Sin b21125.ttslua | 46 +- ...l_Bag 5 For the Greater Good a61b48.ttslua | 544 +- .../Bag Member of the Lodge 38a5f7.ttslua | 546 +- ...ag Not a Member of the Lodge abe15f.ttslua | 546 +- ...om_Tile For the Greater Good bbb70a.ttslua | 48 +- ..._Bag 6 Union and Disillusion 20f70a.ttslua | 544 +- ...m_Tile Union and Disillusion 3fe126.ttslua | 48 +- ...g 7 In the Clutches of Chaos 1ee775.ttslua | 546 +- ...te Mason is posessed by evil d14543.ttslua | 546 +- ... the secrets of the universe 92c6fc.ttslua | 546 +- ...ile In the Clutches of Chaos e0709b.ttslua | 48 +- ...ag 8 Before the Black Throne 0fad66.ttslua | 546 +- ...Tile Before the Black Throne b16392.ttslua | 48 +- ...rance at the Twilight Estate 2f008a.ttslua | 546 +- ...ustom_Tile The Circle Undone 05f912.ttslua | 42 +- ...Circle Undone Campaign Log 1 44a05a.ttslua | 1304 +- ...m_Model_Bag The Dream-Eaters a16a1a.ttslua | 1004 +- ...-A Beyond the Gates of Sleep 7f5828.ttslua | 546 +- ...Custom_Tile Campaign A Setup 075016.ttslua | 50 +- ...del_Bag 1-B Waking Nightmare 599cb7.ttslua | 544 +- ...om_Model_Bag Infestation Bag 0257a2.ttslua | 8 +- ...Custom_Tile Campaign B Setup bbb70a.ttslua | 50 +- ...ag 2-A The Search For Kadath 7b07ca.ttslua | 544 +- ...m_Tile The Search For Kadath bbb70a.ttslua | 50 +- ... A Thousand Shapes of Horror 1b4f86.ttslua | 544 +- ... A Thousand Shapes of Horror b53295.ttslua | 50 +- ...ag 3-A Dark Side of the Moon 0fad66.ttslua | 544 +- ...m_Tile Dark Side of the Moon aa8d82.ttslua | 50 +- ...l_Bag 3-B Point of No Return 4f81cf.ttslua | 544 +- ...stom_Tile Point of No Return f302ab.ttslua | 50 +- ...Bag 4-A Where the Gods Dwell 185096.ttslua | 544 +- ...stom_Tile Point of No Return 3e86c2.ttslua | 50 +- ...Bag 4-B Weaver of the Cosmos e14c76.ttslua | 546 +- .../Custom_Model_Bag Set-aside 376a06.yaml | 2 +- .../Bag Atlach-Nacha d14543.yaml | 50 - .../Bag Atlach-Nacha f0a43a.ttslua} | 546 +- .../Bag Atlach-Nacha f0a43a.yaml | 51 + .../Card Atlatch-Nacha a2f955.yaml | 6 +- .../Card Legs of Atlach-Nacha 34d21c.yaml | 6 +- .../Card Legs of Atlach-Nacha 6af4f4.yaml | 6 +- .../Card Legs of Atlach-Nacha 8b17a1.yaml | 6 +- .../Card Legs of Atlach-Nacha f4d669.yaml | 6 +- .../Custom_Tile 13f1f9.yaml | 0 .../Custom_Tile 1b6f2a.yaml | 0 .../Custom_Tile 4d1c37.yaml | 0 .../Custom_Tile 5391d4.yaml | 0 .../Custom_Tile 719afa.yaml | 0 .../Custom_Tile 7234af.yaml | 0 .../Custom_Tile 90ff22.yaml | 0 .../Custom_Tile bef50d.yaml | 0 ...tom_Tile Atlach-Nacha Helper 8e78c7.ttslua | 79 + ...ustom_Tile Atlach-Nacha Helper 8e78c7.yaml | 46 + ...om_Tile Weaver of the Cosmos bbb70a.ttslua | 48 +- ...The Dream-Quest Campaign Log f40183.ttslua | 1442 +- ...e The Dream-Quest Campaign Log f40183.yaml | 4 +- ...m_Model_Bag The Dream-Eaters a34f34.ttslua | 1004 +- ...Model_Bag The Dunwich Legacy 2898f6.ttslua | 1004 +- ... 1a Extracurricular Activity 51c0d9.ttslua | 1006 +- ...stom_Tile The Dunwich Legacy f5db25.ttslua | 42 +- ...Bag 1b The House Always Wins e3aa5c.ttslua | 1006 +- ...stom_Tile The Dunwich Legacy b5928a.ttslua | 42 +- ..._Bag 2 The Miskatonic Museum 87adbf.ttslua | 1006 +- ...m_Tile The Miskatonic Museum 703373.ttslua | 50 +- ...g 3 The Essex County Express d6e449.ttslua | 1006 +- ...ile The Essex County Express 247967.ttslua | 50 +- ...del_Bag 4 Blood on the Altar 30684d.ttslua | 1006 +- ...stom_Tile Blood on the Altar 92b54a.ttslua | 50 +- ...g 5 Undimensioned and Unseen afe7ce.ttslua | 1006 +- ...ile Undimensioned and Unseen 393c71.ttslua | 50 +- ...odel_Bag 6 Where Doom Awaits 022ddf.ttslua | 1006 +- ...ustom_Tile Where Doom Awaits a621ae.ttslua | 50 +- ...Bag 7 Lost in Time and Space 684060.ttslua | 1006 +- ..._Tile Lost in Time and Space 64a607.ttslua | 50 +- ... Dunwich Legacy Campaign Log 3f6ab6.ttslua | 1338 +- ...Model_Bag The Dunwich Legacy 5889dd.ttslua | 1004 +- ..._Model_Bag The Forgotten Age 03b888.ttslua | 1004 +- ..._Model_Bag The Forgotten Age 0bcf19.ttslua | 1004 +- ...odel_Bag 1 The Untamed Wilds e90956.ttslua | 1004 +- ...ustom_Tile The Forgotten Age e95200.ttslua | 40 +- ...odel_Bag 2 The Doom of Eztli 065ce1.ttslua | 1004 +- ...ustom_Tile The Doom of Eztli 294ec4.ttslua | 48 +- ..._Model_Bag 3 Threads of Fate 11f5c8.ttslua | 1004 +- .../Custom_Tile Threads of Fate 7a95f6.ttslua | 48 +- ...el_Bag 4 The Boundary Beyond 0ec59f.ttslua | 1004 +- ...tom_Tile The Boundary Beyond 010761.ttslua | 48 +- ...5 Heart of the Elders Part 1 2bfe00.ttslua | 1004 +- ...tom_Tile Heart of the Elders 493cb1.ttslua | 48 +- ...5 Heart of the Elders Part 2 5b2403.ttslua | 1004 +- ...l_Bag 6 The City of Archives 3170ce.ttslua | 1004 +- ...om_Tile The City of Archives 2fb6dc.ttslua | 48 +- ...del_Bag 7 The Depths of Yoth 85286a.ttslua | 1004 +- ...stom_Tile The Depths of Yoth 7aa4e3.ttslua | 48 +- ...oken Scenario - EasyStandard dd61f1.ttslua | 262 +- ..._Token Scenario - HardExpert 2da146.ttslua | 262 +- ..._Model_Bag 8 Shattered Aeons 737c5d.ttslua | 1004 +- .../Custom_Tile Shattered Aeons 6dc72a.ttslua | 42 +- ..._Model_Bag 9 Secret Scenario c52079.ttslua | 1004 +- ...e Forgotten Age Campaign Log 48b154.ttslua | 1380 +- ...Bag The Innsmouth Conspiracy 10bd18.ttslua | 1004 +- ...Bag The Innsmouth Conspiracy 465aab.ttslua | 1004 +- ...l_Bag The Innsmouth Conspiracy 465aab.yaml | 4 +- ...del_Bag 1 The Pit of Despair c09838.ttslua | 1006 +- ...ile The Innsmouth Conspiracy 16562e.ttslua | 42 +- ...he Vanishing of Elina Harper 8c6d05.ttslua | 1006 +- ... The Vanishing of Elina Harper 8c6d05.yaml | 4 +- .../Custom_Tile 9c6651.yaml | 8 +- ...he Vanishing of Elina Harper 16562e.ttslua | 25 + ... The Vanishing of Elina Harper 16562e.yaml | 44 + ...stom_Model_Bag 3 In Too Deep c3a225.ttslua | 1006 +- ...Custom_Model_Bag 3 In Too Deep c3a225.yaml | 2 +- .../Bag Keys 99972a.yaml | 6 +- .../Bag Keys 99972a/Custom_Tile 429c04.yaml | 10 +- .../Bag Keys 99972a/Custom_Tile 480325.yaml | 12 +- .../Bag Keys 99972a/Custom_Tile 8bde30.yaml | 12 +- .../Bag Keys 99972a/Custom_Tile a359d6.yaml | 10 +- .../Bag Keys 99972a/Custom_Tile d70b36.yaml | 12 +- .../Bag Keys 99972a/Custom_Tile f2a6d9.yaml | 10 +- .../Custom_Tile Flood Token eeb375.yaml | 4 +- .../Custom_Tile In Too Deep bbb70a.ttslua | 50 +- ...ustom_Model_Bag 4 Devil Reef 7ced47.ttslua | 503 + .../Custom_Model_Bag 4 Devil Reef 7ced47.yaml | 100 + .../Bag Keys 99972a.yaml | 41 + .../Bag Keys 99972a/Custom_Tile 480325.yaml | 44 + .../Bag Keys 99972a/Custom_Tile 8bde30.yaml | 44 + .../Bag Keys 99972a/Custom_Tile d70b36.yaml | 44 + .../Bag Keys 99972a/Custom_Tile f2a6d9.yaml | 44 + ...Battle With a Horrifying Devil ce45f7.yaml | 183 + .../Bag Otherwise 33d465.yaml | 183 + .../Card Churning Waters 863c96.yaml | 45 + .../Card Fishing Vessel 1b4fad.yaml | 45 + .../Card Reef of Mysteries fff4bf.yaml | 45 + .../Card Scenario f724f6.yaml | 45 + .../Card Thomas Dawson 1f7e6e.yaml | 45 + .../Custom_Model_Bag Set-aside a45247.yaml | 60 + .../Card Awakened Mantle 2afb4a.yaml | 45 + .../Card Headdress of Y’ha-nthlei a4271e.yaml | 45 + .../Card Waveworn Idol 54fd3f.yaml | 45 + ...odel_Infinite_Bag Flood Tokens 457419.yaml | 98 + ...odel_Infinite_Bag Flood Tokens 47b626.yaml | 98 + ...odel_Infinite_Bag Flood Tokens 4bec3c.yaml | 98 + ...odel_Infinite_Bag Flood Tokens fe6f38.yaml | 98 + .../Custom_PDF b71c73.yaml | 39 + .../Custom_Tile 429c04.yaml | 44 + .../Custom_Tile 47aa44.yaml | 44 + .../Custom_Tile a359d6.yaml | 44 + .../Custom_Tile Devil Reef edc524.ttslua | 25 + .../Custom_Tile Devil Reef edc524.yaml | 44 + .../Custom_Tile Flood Token 2b06f0.yaml | 44 + .../Deck Cyclopean Ruins db3d41.yaml | 138 + .../Deck Deep One Grottos 2dea23.yaml | 138 + .../Deck Devil Reefs df464a.yaml | 276 + .../Deck Encounter Deck 8cbe29.yaml | 1580 + .../Deck Temples of the Union 03f2d2.yaml | 138 + .../Deck Tidal Tunnel Deck 3d5b6e.yaml | 422 + .../Notecard 7e3c60.yaml | 35 + ...outh Conspiracy Campaign Log f40183.ttslua | 1336 +- ...odel_Bag The Path to Carcosa 899c3a.ttslua | 1004 +- ...odel_Bag The Path to Carcosa aca04c.ttslua | 1004 +- ...tom_Model_Bag 1 Curtain Call 83ccd4.ttslua | 776 +- ...tom_Tile The Path to Carcosa 16562e.ttslua | 42 +- ...om_Model_Bag 2 The Last King 6730a1.ttslua | 776 +- ...stom_Model_Bag 2 The Last King 6730a1.yaml | 36 +- .../Card Ballroom c605d3.yaml | 2 +- .../Card Courtyard 981fa3.yaml | 2 +- .../Card Dining Room aa08d4.yaml | 2 +- .../Card Discovering the Truth 3da436.yaml | 2 +- .../Card Foyer 4b6478.yaml | 2 +- .../Card Gallery cce10d.yaml | 2 +- .../Card Living Room b3c25b.yaml | 2 +- .../Card Scenario dd2d33.yaml | 2 +- .../Custom_Tile The Last King 857d0d.ttslua | 48 +- ...om_Tile The Last King Helper 47a40e.ttslua | 74 + ...stom_Tile The Last King Helper 47a40e.yaml | 44 + .../Deck Agenda Deck f00abc.yaml | 2 +- .../Deck Bystanders a2d9f5.yaml | 2 +- .../Deck Encounter Deck 0e3277.yaml | 2 +- .../Deck Sickening Reality dda125.yaml | 2 +- ...del_Bag 3 Echoes of the Past 42d2dc.ttslua | 776 +- ...stom_Tile Echoes of the Past 452210.ttslua | 50 +- ...l_Bag 4 The Unspeakable Oath e7efa6.ttslua | 776 +- ...om_Tile The Unspeakable Oath 87f45e.ttslua | 50 +- ...del_Bag 5 A Phantom of Truth bd4167.ttslua | 776 +- ...stom_Tile A Phantom of Truth b20b8d.ttslua | 50 +- ..._Model_Bag 6 The Pallid Mask eb48ff.ttslua | 776 +- .../Custom_Tile The Pallid Mask bb070d.ttslua | 50 +- ...Model_Bag 7 Black Stars Rise dd8b0d.ttslua | 776 +- ...m_Model_Bag 7 Black Stars Rise dd8b0d.yaml | 46 +- .../Bag New Chaos Token 425d3a.yaml | 6 +- .../Bag Setup Randomizer 7c8232.yaml | 10 +- .../Bag Setup Bag b29b71.ttslua | 546 +- .../Bag Setup Bag d14543.ttslua | 546 +- .../Card Abbey Church 106f19.yaml | 2 +- .../Card Broken Steps 38d12d.yaml | 2 +- .../Card Broken Steps c2651e.yaml | 2 +- .../Card Chœur Gothique b52eaf.yaml | 2 +- .../Card Chœur Gothique c7ee02.yaml | 4 +- .../Card Grand Rue 20de8b.yaml | 2 +- .../Card North Tower 69eae5.yaml | 4 +- .../Card North Tower c0362a.yaml | 4 +- .../Card Outer Wall 014bd6.yaml | 2 +- .../Card Outer Wall db972a.yaml | 2 +- .../Card Porte de l'Avancée c647a3.yaml | 2 +- .../Card Scenario 1163a0.yaml | 2 +- ...Custom_Tile Black Stars Rise 20c21d.ttslua | 50 +- .../Deck Encounter Deck c380e4.yaml | 2 +- ...stom_Model_Bag 8 Dim Carcosa ce5d30.ttslua | 776 +- .../Custom_Tile Dim Carcosa 9afdfd.ttslua | 50 +- ...om_Tile Carcosa Campaign Log ae8317.ttslua | 1510 +- ..._Model_Bag The Side Missions 2d16e1.ttslua | 1004 +- ...om_Model_Bag The Side Missions 2d16e1.yaml | 11 +- ...odel_Bag Against the Wendigo 4d5fa0.ttslua | 546 +- ...tom_Tile Against the Wendigo 82e1ed.ttslua | 40 +- ...odel_Bag Alice in Wonderland 39916d.ttslua | 1006 +- ...l_Bag 1 Arkham in Wonderland 18aa54.ttslua | 544 +- ...el_Bag 2-A A Sea of Troubles 952572.ttslua | 544 +- ..._Bag 2-B Tempest in a Teapot 8d88c8.ttslua | 544 +- ...odel_Bag 2-C Bleeding Hearts 8eb793.ttslua | 544 +- ...del_Bag 2-D Wild Snark Chase 9e33a0.ttslua | 544 +- ...odel_Bag 2-E Sibling Rivalry 0916b6.ttslua | 544 +- ...om_Model_Bag 2-F Fool's Mate bd556e.ttslua | 544 +- ..._Model_Bag 3 Lucid Nightmare e6bb63.ttslua | 544 +- ...tom_Tile Alice in Wonderland b5928a.ttslua | 42 +- ...e in Wonderland Campaign Log eda22b.ttslua | 1302 +- ...tom_Model_Bag All or Nothing 72ab92.ttslua | 1006 +- ...ustom_Model_Bag All or Nothing 72ab92.yaml | 6 +- .../Bag With Return Set 083fc2.ttslua | 546 +- .../Bag With Return Set 083fc2.yaml | 6 +- .../Bag Without Return Set d14543.ttslua | 546 +- .../Bag Without Return Set d14543.yaml | 4 +- .../Custom_Tile f797c9.yaml | 10 +- ... Custom_Tile All or Nothing 7c8eef.ttslua} | 42 +- ...=> Custom_Tile All or Nothing 7c8eef.yaml} | 10 +- .../Custom_Model_Bag Bad Blood cc7eb3.ttslua | 503 + .../Custom_Model_Bag Bad Blood cc7eb3.yaml | 103 + .../Bag Threads of Fate Locations 9c1b91.yaml | 41 + .../Card At the Station f286ef.yaml | 45 + .../Card Missing Persons 9bec2d.yaml | 45 + .../Card The Relic is Missing! b5a536.yaml | 45 + .../Card Trial of the Huntress 5611a1.yaml | 45 + .../Card A Walk Down Memory Lane 165dac.yaml | 45 + .../Card Curiositie Shoppe f61f6c.yaml | 45 + .../Card Downtown 2a3c87.yaml | 45 + .../Card Easttown 927692.yaml | 45 + .../Card Elspeth Baudin 88a71f.yaml | 45 + .../Card Hyperborean Blood a00323.yaml | 45 + .../Card Miskatonic University 0678e8.yaml | 45 + .../Card Northside 73f813.yaml | 45 + .../Card Rivertown 377b20.yaml | 45 + .../Card Scenario 847357.yaml | 45 + .../Card Town Hall c5f67a.yaml | 45 + .../Card Velma's Diner 007d36.yaml | 45 + ...m_PDF Bad Blood Campaign Guide d0aa0f.yaml | 39 + .../Custom_Tile 061a07.yaml | 135 + .../Custom_Tile 07f90c.yaml | 135 + .../Custom_Tile 34e74c.yaml | 135 + .../Custom_Tile 3d7245.yaml | 135 + .../Custom_Tile 5789a0.yaml | 135 + .../Custom_Tile 7234af.yaml | 135 + .../Custom_Tile 99909c.yaml | 135 + .../Custom_Tile adebd8.yaml | 135 + .../Custom_Tile Bad Blood 510265.ttslua | 21 + .../Custom_Tile Bad Blood 510265.yaml | 44 + .../Custom_Token Memory 00d19a.yaml | 44 + .../Custom_Token Memory 06d6fe.yaml | 44 + .../Custom_Token Memory 25f3c2.yaml | 44 + .../Custom_Token Memory 30ed35.yaml | 44 + .../Custom_Token Memory 3b4478.yaml | 44 + .../Custom_Token Memory 428e26.yaml | 44 + .../Custom_Token Memory 88e9a0.yaml | 44 + .../Custom_Token Memory b5637e.yaml | 44 + .../Custom_Token Memory ef5528.yaml | 44 + .../Deck Encounter Deck b8619a.yaml | 1434 + ...l_Bag Blood Spilled in Salem 4237da.ttslua | 546 +- ..._Tile Blood Spilled in Salem 83b781.ttslua | 40 +- ...om_Model_Bag Bridge of Sighs 578e97.ttslua | 546 +- .../Custom_Tile Bridge of Sighs 2d9794.ttslua | 40 +- ...del_Bag Carnevale of Horrors 23dd51.ttslua | 1006 +- ...Model_Bag Carnevale of Horrors 23dd51.yaml | 2 +- .../Custom_Model_Bag Set-aside a45247.yaml | 2 +- .../Card Cnidathqua 4d3a26.yaml | 12 +- ...sks 6fb734.yaml => Deck Masks 77e4d3.yaml} | 106 +- .../Custom_Tile fde05d.yaml | 10 +- ...om_Tile Carnevale of Horrors a5891b.ttslua | 26 +- .../Deck SetupResolution d5e519.yaml | 4 +- ...del_Bag Carnevale of Spiders e57017.ttslua | 546 +- ...Model_Bag Carnevale of Spiders e57017.yaml | 6 +- .../Custom_Model_Bag Set-aside a45247.yaml | 2 +- .../Bag Atlach-Nacha 3d83ce.ttslua | 273 + .../Bag Atlach-Nacha 3d83ce.yaml | 43 + .../Card Atlatch-Nacha a2f955.yaml | 0 .../Card Legs of Atlach-Nacha 34d21c.yaml | 0 .../Card Legs of Atlach-Nacha 6af4f4.yaml | 4 +- .../Card Legs of Atlach-Nacha 8b17a1.yaml | 6 +- .../Card Legs of Atlach-Nacha f4d669.yaml | 4 +- ...tom_Tile Atlach-Nacha Helper 8e78c7.ttslua | 79 + ...ustom_Tile Atlach-Nacha Helper 8e78c7.yaml | 46 + .../Bag Atlach-Nacha d14543.yaml | 42 - .../Custom_Tile 4d3553.yaml | 2 +- ...om_Tile Carnevale of Spiders a5891b.ttslua | 26 +- ...rnation on the Constellation 0ec730.ttslua | 546 +- .../Bag Additional locations d14543.ttslua | 546 +- ...rnation on the Constellation bbb70a.ttslua | 50 +- ...el_Bag Curse of the Rougarou db7039.ttslua | 1006 +- .../Bag Locations 73e53d.ttslua | 10 +- ...m_Tile Curse of the Rougarou cf0c00.ttslua | 26 +- .../Deck Act d47bca.yaml | 12 +- ...Custom_Model_Bag Dark Matter 7458b7.ttslua | 1006 +- ...rk Matter Custom Data Helper a57738.ttslua | 166 +- ...Model_Bag Electric Nightmare 2bd90b.ttslua | 1006 +- ...odel_Bag Fragment of Carcosa a492bc.ttslua | 1006 +- ...l_Bag In the Shadow of Earth 8cfe99.ttslua | 1006 +- ...ustom_Model_Bag Lost Quantum c29a78.ttslua | 1006 +- .../Custom_Model_Bag Starfall e04c21.ttslua | 1006 +- ...stom_Model_Bag Strange Moons 2ebcda.ttslua | 1006 +- ...el_Bag The Machine in Yellow 32039e.ttslua | 1006 +- ..._Model_Bag The Tatteremalion 51fbbc.ttslua | 1006 +- .../Custom_Tile 0aa185.ttslua | 1472 +- .../Custom_Tile Dark Matter b5928a.ttslua | 42 +- .../Custom_Token Memories 13bc7d.ttslua | 260 +- .../Custom_Token Memories 66dad0.ttslua | 260 +- .../Custom_Token Memories 794376.ttslua | 260 +- .../Custom_Token Memories 99db87.ttslua | 260 +- ...tom_Model_Bag Darkness Falls c6a612.ttslua | 1004 +- .../Custom_Tile Darkness Falls b5928a.ttslua | 42 +- ..._Bag Delta Green Convergence ac164e.ttslua | 546 +- ..._Tile Delta Geen Convergence 520889.ttslua | 40 +- ...om_Model_Bag Flesh and Blood 613b64.ttslua | 1006 +- ...ustom_Model_Bag Dead by Dawn c29a78.ttslua | 1006 +- ...Custom_Model_Bag Late Risers 51fbbc.ttslua | 1006 +- ...om_Model_Bag Mourning Chorus 24c385.ttslua | 1006 +- ..._Model_Bag Night on the Town 2bd90b.ttslua | 1006 +- .../Custom_Tile Flesh and Blood ac895d.ttslua | 42 +- .../Custom_Tile Flesh and Blood f5db25.ttslua | 42 +- ...m_Token Generic Campaign Log eda22b.ttslua | 1302 +- ...l_Bag Guardians of the Abyss ee987d.ttslua | 776 +- ...odel_Bag The Eternal Slumber 9ff406.ttslua | 546 +- ..._Model_Bag The Eternal Slumber 9ff406.yaml | 4 +- ...oken Scenario - EasyStandard b7af99.ttslua | 262 +- ...oken Scenario - EasyStandard e19c97.ttslua | 262 +- ...odel_Bag The Night's Usurper 578bcb.ttslua | 546 +- ...oken Scenario - EasyStandard afc7b5.ttslua | 262 +- ..._Token Scenario - HardExpert 9ed124.ttslua | 262 +- ..._Tile Guardians of the Abyss 82e1ed.ttslua | 42 +- ...m_Model_Bag Happy's Funhouse e7d9f8.ttslua | 546 +- ...Custom_Tile Happy's Funhouse c5008a.ttslua | 40 +- ...stom_Model_Bag Idol Thoughts 2d417b.ttslua | 544 +- ...del_Bag 1 Bread and Circuses 16ceab.ttslua | 546 +- ...Model_Bag 2 Enter the Dragon 4f944f.ttslua | 546 +- ...ustom_Model_Bag 3 Bon Voyage 49dfb9.ttslua | 546 +- ...om_Model_Bag 4 Cost of Azure 0fad66.ttslua | 546 +- ...stom_Tile Bread and Circuses 82e1ed.ttslua | 40 +- ...m_Model_Bag In Blackest Pits 68380c.ttslua | 544 +- .../Custom_Tile The Initiation bbb70a.ttslua | 50 +- ...del_Bag Into the Shadowlands 019847.ttslua | 546 +- .../Bag 1 Dark Reflections c1aad0.ttslua | 546 +- ...om_Tile Into the Shadowlands 770021.ttslua | 42 +- .../Bag 2 Endless Horizons b1bc62.ttslua | 546 +- ...tom_Model_Bag Jenny's Choice a61b48.ttslua | 546 +- .../Custom_Tile Jenny's Choice bbb70a.ttslua | 50 +- ...stom_Model_Bag Kaimonogatari 2df25a.ttslua | 1006 +- ...stom_Model_Bag Investigators fba392.ttslua | 1006 +- ...odel_Bag Izanami's Delegates b34bec.ttslua | 1006 +- ...ustom_Model_Bag Player Cards 64ad17.ttslua | 1006 +- ...cenario 1 - Modorimonogatari f051fc.ttslua | 1006 +- ...cenario 2A - Toshimonogatari 4076cd.ttslua | 1006 +- ...cenario 2B - Inarimonogatari ad56f2.ttslua | 1006 +- ...io 2S - Shinkansenmonogatari 8221db.ttslua | 1006 +- ...atari first, choose this bag 1a6190.ttslua | 1094 +- ...atari first, choose this bag 91392f.ttslua | 1094 +- ... Scenario 3 - Yamamonogatari b99de3.ttslua | 1006 +- ...cenario 4 - Houkaimonogatari 8f297e.ttslua | 1006 +- ...Scenario 5 - Fumeimonogatari b86938.ttslua | 1006 +- .../Custom_Tile Kaimonogatari f5db25.ttslua | 42 +- ...oken Monogatari Campaign Log eda22b.ttslua | 1282 +- ...y sny Stają się Rzeczywiścią acdf16.ttslua | 546 +- ...iwny Przypadek Benedicta Burtona bd069f.ttslua | 546 +- .../Bag Nieuchwytny 31a93a.ttslua | 546 +- .../Bag Podniebny Koncert 2889f0.ttslua | 546 +- .../Bag Przeznacznenie w Red Hook 1e00a9.ttslua | 546 +- .../Custom_Model_Bag Knightfall df62e8.ttslua | 546 +- .../Custom_Tile Knightfall 271ce2.ttslua | 40 +- ...del_Bag Last Call at Roxie's c6a1ca.ttslua | 546 +- ...om_Tile Last Call at Roxie's 567db0.ttslua | 40 +- ...s of Nyarlathotep – New York 94a1f8.ttslua | 546 +- .../Custom_Tile Core Difficulty aae2b1.ttslua | 40 +- ...m_Model_Bag Miskatonic Mouse 0954ef.ttslua | 1006 +- ...tom_Model_Bag Miskatonic Mouse 0954ef.yaml | 10 +- .../CardCustom Adventureland 492628.yaml | 0 .../CardCustom Critter Country eeedd1.yaml | 0 .../CardCustom Fantasyland 28c5d1.yaml | 0 .../CardCustom Frontierland acef56.yaml | 0 .../CardCustom Galaxy's Edge f5106e.yaml | 0 ...CardCustom Main Street, U.S.A. 1ffbbd.yaml | 0 .../CardCustom Miskatonic Mouse 1f45da.yaml | 0 .../CardCustom New Orleans Square ca86be.yaml | 0 .../CardCustom Park Entrance dbdb0f.yaml | 0 .../CardCustom The Hub c63130.yaml | 0 .../CardCustom Tomorrowland e80a41.yaml | 0 .../CardCustom Toontown 5287f3.yaml | 0 ...tom_Model Custom Data Helper aa3d8a.ttslua | 76 +- ...ustom_Model Custom Data Helper aa3d8a.yaml | 0 .../Custom_Model_Bag Set Aside daa421.yaml | 0 .../Deck A Dream Come True befb0d.yaml | 0 .../Deck Crazed Vacationer Swarms 12f5aa.yaml | 0 .../Deck Fab Five 2b1559.yaml | 0 .../Deck Souvenirs ac3c85.yaml | 0 .../Deck Weaknesses 37a019.yaml | 0 ...iskatonic Mouse Scenario Guide bda9a9.yaml | 0 .../Custom_Tile 070048.yaml | 0 .../Custom_Tile 20323b.yaml | 0 .../Custom_Tile 270525.yaml | 0 .../Custom_Tile 2875cc.yaml | 0 .../Custom_Tile 3b6978.yaml | 0 .../Custom_Tile 3bc61d.yaml | 0 .../Custom_Tile 7234af.yaml | 0 .../Custom_Tile 776283.yaml | 0 .../Custom_Tile 970ac8.yaml | 0 .../Custom_Tile 9b26d0.yaml | 0 .../Custom_Tile afed94.yaml | 0 .../Custom_Tile b1d640.yaml | 0 .../Custom_Tile c62fb5.yaml | 0 .../Custom_Tile c907e9.yaml | 0 .../Custom_Tile d37681.yaml | 0 .../Custom_Tile e600d4.yaml | 0 .../Deck Act Deck dbe757.yaml | 0 .../Deck Agenda Deck e5c753.yaml | 0 ...Deck Childlike Excitement Deck 971f55.yaml | 0 .../Deck Ecounter Deck 9e02de.yaml | 0 ...urder at the Excelsior Hotel 01d780.ttslua | 1006 +- ...urder at the Excelsior Hotel bbb70a.ttslua | 50 +- .../Deck Encounter Deck fd4231.yaml | 10 +- ...odel_Bag North Country Cycle aaceca.ttslua | 546 +- .../Bag Part 1 147dea.ttslua | 546 +- .../Bag Part 2 7f9f0d.ttslua | 546 +- .../Bag Part 3 df5156.ttslua | 546 +- .../Custom_Tile Core Difficulty ea0896.ttslua | 40 +- ...odel_Bag Of Sphinx and Sands eeeb50.ttslua | 544 +- .../Bag 1 Eye on the Prize e54f2a.ttslua | 544 +- .../Custom_Tile Core Difficulty 56a08b.ttslua | 42 +- .../Bag 2 Chaos in Cairo 6e0236.ttslua | 544 +- .../Bag 3 The Will to Triump 6d8dad.ttslua | 544 +- ...del_Bag Ordo Templi Orientis 7cf202.ttslua | 544 +- .../Bag Midnight in Paris 7cda3f.ttslua | 1008 +- .../Bag Shadows of Brocéliande 7b28eb.ttslua | 1008 +- .../Bag The München Conspiracy 286579.ttslua | 1008 +- .../Bag Tibetan Winds ba2ded.ttslua | 1008 +- ...om_Tile Ordo Templi Orientis bbb70a.ttslua | 48 +- ..._Model_Bag Parallel Universe 28e0a1.ttslua | 546 +- .../Bag c0897e.ttslua | 546 +- .../Bag 1 Nightmare or Dream f39e68.ttslua | 546 +- .../Bag 2 Awake 6ca52c.ttslua | 546 +- .../Custom_Tile Core Difficulty 56a08b.ttslua | 40 +- ...Bag Pokemon Eldritch Edition 75fe78.ttslua | 1004 +- ...emon To An Existing Campaign 7b57ad.ttslua | 546 +- .../Bag Basic Pokemon d14543.ttslua | 546 +- .../Bag Pokemon Investigators 05109d.ttslua | 546 +- ...Bag Scenario 1 The Conjuring e1caf1.ttslua | 546 +- ...ile Pokemon Eldritch Edition 3837a5.ttslua | 40 +- ...Scenario 2a The Winding Road 61801e.ttslua | 546 +- ...b Shipments From The Unknown 13ed7d.ttslua | 546 +- .../Bag Scenario 3a Viridian f040a6.ttslua | 546 +- ...Bag Scenario 3b Deep Secrets 3da6dd.ttslua | 546 +- ...g Scenario 4 The Unconjuring 52d102.ttslua | 546 +- ...Side-Story 1 Eldritch Safari 1fae15.ttslua | 546 +- .../Custom_Tile Eldritch Safari 3837a5.ttslua | 40 +- ...ide-Story 2 Project Cerulean 4c07bf.ttslua | 546 +- ...Custom_Tile Project Cerulean 3837a5.ttslua | 40 +- .../Bag Upgrade Pokemon 2cea4e.ttslua | 546 +- .../Custom_Token Campaign Log eda22b.ttslua | 1302 +- ...Custom_Model_Bag Read or Die 9e73fa.ttslua | 1006 +- .../Custom_Model_Bag Read or Die 9e73fa.yaml | 2 +- .../Custom_Tile Read or Die b5928a.ttslua | 42 +- .../Deck Encounter Deck 556e96.yaml | 6 +- ...stom_Model_Bag Strange Aeons 2abdd6.ttslua | 546 +- .../Bag 1 In Search Of Sanity 961940.ttslua | 546 +- .../Bag 2 The Thrushmoor Terror eea51b.ttslua | 546 +- .../Custom_Tile Strange Aeons 82e1ed.ttslua | 42 +- ...om_Model_Bag Stranger Things 408301.ttslua | 546 +- .../Custom_Tile Stranger Things bc825a.ttslua | 40 +- ...el_Bag The Approaching Storm 0fad66.ttslua | 546 +- ...odel_Bag The Approaching Storm 0fad66.yaml | 10 +- .../Bag 1 Plot Uncovered 67d524.ttslua | 546 +- .../Bag 2 Dark Waters 90aab1.ttslua | 546 +- .../Bag 3 Curiosities 20982e.ttslua | 546 +- .../Bag 4 Shadow Rails 3a3b5a.ttslua | 546 +- .../Bag 5 lair of the Cult 266dcb.ttslua | 546 +- .../Bag 6 Domain of Baal 84cdaf.ttslua | 546 +- ...m_Tile The Approaching Storm 7521a9.ttslua | 40 +- ...The Blob that Ate Everything 4dee5a.ttslua | 1004 +- .../Bag Epic Multiplayer 2c10cf.ttslua | 546 +- .../Bag Single Group 830305.ttslua | 546 +- ...F The Blob that Ate Everything 36b4eb.yaml | 2 +- ...The Blob that Ate Everything bbb70a.ttslua | 48 +- .../Deck Starting Locations fd7be1.yaml | 10 +- ...stom_Model_Bag The Collector 9810eb.ttslua | 546 +- .../Custom_Tile The Collector 150603.ttslua | 40 +- ..._Bag The Colour out of Space 5b81ff.ttslua | 546 +- ...Tile The Colour out of Space 2e887e.ttslua | 40 +- ...el_Bag The Curse of Amulotep 0d7a8d.ttslua | 546 +- ...om_Tile The Curse of Amultep b3cbc1.ttslua | 40 +- ...tom_Model_Bag The Dying Star bcfff6.ttslua | 546 +- .../Bag Part 1 b310b9.ttslua | 546 +- .../Custom_Tile The Dying Star 8d62ae.ttslua | 40 +- .../Bag Part 2 c2a55d.ttslua | 546 +- .../Custom_Tile The Dying Star a148f2.ttslua | 40 +- ...ustom_Model_Bag The Festival 29d22a.ttslua | 546 +- .../Custom_Tile The Festival 4b81f6.ttslua | 40 +- ...odel_Bag The Grand Oak Hotel 4255b1.ttslua | 546 +- .../Custom_Tile Core Difficulty 9cd1ad.ttslua | 40 +- ...Bag The Labyrinths of Lunacy 4c173f.ttslua | 776 +- ...l_Bag The Labyrinths of Lunacy 4c173f.yaml | 4 +- .../Bag Epic Group A 79b534.ttslua | 546 +- .../Bag Epic Group A 79b534.yaml | 8 +- .../Bag Epic Group B c7c4c1.ttslua | 546 +- .../Bag Epic Group B c7c4c1.yaml | 8 +- .../Bag Epic Group C c352ac.ttslua | 546 +- .../Bag Epic Group C c352ac.yaml | 6 +- .../Bag Single Group A 2ea2a2.ttslua | 546 +- .../Bag Single Group A 2ea2a2.yaml | 4 +- .../Bag Single Group B 14808b.ttslua | 546 +- .../Bag Single Group B 14808b.yaml | 8 +- .../Bag Single Group C 76b476.ttslua | 546 +- .../Bag Single Group C 76b476.yaml | 8 +- ...ile The Labyrinths of Lunacy f4dcee.ttslua | 42 +- ..._Tile The Labyrinths of Lunacy f4dcee.yaml | 10 +- ... The Legend of Sleepy Hollow b46db2.ttslua | 1006 +- ... The Legend of Sleepy Hollow bbb70a.ttslua | 26 +- ...m_Token Generic Campaign Log eda22b.ttslua | 1018 +- ...tom_Model_Bag The London Set 0f96ac.ttslua | 546 +- .../Bag 1 A Loving Spouse 4c5c55.ttslua | 546 +- .../Custom_Tile A Loving Spouse ea41d9.ttslua | 42 +- .../Bag 2 Mrs Tillywingers Cat c56f66.ttslua | 546 +- ...om_Tile Mrs Tillywingers Cat 0ae91a.ttslua | 42 +- ... 3 Disgracing Alderman Whitn 905ad3.ttslua | 546 +- ... Disgracing Alderman Whitney c2736e.ttslua | 42 +- ...m_Model_Bag The Nephew Calls 3ddd12.ttslua | 546 +- ...Custom_Tile The Nephew Calls 54707a.ttslua | 40 +- ...ustom_Model_Bag The Outsider 3c175c.ttslua | 546 +- .../Bag Part 1 526ff9.ttslua | 546 +- .../Bag Part 2 5b3ac7.ttslua | 546 +- .../Bag Part 3 d166f2.ttslua | 546 +- .../Custom_Tile The Outsider d5b06c.ttslua | 40 +- ...m_Model_Bag The Pensher Wyrm 504f38.ttslua | 546 +- ...Custom_Tile The Pensher Wyrm c606a1.ttslua | 42 +- ...ustom_Model_Bag The Red Room fa4327.ttslua | 546 +- ...odel_Bag The Stolen Baillius bfefd4.ttslua | 546 +- .../Custom_Tile Core Difficulty ec7a73.ttslua | 40 +- ...Model_Bag The Svalbard Event 7bc42b.ttslua | 546 +- .../Custom_Tile Core Difficulty a751fe.ttslua | 40 +- ...g The Symphony of Erich Zann b7c6be.ttslua | 1004 +- ...tom_Model Custom Data Helper c0b834.ttslua | 74 +- ...e The Symphony of Erich Zann f4c93e.ttslua | 50 +- ...l_Bag The Thing in the Woods c90c49.ttslua | 546 +- .../Custom_Tile Core Difficulty 2261a5.ttslua | 40 +- ...el_Bag The War of the Worlds 19d469.ttslua | 1004 +- ...om_Model_Bag 1 First Contact f70a0d.ttslua | 544 +- ...odel_Bag 2 Phobos and Deimos 313523.ttslua | 544 +- ...del_Bag 3 The Thirsting Void a0d2b1.ttslua | 544 +- ...ustom_Tile War of the Worlds b5928a.ttslua | 40 +- ...r of the Worlds Campaign Log eda22b.ttslua | 1362 +- ...el_Bag War of the Outer Gods fc7674.ttslua | 503 + ...odel_Bag War of the Outer Gods fc7674.yaml | 114 + .../Card Arkham c21137.yaml | 45 + ...ard Athenaeum of the Empty Sky fa15cd.yaml | 45 + .../Card Chateau Ramezay 790c3a.yaml | 45 + .../Card Disciple of the Swarm 677a88.yaml | 45 + .../Card Nihilistic Stargazer 7f901e.yaml | 45 + .../Card Scenario 1ade36.yaml | 45 + .../Card Shrine of Magh’an Ark’at b57f26.yaml | 45 + .../Card Streets of Montréal 262233.yaml | 45 + .../Card Streets of New York City 473d21.yaml | 45 + .../Card Streets of Providence be7797.yaml | 45 + .../Card The Arcade b976f6.yaml | 45 + .../Card The Burning Pit f52a2e.yaml | 45 + .../Card The Penthouse d9e9ca.yaml | 45 + .../Card Zealot of Paradise f2b1dd.yaml | 45 + .../Custom_Model_Bag Set-aside 7b0f72.yaml | 62 + .../Card Hub Dimension 377fcf.yaml | 45 + .../Deck Children of Paradise 6f56e0.yaml | 468 + .../Deck Death of Stars db0ac4.yaml | 468 + .../Deck Story Assets 377a7c.yaml | 276 + .../Deck Swarm of Assimilation a5b82d.yaml | 468 + ...stom_PDF War of the Outer Gods 36b4eb.yaml | 39 + .../Custom_Tile 012f6e.yaml | 135 + .../Custom_Tile 308d21.yaml | 135 + .../Custom_Tile 30c009.yaml | 135 + .../Custom_Tile 354cd0.yaml | 135 + .../Custom_Tile 638f24.yaml | 135 + .../Custom_Tile 7234af.yaml | 135 + .../Custom_Tile b2f67d.yaml | 135 + .../Custom_Tile ca62fc.yaml | 135 + .../Custom_Tile dcb5db.yaml | 135 + .../Custom_Tile f7e308.yaml | 135 + .../Custom_Tile fc5dce.yaml | 135 + .../Custom_Tile fe6ec3.yaml | 135 + ...m_Tile War of the Outer Gods dcb241.ttslua | 25 + ...tom_Tile War of the Outer Gods dcb241.yaml | 44 + .../Deck Act Deck 01a1bf.yaml | 184 + .../Deck Blue Agenda Deck 119ff4.yaml | 184 + .../Deck Encounter Deck 3111c8.yaml | 928 + .../Deck Green Agenda Deck 1375c8.yaml | 184 + .../Deck Red Agenda Deck a96a99.yaml | 184 + ...ustom_Model_Bag Winter Winds 754057.ttslua | 546 +- .../Bag Frozen Tracks 11429d.ttslua | 546 +- .../Bag Stranded in the Urals 8077a1.ttslua | 546 +- .../Bag The Forgotten Village ddd10b.ttslua | 546 +- .../Custom_Tile Winter Winds d54710.ttslua | 40 +- ...tom_Model_Bag Weakness decks 750fdd.ttslua | 1004 +- ...ustom_Model_Bag Weakness decks 750fdd.yaml | 2 +- ...tom_Model_Bag Weakness decks 1ae6a4.ttslua | 503 + ...stom_Model_Bag Weakness decks 1ae6a4.yaml} | 32 +- .../Deck Advanced 15e75e.yaml | 0 .../Deck All Weaknesses d95bd6.yaml | 3284 +- .../Deck Core 728f7e.yaml | 0 ...ck Return to The Forgotten Age c0f36d.yaml | 0 ... Return to The Path to Carcosa 9c5822.yaml | 0 ...k Return to the Dunwich Legacy 0b361d.yaml | 0 .../Deck Starter Decks 120210.yaml | 0 .../Deck The Circle Undone f9215d.yaml | 0 .../Deck The Dream-Eaters c97be9.yaml | 0 .../Deck The Dunwich Legacy 0da7f2.yaml | 0 .../Deck The Forgotten Age 62c248.yaml | 0 .../Deck The Innsmouth Conspiracy 516413.yaml | 0 .../Deck The Path to Carcosa 193ddf.yaml | 0 ...tom_Model_Bag Weakness decks ceacbf.ttslua | 503 - .../Deck All Weaknesses d95bd6.yaml | 3284 +- ...del_Infinite_Bag Horror tokens 7bd2a0.yaml | 4 +- ...del_Infinite_Bag Horror tokens ae1a4e.yaml | 4 +- ...del_Infinite_Bag Horror tokens c3ecf4.yaml | 4 +- ...l_Infinite_Bag Resource tokens 0168ae.yaml | 6 +- ...l_Infinite_Bag Resource tokens 9fadf9.yaml | 6 +- ...l_Infinite_Bag Resource tokens fd617a.yaml | 6 +- unpacked/Custom_Tile b9140e.yaml | 2 +- .../Custom_Tile Data Helper 708279.ttslua | 3502 +- .../Custom_Tile Deck Importer 928c8e.yaml | 72 - ...stom_Tile New Deck Importer edad66.ttslua} | 1005 +- .../Custom_Tile New Deck Importer edad66.yaml | 44 + ...ustom_Tile Playermat 1 White 8b081b.ttslua | 810 +- ...stom_Tile Playermat 2 Orange bd0ff4.ttslua | 810 +- ...ustom_Tile Playermat 3 Green 383d8b.ttslua | 810 +- .../Custom_Tile Playermat 4 Red 0840d5.ttslua | 810 +- unpacked/Custom_Token b7b45b.ttslua | 396 +- unpacked/Custom_Token b7b45b.yaml | 6 +- .../Custom_Token Agenda Deck 85c4c6.ttslua | 262 +- ...Token Chaos Bag Stat Tracker 766620.ttslua | 200 +- unpacked/Custom_Token Damage 1f5a0a.ttslua | 260 +- unpacked/Custom_Token Damage 591a45.ttslua | 260 +- unpacked/Custom_Token Damage e64eec.ttslua | 260 +- unpacked/Custom_Token Damage eb08d6.ttslua | 260 +- unpacked/Custom_Token Horror 0257d9.ttslua | 260 +- unpacked/Custom_Token Horror 468e88.ttslua | 260 +- unpacked/Custom_Token Horror 7b5729.ttslua | 260 +- unpacked/Custom_Token Horror beb964.ttslua | 260 +- ...om_Token Master Clue Counter 4a3aa4.ttslua | 310 +- unpacked/Custom_Token Playarea 721ba2.ttslua | 426 +- unpacked/Custom_Token Resources 4406f0.ttslua | 260 +- unpacked/Custom_Token Resources 816d84.ttslua | 260 +- unpacked/Custom_Token Resources a4b60d.ttslua | 260 +- unpacked/Custom_Token Resources cd15ac.ttslua | 260 +- unpacked/Deck a9ec03.yaml | 230 + ...am SCE 1.51 - 1172020 - Page 1 094d4d.yaml | 202 - ...am SCE 1.52 - 1252020 - Page 1 af01b8.yaml | 329 + 2803 files changed, 240674 insertions(+), 196057 deletions(-) create mode 100644 unpacked/Bag All Player Cards 15bb07.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .18 Derringer (2) f8a977.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .18 Derringer 101a41.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .25 Automatic a5087b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .32 Colt (2) c026c9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .32 Colt b0f851.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .35 Winchester (Taboo) 41e560.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .35 Winchester ebdd78.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .41 Derringer (2) f57af7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .41 Derringer fe2db3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .45 Automatic (2) fe0cc0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .45 Automatic 12660b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) b492cb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) d4dbc7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card .45 Thompson 2c6509.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter (2) 0edef1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter 3f3488.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card A Glimmer of Hope f21109.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card A Test of Will (1) 4cfcc7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card A Test of Will (2) 71a760.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card A Test of Will 48e516.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 79b4af.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Abbess Allegria Di Biase 1e7f1b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Abigail Foreman (4) 97e9ce.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Able Bodied 051742.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Abyssal Tome (2) a2d392.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Accursed Fate 85e7d9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Accursed Follower ef91a9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) (Taboo) e5d5f0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) 074858.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ace of Rods (1) 52a677.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ace of Swords (1) c4d436.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Across Space and Time fb943f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Act of Desperation 0bea17.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Adaptable (1) 731d2a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Against All Odds (2) c077bf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Agency Backup (5) d6eda3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation (2) 283e54.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation 54832d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Alejandro Vela c49b4b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Alice Luxley ae20e0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card All In (5) (Taboo) ff1dfe.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card All In (5) 7d3a27.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Alter Fate (1) 9e4e11.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Alter Fate (3) 83c86b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Alyssa Graham 53867b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ambush (1) a1fd61.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Amnesia 2210c1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Analytical Mind 7b6ab5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Anatomical Diagrams a8e495.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ancient Ankh 0ce113.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (1) 9bc46e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 3289b0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 863f91.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 9c56d3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Angered Spirits d8705c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Anna Kaslow (4) 03a4de.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Another Day, Another Dollar (3) 006d44.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Anything You Can Do, Better 2c563c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Aquinnah (1) 9393ec.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Aquinnah (3) fb9dbb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Arbiter of Fates 4fbdb2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Arcane Enlightenment e69708.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate (3) 65b30d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate 7307c4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Arcane Insight (4) 536b52.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Arcane Research e425d0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (2) 644af9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (4) ca23d4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Arcane Studies 9e4505.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 3d35aa.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 66d5a3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) a14a11.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs cbfc12.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Armageddon 3feff1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Armor of Ardennes (5) f7a9ab.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Arrogance b2e5b0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Art Student 07a8f0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Astounding Revelation 7686cb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Astral Travel 31d087.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Atychiphobia a3bc7a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Augur cf9ca8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card August Lindquist 83b588.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Azure Flame (3) c5fb42.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Azure Flame (5) 0ee874.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Azure Flame 17319c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Backpack (2) 389a34.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Backpack f59085.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Backstab (3) 7baf75.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Backstab cdfd9f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bait and Switch (3) 864fb6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bait and Switch 2c2d9a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bandolier (2) e8b7ad.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bandolier 82775a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Banish (1) a00fca.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Baron Samedi 16ad5d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Barricade (3) 2e3115.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Barricade edb554.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 48e103.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bauta 9c9196.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bear Trap 74840a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Beat Cop (2) 7001be.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Beat Cop 7d4749.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Becky 587589.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Belly of the Beast dffa9d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Beloved b4666d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Beretta M1918 (4) 91da6b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bind Monster (2) ba1460.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Blackjack (2) 37a2b5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Blackjack 097dcc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Blade of Ark'at db8043.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Blessed Blade cf4571.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Blinding Light (2) 8254d4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Blinding Light 30f860.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (1) 5efc92.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (3) 53d765.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Blood Pact (3) 64e131.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Blood Pact fc709b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Blood-Rite eafd12.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bloodlust aafc17.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bloodstained Dagger d71f11.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Book of Psalms cc1ef3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (1) 35166c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (3) 296dc8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Borrowed Time (3) 0db666.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bought in Blood 275dc3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bounty Contracts 4d9b32.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves (3) 54293e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves db4a43.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering 31cfbf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Brother Xavier (1) 3c9617.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Brute Force (1) fb9b7e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bulletproof Vest (3) c4cf62.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Burglary (2) 2aeb8a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Burglary bc3451.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Burning the Midnight Oil 0d29be.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Bury Them Deep e6efe6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Butterfly Effect (1) 22fc6c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Call of the Unknown 86feae.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Called by the Mists e628de.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Calling in Favors 9b9e8b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cat Burglar (1) 2fe723.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Catling Gun deea7a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Caught Red-Handed ecd087.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Celaeno Fragments d287bc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Chainsaw (4) d40f4e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Charisma (3) 9e6c55.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Charles Ross, Esq. 4a2a36.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Charon's Obol (1) 1dbc95.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cheap Shot (2) 0b963c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cheap Shot b8c93a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cheat Death (5) 3add54.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake (1) 5a2b49.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake 215cec.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Chew Toy of Nightmares bbf1af.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Chicago Typewriter (4) ecfa42.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Chronophobia eeb330.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (5) 0e72b6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (3) f5d382.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (5) e21200.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Clairvoyance b67371.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind (3) a53344.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind 8e57b8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Clasp of Black Onyx f295d9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Clean Them Out 3319be.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cloak of the Outer Realm 4e1e79.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Close Call (2) 6aae86.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket (2) 8dda2d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket 5a305e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Combat Training (1) bd3ecc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Connect the Dots 13413d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Contraband (2) 620b6e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Contraband b4ad29.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Copycat (3) de40c8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cornered (2) c6c260.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Counterpunch (2) 92436b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) 2236f6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Coup de Grâce 2240f9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cover Up ca25bc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Crack the Case 8dce44.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Crisis of Faith 8b68f4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity 367aac.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire fbfa24.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cryptic Research (4) 5d25b1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings (2) 870bdc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings ff2776.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cryptographic Cipher 4f3142.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Crystal Pendulum 6c3156.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 8f871b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Crystallizer of Dreams e3bd71.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cunning Distraction e8ea95.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Cunning e2767a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Curiosity 9e5cd2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Curse of the Rougarou 569b06.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Custom Ammunition (3) f03baa.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag 321cb7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Daredevil (2) b3cad4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Daredevil e4688b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Daring 91e53c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver (2) fc82a5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver cc6b14.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dario El-Amin 5ec1a2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dark Future 3aa40e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dark Horse 1b4434.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dark Insight f08934.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dark Memory 580a4d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dark Memory c025bf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dark Pact dd3d09.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy da7613.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dark Ritual b2b554.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card David Renfield 1f8539.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning a9d77d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dayana Esperence (3) 4f2489.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card De Vermis Mysteriis (2) b40b98.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Death • XIII (1) 2e5b03.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Deciphered Reality (5) 8b0193.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Decorated Skull (3) 946a58.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Decorated Skull 07350b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Decoy 2ee50e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Deduction (2) 95272b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Deduction b265c4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Deep Knowledge b176fc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Defiance (2) bf3dd1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Defiance 59b24f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Delay the Inevitable 683937.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Delilah O'Rourke (3) 97a795.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep (Taboo) d4a68a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep 14e212.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dendromorphosis 121b2d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Deny Existence (5) d24531.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Deny Existence 8aa0c3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Desperate Search 45bdf0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Detached from Reality d12359.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Detective's Colt 1911s f4bac6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Devil's Luck (1) 812685.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dig Deep (2) 0414b4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dig Deep fc9e1b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna (2) b00b76.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna d6c44a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dodge e0dff3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dog Monocle 041012.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dogcatchers 99800f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Doomed ba2ae1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Double or Nothing (Taboo) f98f6f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Double or Nothing efb09b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Double, Double (4) 0e0530.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dr. Elli Horowitz 27e7b3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dr. Francis Morgan f03306.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dr. Henry Armitage 66197b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher (Taboo) 8ae314.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher 9934d2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson 234ff6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Drawing Thin (Taboo) 3d08dc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Drawing Thin 6d9881.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Drawing the Sign 3b3c0a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Drawn to the Flame a8298f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dread Curse c54d7e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dreaded End 4b2e72.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) 5f9a10.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) e5f9cb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) ea40f6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dream Diary b81dcf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dream Parasite ae16e8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dream-Enhancing Serum 98c5af.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dream-Gate fa4c1e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dreams of the Deep 13eaf0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Duke 876557.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dumb Luck (2) 0c433b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dumb Luck f0e425.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (2) e35bc2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (3) 14dcc4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast 97986a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Déjà Vu (5) 719a45.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Earl Sawyer f14dce.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Easy Mark (1) cdbb37.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Eat lead! (2) fc2629.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Eat lead! a2c7ef.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Eavesdrop 256da2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Eidetic Memory (3) 814ce2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Elder Sign Amulet (3) 324e49.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration (1) e84eff.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration ff3f17.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Elina Harper 7e2896.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Elusive (Taboo) 34140c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Elusive 833305.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Emergency Aid 9c46da.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (2) 8948c4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (3) 408cb5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Emergency Cache 510c0d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 3d22c4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 4c0f00.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) ffe4dd.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Empty Vessel (4) c0d236.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) 84b918.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) d0de54.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade c7d9b5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Enchanted Skull 19094d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Encyclopedia (2) f5bcec.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Encyclopedia dbb0e0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Enraptured a5c780.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (1) 0ce005.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (2) 2172e2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Essence of the Dream 6ad46b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ethereal Form db90e2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) eaaee9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Eureka! ffa4f9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (1) bb640d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Evidence! (1) 3df5fb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Evidence! 2db518.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Expedition Journal 9dc3d4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Expeditious Retreat (1) ea8324.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (1) 2e93fd.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (3) 77f92c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Extensive Research (1) 3dc25c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Extensive Research 013446.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Extra Ammunition (1) f60263.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos 9a5782.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card False Awakening 0de10c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card False Awakening 3bf831.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card False Covenant (2) 3442f5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Familiar Spirit 971d52.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Farsight (4) b4121c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Faustian Bargain 17d34b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fearless (2) b2e27e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fearless cd0ac1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Feed the Mind (3) bc4788.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Feed the Mind a614de.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Feline Discombobulator 7031aa.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fence (1) 2423e7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fieldwork d6771f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fight or Flight 00af4f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 2c901b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fine Clothes 5cb973.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fine Print 39452d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit b9bb2a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Finn's Trusty .38 848d9c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fire Axe 9da37c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (1) 8a4673.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card First Aid (3) bc80ab.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card First Aid 5cd622.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card First Watch 0bb3da.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fishing Net c7b748.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Five of Pentacles (1) 46187b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) (Taboo) 8f170b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) cf4f15.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Flare (1) 017821.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Flashlight bb1cce.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Flesh Ward 52c686.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Followed 0cc3e7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fool me once... (1) b6506d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Foolishness fa777f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Forbidden Knowledge 80acd2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) 2f4507.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) f375bf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome 0a4d22.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Forewarned (1) c17f2c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fortuitous Discovery dacbf0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Fortune or Fate (2) e674e8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Foul Odor bc4a74.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Four of Cups (1) dd4e2a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Friendly Human 448d3a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Galvanize (1) 9e7f6a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Garrote Wire (2) b45c82.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Gate Box b8c891.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Gavriella Mizrah 2237f4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Get over here! (2) 415ca2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Get over here! 5b0f86.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ghastly Revelation b7c503.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Gilded Volto d0e108.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (1) 6e4d54.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (5) 090fcf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Glory 273584.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Granny Orne (3) 52a66f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Granny Orne 1cccfe.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel (2) 96a440.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel 3fe6de.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Graveyard Ghouls 80b7c6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Green Man Medallion c729ab.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Gregory Gry 90bf93.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Grete Wagner (3) b39b78.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Grete Wagner f6dfe5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Grimm's Fairy Tales 1d75d0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 1433eb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 5fae20.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Grisly Totem a20887.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Grit Your Teeth a92a90.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (2) 6b2e97.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (4) 07bc04.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Grounded (1) 98fc57.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Guard Dog 08bdf1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Guardian Angel 3c0249.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Guardian of the Crystallizer aec357.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Guidance bbfe9b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Guiding Spirit (1) f91e14.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Guts (2) 219c78.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Guts 8f7289.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hair of the Dog 61c4c5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror 312d38.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hand of Fate 1ad931.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Handcuffs 5f33be.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (2) 15643b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 68744b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Haste (2) 1bd139.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hatchet Man 857238.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Haunted 249d83.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hawk-Eye Folding Camera 5ada0a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Healing Words bba97a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea 23c694.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea bf151d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hemispheric Map (3) d2663c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Henry Wan 9df9df.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue (2) 93381d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue bb0f6a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hiding Spot dd130e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card High Roller (2) ce1b89.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) (Taboo) 833501.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) d48b25.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Higher Education 8595fb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hired Dogs 44bc00.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hired Muscle (1) cdd6aa.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Holy Rosary fa1d67.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hoods 785f68.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hope 45c582.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hospital Debts 47d6c9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hot Streak (2) f2508d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hot Streak (4) 4eb231.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Howl of Clyhf'ford 952924.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (2) 23c3e5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hyperawareness e5dd39.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (2) e2bc49.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze 8f3c8e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hypnotic Therapy 7f1b48.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Hypochondria 88ee43.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card I'll see you in hell! 84ba9d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card I'm done runnin'! d8a324.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card I'm outta here! 62cf25.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card I've got a plan! (2) 344e90.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card I've got a plan! acd0da.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card I've had worse… (2) 76147b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card I've had worse… (4) 3b6834.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ichtaca 29fc24.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card If it bleeds... acf2b0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Impromptu Barrier 9591ac.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Improvisation 9aee7f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Improvisation 9ef062.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Improvised Weapon 30f90b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card In the Know (1) 7b42b6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card In the Shadows 2561b9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Indebted b2ef43.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (3) 943332.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (5) f00301.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth c6caf6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Infighting (3) c803ba.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Inquiring Mind 5c3aea.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Inspiring Presence 80628f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Intel Report 5115d9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Internal Injury 4fb446.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Interrogate c70ad8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Intrepid 99d061.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Investments b65011.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Jake Williams 7c958e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Jenny's Twin .45s d87128.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Jerome Davids d99735.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Jessica Hyde (1) b8380d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) 6bae15.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 03c6a7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil (3) 48c9ff.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil b51688.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card John & Jessie Burke cfb393.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Keen Eye (3) 2f9de4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Keen Eye 0dc75e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Keep Faith 8b46b2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Kerosene (1) 25ad44.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) (Taboo) 244d61.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) 1c98ff.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Khopesh of the Abyss dc674e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Kleptomania 447a08.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Knife 0ab3f1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power (Taboo) eccb8a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power 6de21b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Knuckleduster 5690d1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Kukri 756a35.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Laboratory Assistant c18ebe.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lady Esprit 37a76b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lantern (2) bda4fd.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lantern e66002.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Last Chance 1fe462.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Leadership (2) 80fafa.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Leadership 83d8d7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Leather Coat (1) 5b1550.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Leather Coat 593deb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Leather Jacket dfbc13.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Leo De Luca (1) 27446e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Leo De Luca eaa415.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lesson Learned (2) 037b2e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Let God sort them out... d3dcf1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Let me handle this! 36c0cb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Library Docent (1) fab3a9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lightning Gun (5) 2d362c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Liquid Courage (1) 5065a6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Liquid Courage c33a10.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lita Chantler 3c1944.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Live and Learn 050ba1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lockpicks (1) edd6c4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lockpicks cc11e4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lodge Debts acce72.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning (4) 1258c6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning 812175.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lola Santiago (3) 8bec05.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lone Wolf dc3b07.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lonnie Ritter ad0ef0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Look what I found! (2) fd393b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Look what I found! 88d3c0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lost Soul 4f903e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lt. Wilson Stewart 4120f3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lucid Dreaming (2) 122e98.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case (3) 0feb74.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case c607c5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (2) 9dd911.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lucky! (2) 439af2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lucky! (3) 04d33d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lucky! ce0dd5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lupara (3) a6af13.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lure (1) d88407.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Lure (2) 1a90a4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card M1918 BAR (4) b1ad65.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Machete (Taboo) 6411d5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Machete 86ee68.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Madame Labranche 1ee492.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass (1) 378e84.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass 8cc0a6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (1) c55160.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (2) 14424c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity (2) 982716.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity 679b13.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mariner's Compass 4e2d75.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Marksmanship (1) 6a9021.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mauser C96 (2) 725690.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mauser C96 f32343.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Meat Cleaver a57f19.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Medical Texts ba16cb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Medico Della Peste 6179d5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mi-Go Weapon 2fc31c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mind Over Matter (2) 9b1c5b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (1) 5d6e57.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (3) e72762.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mind over Matter 8cf335.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mind's Eye (2) ad58aa.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Miss Doyle (1) e1aedf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (2) 3d57b4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (4) 68fce2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh 5558f1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mitch Brown f91fd9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mk 1 Grenades (4) 0ab574.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mob Enforcer b239d7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Molly Maxwell 692ced.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Moment of Respite (3) 523b76.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Momentum (1) d753d7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Money Talks 276477.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Monster Slayer (5) e21854.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Monster Slayer 63b3e5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Monstrous Transformation 96ae32.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual 1cd2bd.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Moonstone 0d006f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card More Bark Than Bite 29bafb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Moxie (1) 5fe780.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mr. Rook (Taboo) a8afba.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mr. Rook 1339b0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mysteries Remain 274daa.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mysterious Raven 59e40d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Mystifying Song 3b8cb7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Naomi O'Bannion 7f7ecc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Narcolepsy 57e648.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Narrow Escape f6ff32.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Nautical Prowess 9d6e9a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Neither Rain nor Snow 6da7c4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Newspaper (2) 9bcdee.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Newspaper ee20c9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Nightmare Bauble (3) d6f6f1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Nihilism fc4168.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Nimble b8843c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card No Sense of Space or Time 1e6cae.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned (5) 1f3f16.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned 44cf4a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Not without a fight! d1d7fa.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Nothing Left to Lose (3) f0389b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Obfuscation 5ec6d0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Obscure Studies c5d8a9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Obsessive a2e7d7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Occult Evidence 3586e6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Occult Invocation 010509.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon 5d6728.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Occult Scraps 6aea76.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Offer You Cannot Refuse e27c93.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore (3) 8a0060.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore 063fd8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Old Hunting Rifle (3) 44a37f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Old Keyring 5888da.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Old Shoe 87f6b9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Olive McBride 9683d0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) 2ebdf1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) b0c61c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card On the Hunt a13ca4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card On the Lam f7095f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card One-Two Punch (5) 8ffa44.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card One-Two Punch 22bb1e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Oops! (2) 70772b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Oops! 59d89b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Open Gate a33acd.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Opportunist (2) 63f145.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Opportunist a88392.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ornate Bow (3) 2acced.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Otherworld Codex (2) df0e22.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Otherworldly Compass (2) 19ab7c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Out of Body Experience d64b8f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Out of Doggie Treats 197242.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Overpower (2) 017e1f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Overpower 5ab9f4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Overzealous 88a9b3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Painkillers 0c859f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pantalone 7f1927.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Paradoxical Covenant (2) 541ee9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Parallel Fates 47bdba.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Paranoia c17498.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) (Taboo) ecbea8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) 7f99cc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Patrice's Violin ea0007.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pay Day (1) 9f0b34.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen 9b0dcf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Penny White 73bccf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Perception (2) 96b5ed.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Perception c6ac19.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Perseverance 0a390e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Persuasion 1b0235.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pet Oozeling 26398a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre (2) e1e098.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre ffdeb5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Physical Training (2) d708d9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Physical Training (4) ab51ce.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Physical Training 1165db.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pickpocketing (2) 2f4db2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pickpocketing da7c01.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pilfer (3) e503ce.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pilfer cc9563.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Plan of Action 96fd5d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Plucky (1) 86b9c5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pnakotic Manuscripts (5) 344d98.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Pocket Portal 1ab785.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Poisoned 819f52.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Police Badge (2) da46e0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Powder of Ibn Ghazi f96ed0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Practice Makes Perfect 1ac667.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Predestined ec7702.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Premonition e470cd.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst 831b6b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches (2) 5e32a5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches 60b353.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Prescient 7e7873.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Priest of Two Faiths (1) 48e4a3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Professor Warren Rice 42806b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Promise of Power d8b64b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Prophesy 493b03.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 599209.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Psychosis d83baf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Puzzle Box 44334c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Quantum Flux edd34a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Quick Learner (4) 3bbc0b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Quick Study (2) 092e92.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Quick Thinking (Taboo) 308967.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Quick Thinking 99989c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot (3) 3f91af.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot f34090.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Randall Cho 1bfb78.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Randolph Carter b04c8e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Randolph Carter d253a6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Rational Thought 1c7a00.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Read the Signs 75eca5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Recall the Future (2) a06aa7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Recharge (2) e27b3c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Recharge (4) 591789.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Reckless Assault 3ff641.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Reckless c45e67.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Relentless af3efd.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Reliable (1) 102fad.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Relic Hunter (3) 3c959c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 35bc58.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 7667ef.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 87718c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Relic of Ages e27a30.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Research Librarian 8f91ce.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Resourceful 334f03.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Rex's Curse 033a35.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Righteous Hunt (1) 491c09.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Riot Whistle 55fc3d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion (3) bb501b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion 358387.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 88865b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (2) 4f2668.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (4) 194adb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking 29b842.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ritual Candles 0a4db3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night (2) ef43db.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night d9292f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special 49a91e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Rookie Mistake e567ff.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Run For Your Life 0f32e8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sacred Covenant (2) 87226d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sacrifice (1) f2877e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sacrificial Beast 46812e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Safeguard (2) 7dc42a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Safeguard 8d6ae6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sawed-Off Shotgun (5) 4f5f0f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Say Your Prayers 5c3dd0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scavenging (2) ff4aea.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scavenging 1b76c9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scene of the Crime ab37af.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (1) 3a0df6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) (Taboo) fcffa3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) dffe4a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scrapper c8505c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scroll of Prophecies 0d926f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 5839e4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) a2136a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) 19b705.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scrounge for Supplies 7651f3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scrying (3) e58d2a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scrying 8a927c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Scrying Mirror 6446d1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sea Change Harpoon 4e405d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Seal of the Elder Sign (5) 91e890.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 05da68.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Search for the Truth 4156cf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Searching for Izzie cd94e3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Second Wind baef55.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Seeking Answers (2) c1365d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Seeking Answers f69e10.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) (Taboo) 922d4c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) ff9f23.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Self-Centered eff3c8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Self-Destructive 2204cc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Self-Sacrifice 5e808d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sell Your Soul 180b5b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sergeant Monroe 5630c2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 14c396.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shadow Agents 9be144.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b94d12.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sharp Vision (1) 4d9a97.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) 7f27d6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shell Shock bcf406.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shining Trapezohedron (4) b4b991.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shocking Discovery f4dd3d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shortcut (2) 9bd7cf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shortcut d4fd4a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shotgun (4) c92ea3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Showmanship ad63bc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shrewd Analysis 658d38.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shrivelling (3) b3ce16.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shrivelling (5) 7a33b2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shrivelling 914053.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows a565d5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sign Magick 05d263.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Silas's Net 4f11a2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Silver Twilight Acolyte 16a89d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Siren Call b9fbff.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sixth Sense (4) 060943.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sixth Sense 6eceef.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand (Taboo) 5a51d1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand 819aee.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Slip Away (2) 4a45c6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Slip Away cf1d4e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Small Favor bf5a5f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked e68658.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Smoking Pipe 603e29.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Smuggled Goods 1f3880.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Snare Trap (2) f66dd9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sneak Attack (2) 5f19e0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sneak Attack b18b33.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sneak By d099f4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Solemn Vow ef7c11.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Something Worth Fighting For a3f105.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Song of the Dead (2) 2ae3ce.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Soothing Melody 53f076.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sophie f8c873.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Spectral Razor 8e8a14.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Spectral Web 863f1a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Spiked Collar 6012db.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Spirit Athame (1) 90a106.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Spirit-Speaker a33470.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Spiritual Resolve (5) 26922c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Split the Angle 67e006.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) (Taboo) a7da13.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) a7944d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card St. Hubert's Key 423d46.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stand Together (3) cd7b97.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stand Together 7ec473.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stargazing (1) 968a26.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stars of Hyades 1890d0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Steadfast 4e1d91.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stealth (3) 26a3bf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stealth ddee79.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stick to the Plan (3) 82d62c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stirring Up Trouble (1) e99f0d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits (3) 1e9213.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits 9c922f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 4874bc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 9afe23.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) d96e4b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) fa61ba.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Strange Solution 565b6b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stray Cat f474b1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) (Taboo) 88a481.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) d7dbac.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Streetwise a973aa.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stroke of Luck (2) 06228f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stubborn Detective 4ea68b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Studious (3) 4ea716.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Stunning Blow 58c435.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Suggestion (1) 0ec9bf.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Suggestion (4) e7f37b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Summoned Hound (1) ab4fb3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Summoned Nightgaunt cf96b9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sure Gamble (3) 308be1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Surprising Find (1) ff59dd.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Survival Instinct (2) be4abe.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Survival Instinct 078efb.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Survival Knife (2) c1d796.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Survival Knife 4d971e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Swift Reflexes c2d211.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Swift Reload (2) 2cfa4f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) (Taboo) 842d41.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) 2fba3b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Switchblade 213853.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Sword Cane 9c32e2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Take Heart cc6e4d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Take the Initiative 50fb37.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Take the Wheel ed4256.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Taunt (2) 9956d5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Taunt (3) 85fe46.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Taunt d5cac6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Teachings of the Order 90fdb0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Teamwork eab2ed.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) db2c81.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Tempt Fate 33f906.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) b5e5f1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) cbe256.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash be33f5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Terrible Secret 06322f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Tetsuo Mori 08e5a6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The 13th Vision c1ce8e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Bell Tolls 6cbc01.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Black Book ae3775.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Black Cat (5) 16e57b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) 698fcc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone 6527a4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages 0e4a82.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Council's Coffer (2) 0e39c2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Dirge of Reason fe68c6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Eye of Truth (5) d6085d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Gold Pocket Watch (4) 62d930.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Home Front b80459.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Hungering Blade (1) bbd11b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The King in Yellow 016b72.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Man in the Pallid Mask 6720ef.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Moon • XVIII (1) e80bd8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) (Taboo) 9fa2a5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) 96ba38.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Necronomicon 6b2550.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Necronomicon d45f10.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Painted World 170538.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Painted World dfd48b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Price of Failure dc5b38.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Red-Gloved Man (5) ad18a6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Silver Key 61fd07.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Skeleton Key (2) f8dc01.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Stars Are Right 600a3c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Tattered Cloak 5d30a1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Thing That Follows da227d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Tower • XVI d5c93d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card The Truth Beckons ca1b5c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Thermos 5b14dc.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet (2) 3e0653.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet 6fec31.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Thomas Dawson 1f7e6e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) 30062e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Thrice-Damned Curiosity 3eef18.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Through the Gates fd9c56.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Tides of Fate 823e49.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Time Warp (2) 4224db.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Timeworn Brand (5) d3e55b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card To Fight the Black Wind 00b6c3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Token of Faith 2ea0d0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Tommy Malloy c3a014.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Tony's .38 Long Colt 1186a1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Tony's Quarry d6f8d1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Tooth of Eztli c1a687.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Torrent of Power 79287f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Track Shoes 6fa7fa.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Treasure Hunter (1) 18927e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Trench Coat ba560e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Trench Knife 0d4eb9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Trial by Fire 869d4c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card True Grit e25dc1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card True Survivor (3) 8837ff.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card True Understanding 4167c0.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Trusted 1bc300.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction (2) 45cd73.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction d64c99.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (1) 3dc82f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (3) f1b0f9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Twila Katherine Price (3) 9f76ec.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Twilight Blade 223ba3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Unbound Beast 86cf9c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul 45d2d2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Under Surveillance (1) cc8321.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients f763e8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage (2) 2f2190.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage acb83a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Universal Solvent 2f1166.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Unsolved Case 22d886.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Cowardice) ea0fa1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Curiosity) f6aba5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Until the End of Time 41a9ec.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Valentino Rivas 726d1d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Vantage Point 2f9ab1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Vault of Knowledge 2fdcc9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Veda Whitsley a0c2da.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Vengeful Hound ce3a1a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Venturer 0e2987.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Versatile (2) eca1c8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Vicious Blow (2) d2e026.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Vicious Blow 889121.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Voice of Ra 0988b2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Voice of the Messenger f93ea8.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (2) 4d74f6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (5) 7bc995.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ward of Protection 6656ad.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Ward of Radiance 69116c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Warning Shot ec38db.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Watch this! c40cb4.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Watcher from Another Dimension 6945f7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Waylay da207b.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Well Prepared (2) eea4ef.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Well-Maintained (1) e454c3.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet a56ffe.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card What Have You Done 2c76d9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Whispers from the Deep dd4a25.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Whitton Greene (2) 854c79.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Whitton Greene 3c5099.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 0027f2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Will to Survive dc4a2c.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Winging It aa3984.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Wish Eater 464ca1.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Wither (4) f57a6f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Wither d946d9.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Word of Command (2) 26853e.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Working a Hunch eb6165.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Wracked by Nightmares 97781f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Yaotl (1) a7358f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Yaztaroth 313167.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card You handle this one! dcdcea.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card You owe me one! d27d12.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Your Worst Nightmare 406ab2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Zeal 695bb7.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Zebulon Whateley 6714b2.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d810.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Ancient Covenant (2) 436401.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Blasphemous Covenant (2) 10b087.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Daisy's Tote Bag cf41be.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Sophist f6b1b6.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Enchanted Armor (2) dfe1ee.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Eye of the Djinn (2) d3f951.yaml rename unpacked/{Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Gaze of Ouraxsh (2) f0ecd2.yaml => Bag All Player Cards 15bb07/CardCustom Gaze of Ouraxsh (2) 34e9f8.yaml} (89%) create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Hospital Debts bd323d.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Liber Omnium Finium 242a11.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Lucky Penny (2) 8d45ac.yaml rename unpacked/{Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Manipulate Destiny (2) 99e882.yaml => Bag All Player Cards 15bb07/CardCustom Manipulate Destiny (2) bcc255.yaml} (89%) create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom On the Lam 9c4900.yaml rename unpacked/{Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Radiant Smite (1) 0d03bb.yaml => Bag All Player Cards 15bb07/CardCustom Radiant Smite (1) 9103a5.yaml} (89%) create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Ruth Westmacott 782e0a.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Ríastrad (1) d89190.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Signum Crucis (2) c21c1f.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Skeptic (1) d2cd42.yaml create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom The Necronomicon 5b2e10.yaml rename unpacked/{Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Third Time's a Charm (2) 55c953.yaml => Bag All Player Cards 15bb07/CardCustom Third Time's a Charm (2) 27ff2d.yaml} (89%) create mode 100644 unpacked/Bag All Player Cards 15bb07/CardCustom Tristan Botley (2) 039e47.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Accursed Follower 483f9a.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Accursed Follower 6d8407.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Amnesia 2210c1.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Amnesia 8598a4.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Atychiphobia a3bc7a.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Chronophobia 016e3c.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Chronophobia eeb330.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Dark Pact dd3d09.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Day of Reckoning ffb62c.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Dendromorphosis 121b2d.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Doomed ba2ae1.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Drawing the Sign 3b3c0a.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Dread Curse 96eb52.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Dread Curse 993595.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Haunted 249d83.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Hypochondria 88ee43.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Indebted 8df93a.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Indebted b2ef43.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Internal Injury 4fb446.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Internal Injury d28be6.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Kleptomania 447a08.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Mob Enforcer b239d7.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Narcolepsy 57e648.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Nihilism fc4168.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Obsessive a2e7d7.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Offer You Cannot Refuse e27c93.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Overzealous 29766c.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Overzealous 88a9b3.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Paranoia 3575a3.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Paranoia c17498.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Psychosis d83baf.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Reckless c45e67.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Self-Centered eff3c8.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Self-Destructive 2204cc.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Silver Twilight Acolyte 16a89d.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Stubborn Detective 4ea68b.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card The 13th Vision cebf6a.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card The 13th Vision e42f12.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card The Thing That Follows da227d.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card The Tower • XVI cc65f3.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card The Tower • XVI d5c93d.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Through the Gates 31f72f.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Through the Gates fd9c56.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Cowardice) ea0fa1.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Curiosity) f6aba5.yaml create mode 100644 unpacked/Bag Random Basic Weaknesses 770c4e/Card Your Worst Nightmare 406ab2.yaml delete mode 100644 unpacked/Custom_Model_Bag Arkhamdb bag b85d6d.ttslua delete mode 100644 unpacked/Custom_Model_Bag Arkhamdb bag b85d6d/Deck 4141fb.yaml delete mode 100644 unpacked/Custom_Model_Bag Arkhamdb bag b85d6d/Deck All Weaknesses dd549a.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c.ttslua create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c.yaml rename unpacked/{Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543.ttslua => Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.ttslua} (94%) create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Undead Servant 73a303.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Venture Too Deep 371b1d.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Venture Too Deep 52b042.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/Deck Artifact Deck 485770.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/Deck Artifact Expansion Custom Upgrades f5bbf3.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Agatha Crane Mini 5f4b38.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Agatha Crane b564f3.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Daniela Reyes Mini 750b6f.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Daniela Reyes a8246c.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Darrell Simmons Mini 6d9f16.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Darrell Simmons dced09.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Kate Winthrop 13a465.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Kate Winthrop Mini f1896b.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Monterey Jack Mini 0e3906.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Monterey Jack b77c53.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 41bfc7.yaml rename unpacked/{Custom_Model_Bag Arkhamdb bag b85d6d.yaml => Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 4ad11b.yaml} (52%) create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 6330da.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 9e80b9.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token bde4a6.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token d6fdbf.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token d9fb86.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token de216f.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token e04b48.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 0de2c4.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 226716.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 307044.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 3ddfeb.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 543164.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 779aa6.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.ttslua create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Signatures b0efc9.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Starter Bonded Cards d25df2.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Starter Deck 22456c.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.ttslua create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Custom Tool Upgrades ec9fd8.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Rogue Starter Deck 91ab4d.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Signatures 22fe8e.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Starter Bonded Cards d43832.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Survivor Starter Deck aff35f.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.ttslua create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/CardCustom A Glimmer of Hope (3) d01579.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/Deck Darrell Signatures af72fc.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/Deck Darrell Starter Deck dc7a22.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.ttslua create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Signatures c34beb.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Starter Bonded Cards 1d867d.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Survivor Starter Deck 775496.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.ttslua create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Card Essence of the Dream 6ad46b.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Deck Kate Signatures 1cf901.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Deck Kate Starter Deck d965e1.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Infinite_Bag Evidence Tokens 3068ef.yaml create mode 100644 unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Tile Artifact Expansion User Guide 871d2f.yaml rename unpacked/{ => Custom_Model_Bag Community-Created Investigators ed4ca7}/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.ttslua (96%) rename unpacked/{ => Custom_Model_Bag Community-Created Investigators ed4ca7}/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.yaml (97%) rename unpacked/{ => Custom_Model_Bag Community-Created Investigators ed4ca7}/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Maximillion Pegasus 16ccdc.yaml (100%) rename unpacked/{ => Custom_Model_Bag Community-Created Investigators ed4ca7}/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Maximillion Pegasus 3ff7c0.yaml (100%) rename unpacked/{ => Custom_Model_Bag Community-Created Investigators ed4ca7}/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Millennium Eye ef8ae4.yaml (100%) rename unpacked/{ => Custom_Model_Bag Community-Created Investigators ed4ca7}/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/Deck 8a25c7.yaml (100%) delete mode 100644 unpacked/Custom_Model_Bag Core 2585f4/Card Agnes Baker 25e2db.yaml create mode 100644 unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Dark Memory 382dfd.yaml create mode 100644 unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Heirloom of Hyperborea 492fcf.yaml rename unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/{Card On the Lam 02777c.yaml => Card On the Lam 2149a1.yaml} (84%) create mode 100644 unpacked/Custom_Model_Bag Core 2585f4/Deck Agnes Bakers d3cab5.yaml rename unpacked/Custom_Model_Bag Core 2585f4/{Deck Skids O'Tooles 12cc48.yaml => Deck Skids O'Tooles 2e7dd9.yaml} (55%) create mode 100644 unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Challenge Scenarios fa4a1a/Deck Bad Blood adc847.yaml create mode 100644 unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3.yaml create mode 100644 unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Children of Paradise 6f56e0.yaml create mode 100644 unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Death of Stars db0ac4.yaml create mode 100644 unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Swarm of Assimilation a5b82d.yaml create mode 100644 unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck War of the Outer Gods 3111c8.yaml create mode 100644 unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Innsmouth Conspiracy 2e936e/Deck Devil Reef 8cbe29.yaml create mode 100644 unpacked/Custom_Model_Bag Guardian 1d802b/Card Keen Eye 0dc75e.yaml rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210.ttslua => Custom_Model_Bag Guardian 626787.ttslua} (96%) create mode 100644 unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.yaml rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card .32 Colt f8d22e.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card .35 Winchester 0a7642.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card .45 Automatic ce4f97.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card .45 Thompson 4f6ede.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Alice Luxley b2fedd.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Bandolier 8b7da2.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Beat Cop 591f6f.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Blackjack e4c7c9.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Blessed Blade 59390b.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Book of Psalms 9230a8.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Boxing Gloves db4a43.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Clean Them Out 3319be.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Counterpunch 20645e.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Daring 86cf73.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Delay the Inevitable af4c03.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Dodge 7646d6.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Dynamite Blast 22c65b.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Eat lead! b58038.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Emergency Aid 7b6fd8.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Enchanted Blade bd34f2.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Evidence! 8475cc.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card First Aid e29603.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card First Watch 0da344.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Flesh Ward 52c686.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Get over here! 5b0f86.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Glory 273584.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Grete Wagner f6dfe5.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Guard Dog db2e8d.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Hallowed Mirror 460cb8.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Hand of Fate 930b6b.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Handcuffs 7dce77.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Heroic Rescue 724c85.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card I'll see you in hell! 19507d.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card If it bleeds... 6d3fdf.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Inspiring Presence b789ac.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Interrogate 60acf8.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Intrepid 88cd33.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Keen Eye 0dc75e.yaml rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Leadership 7dc5e1.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Let me handle this! 195b7f.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Machete 273797.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Monster Slayer 63b3e5.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card On The Hunt bf3261.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card One-Two Punch 22bb1e.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Physical Training 45a012.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Prepared for the Worst 6aa477.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Relentless af3efd.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Riot Whistle 55fc3d.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Rite of Sanctification 7db258.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Safeguard 8d6ae6.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Scene of the Crime ca17b8.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Second Wind 5fa99a.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Self-Sacrifice 184380.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Solemn Vow 660d08.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Something Worth Fighting For 826897.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Stand Together 7ec473.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Steadfast c634a0.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Survival Knife 840b3d.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Take the Initiative a88e8d.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Taunt 8a25a0.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Teamwork 55ce00.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Tetsuo Mori 82ee35.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Trench Knife ca8448.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card True Grit f2f912.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Trusted cc23ea.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Venturer 293e8d.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Vicious Blow ea9ad0.yaml (100%) rename unpacked/Custom_Model_Bag Guardian 1d802b/{Custom_Model_Bag Guardian bc3210 => Custom_Model_Bag Guardian 626787}/Card Warning Shot 9eeca1.yaml (100%) delete mode 100644 unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210.yaml create mode 100644 unpacked/Custom_Model_Bag Guardian cd002a/Card Radiant Smite (1) 3a726b.yaml rename unpacked/{Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7.ttslua => Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.ttslua} (96%) create mode 100644 unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.yaml rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card .32 Colt (2) 15fa11.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card .45 Automatic (2) e1ef43.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card .45 Thompson (3) 650903.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Ace of Swords (1) 32b458.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Agency Backup (5) f54b74.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Ambush (1) 36ffa9.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Armor of Ardennes (5) 1c0bcd.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Bandolier (2) bdffae.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Beat Cop (2) 1e7f9a.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Blackjack (2) e56d1d.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Blood Eclipse (1) 5efc92.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Blood Eclipse (3) 537351.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Boxing Gloves (3) 54293e.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Brother Xavier (1) 5a7137.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Combat Training (1) 88fdeb.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Counterpunch (2) 92436b.yaml (98%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Custom Ammunition (3) 0c278c.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Dynamite Blast (2) 2b76c6.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Dynamite Blast (3) 14dcc4.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Eat lead! (2) c4018c.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Empty Vessel (4) 043971.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Enchanted Blade (3) 5cfb72.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Ever Vigilant (1) ab620e.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Evidence! (1) 3df5fb.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Extra Ammunition (1) 5761c7.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card First Aid (3) 80d5e3.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Flamethrower (5) 066c18.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Fool me once... (1) 596620.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Galvanize (1) 9e7f6a.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Get over here! (2) 415ca2.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Grete Wagner (3) b39b78.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Heroic Rescue (2) 93381d.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card I've had worse... (2) e3ae5c.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card I've had worse... (4) 5a4bb5.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Keen Eye (3) 22256f.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Kerosene (1) 218e04.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Leadership (2) 80fafa.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Lesson Learned (2) 037b2e.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Lightning Gun (5) 639a09.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card M1918 BAR (4) 6c6340.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Mano a Mano (1) 88d2ba.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Mano a Mano (2) 14424c.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Marksmanship (1) 1408ad.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Mk 1 Grenades (4) afef79.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Monster Slayer (5) 661c3f.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card One-Two Punch (5) 8ffa44.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Overpower (2) 017e1f.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Physical Training (2) 62392c.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Physical Training (4) ab51ce.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Police Badge (2) 2901ee.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Radiant Smite (1) 3a726b.yaml rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Reliable (1) 187591.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Righteous Hunt (1) 491c09.yaml (96%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Sacred Covenant (2) 87226d.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Safeguard (2) 7dc42a.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Shotgun (4) 3a622d.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Spiritual Resolve (5) 7ab680.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Springfield M1903 (4) 3b042e.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Stand Together (3) 3accaf.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Stick to the Plan (3) a26425.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Survival Knife (2) c1d796.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Taunt (2) d93397.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Taunt (3) 85fe46.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Telescopic Sight (3) 2badf6.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card The Hungering Blade (1) 17f807.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Vicious Blow (2) 8f5533.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Well Prepared (2) 1fc1f4.yaml (100%) rename unpacked/Custom_Model_Bag Guardian cd002a/{Custom_Model_Bag Guardian a3401d => Custom_Model_Bag Guardian 7d3988}/Card Well-Maintained (1) 0c2f37.yaml (98%) delete mode 100644 unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d.yaml rename unpacked/Custom_Model_Bag Leaked Items 42cd6e/{Bag Devil Reef 57a8d9.yaml => Bag A Light in the Fog a4ef2f.yaml} (51%) create mode 100644 unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f/CardCustom Eye of the Djinn (2) ff6e31.yaml create mode 100644 unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f/CardCustom Lucky Penny (2) 845053.yaml create mode 100644 unpacked/Custom_Model_Bag Mystic 6117a1/Card Abyssal Tome (2) a2d392.yaml delete mode 100644 unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99.yaml rename unpacked/{Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d.ttslua => Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.ttslua} (96%) create mode 100644 unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.yaml create mode 100644 unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Abyssal Tome (2) a2d392.yaml rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Alchemical Transmutation (2) d74e66.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Arcane Initiate (3) 45e559.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Arcane Studies (2) f89dd6.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Arcane Studies (4) 0e808b.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Azure Flame (3) c5fb42.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Azure Flame (5) 0ee874.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Banish (1) 2403fa.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Bind Monster (2) 8f6cb3.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Blinding Light (2) fa4a56.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Blood Pact (3) 86ed13.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Book of Shadows (1) becb9c.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Book of Shadows (3) 17c6c8.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Clairvoyance (3) 604ed6.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Clairvoyance (5) e21200.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Clarity of Mind (3) 598837.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Counterspell (2) 4fb7c0.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Crystalline Elder Sign (3) 8c0e3b.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Dayana Esperence (3) fcd9ce.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card De Vermis Mysteriis (2) cb968f.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Defiance (2) c311be.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Deny Existence (5) d26b84.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Eldritch Inspiration (1) e84eff.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Empower Self (2) 31051f.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Empower Self (2) b49ef1.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Empower Self (2) fea03b.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Enchanted Blade (3) 053015.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Fearless (2) e53458.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Four of Cups (1) f9a151.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Grotesque Statue (2) 6b2e97.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Grotesque Statue (4) f71c08.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Grounded (1) 7da732.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Guts (2) 219c78.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Hypnotic Gaze (2) e2bc49.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Ineffable Truth (3) 943332.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Ineffable Truth (5) f00301.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Jewel of Aureolus (3) 0919cf.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Mind Wipe (1) 3c7e85.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Mind Wipe (3) 82d9bb.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Mind's Eye (2) 4e86c1.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Mists of R'lyeh (2) 3d57b4.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Mists of R'lyeh (4) 0e2b00.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Paradoxical Covenant (2) 541ee9.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Protective Incantation (1) c2f6b1.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Recall the Future (2) bdddfa.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Recharge (2) f560b1.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Recharge (4) 591789.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Rite of Seeking (2) 426c61.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Rite of Seeking (4) ea3df4.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Robes of Endless Night (2) ef43db.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Sacrifice (1) ef52e6.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Scroll of Secrets (3) bb9d20.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Scrying (3) 2b7765.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Seal of the Elder Sign (5) 918fde.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Seal of the Seventh Sign (5) 8272e9.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Shards of the Void (3) f651e8.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Shining Trapezohedron (4) ef7b23.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Shrivelling (3) f1654d.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Shrivelling (5) bb7d83.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Sixth Sense (4) b9dd5d.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Song of the Dead (2) d4d8c4.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Spirit Athame (1) a1c372.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Stargazing (1) 9c0a3d.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Storm of Spirits (3) a906ee.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Summoned Hound (1) 0e8b75.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card The Chthonian Stone (3) 698fcc.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Time Warp (2) ec3a71.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Twila Katherine Price (3) b9b811.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Ward of Protection (2) 443992.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Ward of Protection (5) fc4caf.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Wither (4) c78082.yaml (100%) rename unpacked/Custom_Model_Bag Mystic 6117a1/{Custom_Model_Bag Mystic 2c2b99 => Custom_Model_Bag Mystic eca770}/Card Word of Command (2) 16154f.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag Mystic b4d9bf/Card Blood Pact fc709b.yaml rename unpacked/{Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99.ttslua => Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.ttslua} (96%) create mode 100644 unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.yaml rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Alchemical Transmutation 7d133c.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Alyssa Graham a26795.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Arcane Initiate 4287c0.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Arcane Research fee183.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Arcane Studies eb8234.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Armageddon 3feff1.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Astral Travel 8bb57d.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Azure Flame 17319c.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Blinding Light 00d05a.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Blood Pact fc709b.yaml rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Clairvoyance b67371.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Clarity of Mind e563d5.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Crystal Pendulum 6c3156.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Dark Prophecy 74b8d4.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card David Renfield 3120e7.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Defiance 946958.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Delve too Deep b83784.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Deny Existence 62db13.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Drawn to the Flame b36f5e.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Eldritch Inspiration a268ef.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Enchanted Blade 0e459d.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Enraptured 0ce7b8.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Ethereal Form ee51d8.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Eye of Chaos 9a5782.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Familiar Spirit 971d52.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Fearless f21135.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Forbidden Knowledge 7cf231.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Healing Words 4abb47.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Holy Rosary 98aa6a.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Hypnotic Gaze e546c0.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Ineffable Truth c6caf6.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Mists of R'lyeh 64fcdf.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Moonlight Ritual 247824.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Olive McBride 715974.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Open Gate dfc9b0.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Parallel Fates 47bdba.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Premonition 348395.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Prescient 7e7873.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Promise of Power c619af.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Prophesy e0906c.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Quantum Flux 562eb1.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Read the Signs 4f33d5.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Rite of Seeking 8b39e9.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Ritual Candles d2776c.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Robes of Endless Night d9292f.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Scroll of Prophecies ebdac9.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Scroll of Secrets c63ec7.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Scrying 24a147.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Scrying Mirror 6446d1.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Shrivelling e16d74.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Shroud of Shadows a565d5.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Sign Magick 4fe0b8.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Sixth Sense b7efb5.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Spectral Razor b6bccc.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card St. Hubert's Key 5905a9.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Storm of Spirits e792b0.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Sword Cane c99da7.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card The Chthonian Stone 916f1c.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Tides of Fate 78b142.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Torrent of Power 9f2514.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Uncage the Soul a82830.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Voice of Ra 0988b2.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Ward of Protection 9bee5a.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Ward of Radiance b22438.yaml (100%) rename unpacked/Custom_Model_Bag Mystic b4d9bf/{Custom_Model_Bag Mystic ee21f7 => Custom_Model_Bag Mystic 17e533}/Card Wither 5792ab.yaml (100%) delete mode 100644 unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7.yaml create mode 100644 unpacked/Custom_Model_Bag Neutral aef7dd/Card Manipulate Destiny (2) 5606b3.yaml create mode 100644 unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.ttslua create mode 100644 unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.yaml rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Ace of Rods (1) eef2a9.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Anna Kaslow (4) cd426b.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Backpack (2) 8be56a.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Bulletproof Vest (3) 8737b5.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Charisma (3) 67dfca.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Elder Sign Amulet (3) 0aece0.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Emergency Cache (2) 1b1f60.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Emergency Cache (3) 73aab3.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Hemispheric Map (3) 519cc4.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Key of Ys (5) 1ea991.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Lucid Dreaming (2) b5763a.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Manipulate Destiny (2) 5606b3.yaml rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Moment of Respite (3) d78375.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Ornate Bow (3) 08097a.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Relic Hunter (3) fa4c7c.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card The Black Cat (5) 2acaa8.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card The Council's Coffer (2) 79ef94.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card The Red-Gloved Man (5) 6b6ed9.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Timeworn Brand (5) cf212b.yaml (100%) rename unpacked/Custom_Model_Bag Neutral aef7dd/{Custom_Model_Bag Neutral 574514 => Custom_Model_Bag Neutral 3559eb}/Card Versatile (2) c1124f.yaml (100%) delete mode 100644 unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514.ttslua delete mode 100644 unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514.yaml rename unpacked/Custom_Model_Bag Promo Investigators 5fe24e/{CardCustom Gloria Goldberg 304ca2.yaml => Card Gloria Goldberg 8de7e4.yaml} (62%) create mode 100644 unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.ttslua create mode 100644 unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.yaml create mode 100644 unpacked/Custom_Model_Bag Rogue deaa6d/Card Priest of Two Faiths (1) 48e4a3.yaml create mode 100644 unpacked/Custom_Model_Bag Rogue deaa6d/Card Under Surveillance (1) cc8321.yaml create mode 100644 unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.ttslua create mode 100644 unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.yaml rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card .41 Derringer (2) f57af7.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card .45 Thompson (3) d4dbc7.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Ace in the Hole (3) 074858.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Adaptable (1) 731d2a.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card All In (5) 7d3a27.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Another Day, Another Dollar (3) 006d44.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Backstab (3) 7baf75.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Beretta M1918 (4) 91da6b.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Borrowed Time (3) 0db666.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Burglary (2) 2aeb8a.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Cat Burglar (1) 2fe723.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Charon's Obol (1) 1dbc95.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Cheap Shot (2) 0b963c.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Cheat Death (5) 3add54.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Chicago Typewriter (4) ecfa42.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Chuck Fergus (5) 0e72b6.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Colt Vest Pocket (2) bab03b.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Contraband (2) 620b6e.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Copycat (3) de40c8.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Daredevil (2) b3cad4.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Daring Maneuver (2) fc82a5.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Decorated Skull (3) 981f41.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Delilah O'Rourke (3) b81c84.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Double, Double (4) 0e0530.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Easy Mark (1) cdbb37.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card False Covenant (2) 3442f5.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Fence (1) 2423e7.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Garrote Wire (2) 117b7c.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Hard Knocks (2) 15643b.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Haste (2) 1bd139.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card High Roller (2) ce1b89.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Hired Muscle (1) cdd6aa.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Hot Streak (2) f2508d.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Hot Streak (4) 4eb231.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Joey The Rat Vigil (3) 7b918b.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Leo de Luca (1) 27446e.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Liquid Courage (1) 5065a6.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Lockpicks (1) edd6c4.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Lola Santiago (3) 8bec05.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Lucky Cigarette Case (3) 0feb74.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Lucky Dice (2) 9dd911.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Lupara (3) a6af13.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Manual Dexterity (2) 982716.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Mauser C96 (2) fc20b9.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Momentum (1) d753d7.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Moxie (1) 5fe780.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Opportunist (2) 63f145.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Pay Day (1) eaa415.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Pickpocketing (2) 2f4db2.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Pilfer (3) e503ce.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Priest of Two Faiths (1) 48e4a3.yaml rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Sawed-Off Shotgun (5) e1c0f8.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Sharpshooter (3) 7f27d6.yaml (98%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Skeptic (1) 37882c.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Slip Away (2) 4a45c6.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Sneak Attack (2) 5f19e0.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Stealth (3) 26a3bf.yaml (98%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Streetwise (3) d7dbac.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Suggestion (1) 0ec9bf.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Suggestion (4) e7f37b.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Sure Gamble (3) 308be1.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Swift Reload (2) 2cfa4f.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Switchblade (2) 2fba3b.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Tennessee Sour Mash (3) b5e5f1.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card The Gold Pocket Watch (4) 62d930.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card The Moon • XVIII (1) e80bd8.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card The Skeleton Key (2) f8dc01.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Think on Your Feet (2) 3e0653.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Three Aces (1) 30062e.yaml (100%) rename unpacked/Custom_Model_Bag Rogue deaa6d/{Custom_Model_Bag Rogue fa4d49 => Custom_Model_Bag Rogue 6c6b22}/Card Treasure Hunter (1) 18927e.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Under Surveillance (1) cc8321.yaml delete mode 100644 unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49.ttslua delete mode 100644 unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49.yaml rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Card Dr. Milian Christopher 4ee663.yaml => Card Dr. Milan Christopher 4ee663.yaml} (96%) create mode 100644 unpacked/Custom_Model_Bag Seeker 1e7fc5/Card The Truth Beckons ca1b5c.yaml create mode 100644 unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.ttslua create mode 100644 unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.yaml rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Anatomical Diagrams e957df.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Arcane Enlightenment e69708.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Archaic Glyphs 560b32.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Art Student 7dfe08.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Astounding Revelation 70406e.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Barricade 38217d.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Burning the Midnight Oil 0d29be.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Celaeno Fragments d287bc.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Charles Ross, Esq. 176d57.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Connect the Dots 94abd7.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Crack the Case d83a35.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Cryptic Grimoire af84e6.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Cryptic Writings ff2776.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Cryptographic Cipher 27258f.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Curiosity fb48a9.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Deduction e7f376.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Deep Knowledge adde8d.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Disc of Itzamna d6c44a.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Dr. Elli Horowitz 7973c0.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea/Card Dr. Milian Christopher 4ee663.yaml => Custom_Model_Bag Seeker d257cb/Card Dr. Milan Christopher 4ee663.yaml} (96%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Dr. William T. Maleson 5e0769.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Dream Diary 52f66c.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Dream-Enhancing Serum 1c353d.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Eldritch Sophist 53d103.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Encyclopedia dbb0e0.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Eureka! 244e5d.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Extensive Research 013446.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Feed the Mind a614de.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Fieldwork 922850.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Fingerprint Kit b73951.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Forbidden Tome 0a4d22.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Ghastly Revelation bf4815.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Grisly Totem d5bad4.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Guidance f8e2fb.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Hawk-Eye Folding Camera 05125c.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Higher Education 8595fb.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Hyperawareness 9902a8.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card I've got a plan! 338973.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Inquiring Mind ba1c85.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Knowledge is Power 070246.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Laboratory Assistant 889177.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Logical Reasoning f6b017.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Magnifying Glass 2239d4.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Medical Texts 73172c.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Mind over Matter 6d5337.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Mr. Rook b3debc.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card No Stone Unturned cc7761.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Occult Invocation 010509.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Occult Lexicon 3d6f47.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Old Book of Lore e13107.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Persuasion 7b6e14.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Plan of Action 3b9c2c.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Practice Makes Perfect 088c27.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Preposterous Sketches 65a64f.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Research Librarian 92890f.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Scroll of Secrets f475ca.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Seeking Answers e4f8ba.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Shortcut 00ade1.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Shrewd Analysis d950d8.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Strange Solution e5d521.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card The Truth Beckons ca1b5c.yaml rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Tooth of Eztli 7d0ada.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card True Understanding 03bb19.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Truth from Fiction b57f33.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Unearth the Ancients bc0fb2.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Vantage Point c03b59.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Whitton Greene 3c5099.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 1e7fc5/{Custom_Model_Bag Seeker e328ea => Custom_Model_Bag Seeker d257cb}/Card Working a Hunch 05660e.yaml (100%) delete mode 100644 unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea.ttslua delete mode 100644 unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea.yaml create mode 100644 unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Gaze of Ouraxsh (2) b7c316.yaml create mode 100644 unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.ttslua create mode 100644 unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.yaml rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Abigail Foreman (4) b63277.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Ancient Stone (1) 8b1863.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Arcane Insight (4) 6fab5a.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Barricade (3) 3469e0.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Blasphemous Covenant (2) 86d109.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Cryptic Research (4) 791d5f.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Cryptic Writings (2) 870bdc.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Death • XIII (1) add7c9.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Deciphered Reality (5) b98ff6.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Deduction (2) e0721f.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Disc of Itzamna (2) 117137.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Eidetic Memory (3) 423ea2.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Encyclopedia (2) d86b0d.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Esoteric Atlas (1) e50ca0.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Esoteric Atlas (2) 2172e2.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Expose Weakness (1) 97ed44.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Expose Weakness (3) d391c7.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Extensive Research (1) e07aab.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Farsight (4) b4121c.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Feed the Mind (3) 659f2d.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Forewarned (1) f22453.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Gaze of Ouraxsh (2) b7c316.yaml rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Glimpse the Unthinkable (1) 6e4d54.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Glimpse the Unthinkable (5) bdbca5.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Grisly Totem (3) b722cd.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Higher Education (3) 0d3413.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Hyperawareness (2) e4ceae.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card I've got a plan! (2) 344e90.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card In the Know (1) 488fab.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Library Docent (1) fab3a9.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Logical Reasoning (4) 6f6976.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Magnifying Glass (1) 8343e5.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Mind Over Matter (2) 9b1c5b.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card No Stone Unturned (5) a641de.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Old Book of Lore (3) 0d88ac.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Otherworld Codex (2) 5f8011.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Otherworldly Compass (2) 562c05.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Pathfinder (1) 683123.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Perception (2) 96b5ed.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Pnakotic Manuscripts (5) 300569.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Preposterous Sketches (2) 15a1bb.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Quick Study (2) 26d70e.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Scientific Theory (1) 8cdfc7.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Scroll of Secrets (3) cffeb0.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Seeking Answers (2) c1365d.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Segment of Onyx (1) bc498d.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Shortcut (2) 404410.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Stirring Up Trouble (1) e99f0d.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Studious (3) 384258.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Surprising Find (1) 0d3d1a.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card The Eye of Truth (5) 552689.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card The Necronomicon (5) 96ba38.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Truth from Fiction (2) fd3cda.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Card Whitton Greene (2) 854c79.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Deck Ancient Stone (4) 7b5a65.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Deck Archaic Glyphs (3) 22c4b1.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Deck Dream Diary (3) 6465d8.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Deck Forbidden Tome (3) 367e5c.yaml (100%) rename unpacked/Custom_Model_Bag Seeker 5ec2fb/{Custom_Model_Bag Seeker d99b16 => Custom_Model_Bag Seeker b2264c}/Deck Strange Solution (4) 4a29bd.yaml (100%) delete mode 100644 unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16.ttslua delete mode 100644 unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16.yaml create mode 100644 unpacked/Custom_Model_Bag Survivor c02830/Card Butterfly Effect (1) 22fc6c.yaml create mode 100644 unpacked/Custom_Model_Bag Survivor c02830/Card Third Time's a Charm (2) 45956a.yaml create mode 100644 unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.ttslua create mode 100644 unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.yaml rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card .18 Derringer (2) f8a977.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card A Chance Encounter (2) 6842aa.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card A Test of Will (1) 2d9585.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card A Test of Will (2) 71a760.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Against All Odds (2) b633d0.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Alter Fate (1) 9e4e11.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Alter Fate (3) 5a1991.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Ancient Covenant (2) 840ba5.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Aquinnah (1) 630d65.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Aquinnah (3) bf6a7b.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Bait and Switch (3) 50acc5.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Brute Force (1) 7fe153.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Butterfly Effect (1) 22fc6c.yaml rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Chainsaw (4) 382580.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Cherished Keepsake (1) 5a2b49.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Close Call (2) 61d1e5.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Cornered (2) a5fc16.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Devil's Luck (1) ad6d9d.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Dig Deep (2) a06013.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Dumb Luck (2) 0c433b.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Déjà Vu (5) 719a45.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Eucatastrophe (3) 9dcdd3.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Expeditious Retreat (1) ea8324.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Fire Extinguisher (1) dd0b79.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Five of Pentacles (1) 9d09f0.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Flare (1) 910b12.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Fortune or Fate (2) 5010c5.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Granny Orne (3) d88560.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Gravedigger's Shovel (2) e64769.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Grisly Totem (3) 4a5655.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Guiding Spirit (1) 13ae70.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Infighting (3) 36bc5b.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Jessica Hyde (1) a1c47b.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Lantern (2) b09d6f.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Leather Coat (1) 5b1550.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Look what I found! (2) fd393b.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Lucky! (2) 002455.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Lucky! (3) 04d33d.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Lure (1) 76b07c.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Lure (2) ad0934.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Miss Doyle (1) b337ac.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Newspaper (2) ea2337.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Nightmare Bauble (3) 1c8915.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Nothing Left to Lose (3) 6a8a9f.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Old Hunting Rifle (3) f69d7d.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card On Your Own (3) 2ebdf1.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card On Your Own (3) ce1a7d.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Oops! (2) 9869ee.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Peter Sylvestre (2) 584914.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Plucky (1) 2a37f3.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Quick Learner (4) 3bbc0b.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Rabbit's Foot (3) 00c4cc.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Rise to the Occasion (3) 0b9f53.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Scavenging (2) cda2e6.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Scrapper (3) c6c157.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Sharp Vision (1) 4d9a97.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Snare Trap (2) 234fae.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Stroke of Luck (2) bce471.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Survival Instinct (2) 1c3b8f.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Tennessee Sour Mash (3) 8cdf20.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Third Time's a Charm (2) 45956a.yaml rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card True Survivor (3) 6a04c3.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Try and Try Again (1) 35bbe8.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Try and Try Again (3) b8f774.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Unexpected Courage (2) 53d6d9.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Will to Survive (3) ac7db0.yaml (100%) rename unpacked/Custom_Model_Bag Survivor c02830/{Custom_Model_Bag Survivor f15fc1 => Custom_Model_Bag Survivor 6e9c37}/Card Yaotl (1) 9f9e58.yaml (100%) delete mode 100644 unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1.ttslua delete mode 100644 unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1.yaml delete mode 100644 unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543.yaml rename unpacked/{Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543.ttslua => Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.ttslua} (96%) create mode 100644 unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.yaml rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Card Atlatch-Nacha a2f955.yaml (95%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Card Legs of Atlach-Nacha 34d21c.yaml (95%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Card Legs of Atlach-Nacha 6af4f4.yaml (95%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Card Legs of Atlach-Nacha 8b17a1.yaml (95%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Card Legs of Atlach-Nacha f4d669.yaml (95%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Custom_Tile 13f1f9.yaml (100%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Custom_Tile 1b6f2a.yaml (100%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Custom_Tile 4d1c37.yaml (100%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Custom_Tile 5391d4.yaml (100%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Custom_Tile 719afa.yaml (100%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Custom_Tile 7234af.yaml (100%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Custom_Tile 90ff22.yaml (100%) rename unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha f0a43a}/Custom_Tile bef50d.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile Atlach-Nacha Helper 8e78c7.ttslua create mode 100644 unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile Atlach-Nacha Helper 8e78c7.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.ttslua create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.ttslua create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile 480325.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile 8bde30.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile d70b36.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile f2a6d9.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Memory Recovered A Battle With a Horrifying Devil ce45f7.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Otherwise 33d465.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Churning Waters 863c96.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Fishing Vessel 1b4fad.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Reef of Mysteries fff4bf.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Scenario f724f6.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Thomas Dawson 1f7e6e.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Awakened Mantle 2afb4a.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Headdress of Y’ha-nthlei a4271e.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Waveworn Idol 54fd3f.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 457419.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 47b626.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 4bec3c.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens fe6f38.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_PDF b71c73.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile 429c04.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile 47aa44.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile a359d6.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.ttslua create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Flood Token 2b06f0.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Cyclopean Ruins db3d41.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Deep One Grottos 2dea23.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Devil Reefs df464a.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Encounter Deck 8cbe29.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Temples of the Union 03f2d2.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Tidal Tunnel Deck 3d5b6e.yaml create mode 100644 unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Notecard 7e3c60.yaml create mode 100644 unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.ttslua create mode 100644 unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.yaml rename unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/{Custom_Tile All or Nothing b5928a.ttslua => Custom_Tile All or Nothing 7c8eef.ttslua} (96%) rename unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/{Custom_Tile All or Nothing b5928a.yaml => Custom_Tile All or Nothing 7c8eef.yaml} (86%) create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.ttslua create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card At the Station f286ef.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card Missing Persons 9bec2d.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card The Relic is Missing! b5a536.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card Trial of the Huntress 5611a1.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card A Walk Down Memory Lane 165dac.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Curiositie Shoppe f61f6c.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Downtown 2a3c87.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Easttown 927692.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Elspeth Baudin 88a71f.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Hyperborean Blood a00323.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Miskatonic University 0678e8.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Northside 73f813.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Rivertown 377b20.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Scenario 847357.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Town Hall c5f67a.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Velma's Diner 007d36.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_PDF Bad Blood Campaign Guide d0aa0f.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 061a07.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 07f90c.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 34e74c.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 3d7245.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 5789a0.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 7234af.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 99909c.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile adebd8.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.ttslua create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 00d19a.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 06d6fe.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 25f3c2.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 30ed35.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 3b4478.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 428e26.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 88e9a0.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory b5637e.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory ef5528.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Deck Encounter Deck b8619a.yaml rename unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247/{Deck Masks 6fb734.yaml => Deck Masks 77e4d3.yaml} (72%) create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.ttslua create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.yaml rename unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha 3d83ce}/Card Atlatch-Nacha a2f955.yaml (100%) rename unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha 3d83ce}/Card Legs of Atlach-Nacha 34d21c.yaml (100%) rename unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha 3d83ce}/Card Legs of Atlach-Nacha 6af4f4.yaml (96%) rename unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha 3d83ce}/Card Legs of Atlach-Nacha 8b17a1.yaml (95%) rename unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/{Bag Atlach-Nacha d14543 => Bag Atlach-Nacha 3d83ce}/Card Legs of Atlach-Nacha f4d669.yaml (96%) create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Custom_Tile Atlach-Nacha Helper 8e78c7.ttslua create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Custom_Tile Atlach-Nacha Helper 8e78c7.yaml delete mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543.yaml rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef.ttslua (96%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef.yaml (99%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Adventureland 492628.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Critter Country eeedd1.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Fantasyland 28c5d1.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Frontierland acef56.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Galaxy's Edge f5106e.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Main Street, U.S.A. 1ffbbd.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Miskatonic Mouse 1f45da.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom New Orleans Square ca86be.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Park Entrance dbdb0f.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom The Hub c63130.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Tomorrowland e80a41.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Toontown 5287f3.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.ttslua (97%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck A Dream Come True befb0d.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Crazed Vacationer Swarms 12f5aa.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Fab Five 2b1559.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Souvenirs ac3c85.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Weaknesses 37a019.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_PDF Miskatonic Mouse Scenario Guide bda9a9.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 070048.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 20323b.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 270525.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 2875cc.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 3b6978.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 3bc61d.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 7234af.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 776283.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 970ac8.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 9b26d0.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile afed94.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile b1d640.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile c62fb5.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile c907e9.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile d37681.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile e600d4.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Act Deck dbe757.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Agenda Deck e5c753.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Childlike Excitement Deck 971f55.yaml (100%) rename unpacked/{ => Custom_Model_Bag The Side Missions 2d16e1}/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Ecounter Deck 9e02de.yaml (100%) create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.ttslua create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Arkham c21137.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Athenaeum of the Empty Sky fa15cd.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Chateau Ramezay 790c3a.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Disciple of the Swarm 677a88.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Nihilistic Stargazer 7f901e.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Scenario 1ade36.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Shrine of Magh’an Ark’at b57f26.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of Montréal 262233.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of New York City 473d21.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of Providence be7797.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Arcade b976f6.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Burning Pit f52a2e.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Penthouse d9e9ca.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Zealot of Paradise f2b1dd.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Card Hub Dimension 377fcf.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Children of Paradise 6f56e0.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Death of Stars db0ac4.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Story Assets 377a7c.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Swarm of Assimilation a5b82d.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_PDF War of the Outer Gods 36b4eb.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 012f6e.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 308d21.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 30c009.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 354cd0.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 638f24.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 7234af.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile b2f67d.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile ca62fc.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile dcb5db.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile f7e308.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile fc5dce.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile fe6ec3.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.ttslua create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Act Deck 01a1bf.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Blue Agenda Deck 119ff4.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Encounter Deck 3111c8.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Green Agenda Deck 1375c8.yaml create mode 100644 unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Red Agenda Deck a96a99.yaml create mode 100644 unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4.ttslua rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf.yaml => Custom_Model_Bag Weakness decks 1ae6a4.yaml} (80%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck Advanced 15e75e.yaml (100%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck All Weaknesses d95bd6.yaml (97%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck Core 728f7e.yaml (100%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck Return to The Forgotten Age c0f36d.yaml (100%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck Return to The Path to Carcosa 9c5822.yaml (100%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck Return to the Dunwich Legacy 0b361d.yaml (100%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck Starter Decks 120210.yaml (100%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck The Circle Undone f9215d.yaml (100%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck The Dream-Eaters c97be9.yaml (100%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck The Dunwich Legacy 0da7f2.yaml (100%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck The Forgotten Age 62c248.yaml (100%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck The Innsmouth Conspiracy 516413.yaml (100%) rename unpacked/Custom_Model_Bag Weakness decks 750fdd/{Custom_Model_Bag Weakness decks ceacbf => Custom_Model_Bag Weakness decks 1ae6a4}/Deck The Path to Carcosa 193ddf.yaml (100%) delete mode 100644 unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf.ttslua delete mode 100644 unpacked/Custom_Tile Deck Importer 928c8e.yaml rename unpacked/{Custom_Tile Deck Importer 928c8e.ttslua => Custom_Tile New Deck Importer edad66.ttslua} (60%) create mode 100644 unpacked/Custom_Tile New Deck Importer edad66.yaml create mode 100644 unpacked/Deck a9ec03.yaml delete mode 100644 unpacked/Notecard Arkham SCE 1.51 - 1172020 - Page 1 094d4d.yaml create mode 100644 unpacked/Notecard Arkham SCE 1.52 - 1252020 - Page 1 af01b8.yaml diff --git a/unpacked.ttslua b/unpacked.ttslua index bf9ff0cf1..d627daaf2 100644 --- a/unpacked.ttslua +++ b/unpacked.ttslua @@ -1,742 +1,742 @@ ---[[ Lua code. See documentation: http://berserk-games.com/knowledgebase/scripting/ --]] --- Card size used for autodealing -- - --- global position constants -ENCOUNTER_DECK_POS = {-3.8, 1, 5.7} -ENCOUNTER_DECK_SPAWN_POS = {-3.8, 3, 5.7} -ENCOUNTER_DECK_DISCARD_POSITION = {-3.8, 0.5, 10.5} -g_cardWith=2.30; -g_cardHeigth=3.40; - -containerId = 'fea079' -tokenDataId = '708279' - - -CACHE = { - object = {}, - data = {} -} - ---[[ The OnLoad function. This is called after everything in the game save finishes loading. -Most of your script code goes here. --]] -function onload() - --Player.White.changeColor('Yellow') - tokenplayerone = { - damageone = "https://i.imgur.com/XIJHw3J.png", - damagethree = "https://i.imgur.com/eqRC712.png", - horrorone = "https://i.imgur.com/Bh0BO47.png", - horrorthree = "https://i.imgur.com/pZvTKA7.png", - resource = "https://i.imgur.com/j5v5E3j.png", - resourcethree = "https://i.imgur.com/1GZsDTt.png", - doom = "https://i.imgur.com/EoL7yaZ.png", - clue = "https://i.imgur.com/wfCaVU0.png" - } - - TOKEN_DATA = { - clue = {image = tokenplayerone.clue, scale = {0.15, 0.15, 0.15}}, - resource = {image = tokenplayerone.resource, scale = {0.17, 0.17, 0.17}}, - doom = {image = tokenplayerone.doom, scale = {0.17, 0.17, 0.17}} - } - - getObjectFromGUID("6161b4").interactable=false - getObjectFromGUID("721ba2").interactable=false - getObjectFromGUID("9f334f").interactable=false - getObjectFromGUID("23a43c").interactable=false - getObjectFromGUID("5450cc").interactable=false - getObjectFromGUID("463022").interactable=false - getObjectFromGUID("9487a4").interactable=false - getObjectFromGUID("91dd9b").interactable=false - getObjectFromGUID("f182ee").interactable=false - -end - -function take_callback(object_spawned, mat) - customObject = object_spawned.getCustomObject() - local player = mat.getGUID(); - - local image = customObject.image - - -- Update global stats - if PULLS[image] == nil then - PULLS[image] = 0 - end - PULLS[image] = PULLS[image] + 1 - -- Update player stats - if PLAYER_PULLS[player][image] == nil then - PLAYER_PULLS[player][image] = 0 - end - PLAYER_PULLS[player][image] = PLAYER_PULLS[player][image] + 1 - -end -MAT_GUID_TO_COLOUR = { - ["8b081b"] = "White", - -- player 2 conrad - ["bd0ff4"] = "Orange", - -- player - ["383d8b"] = "Green", - -- playur 4 olivia - ["0840d5"] = "Red" -} - - -PLAYER_PULLS = { - -- player 1 max - ["8b081b"] = {}, - -- player 2 conrad - ["bd0ff4"] = {}, - -- player - ["383d8b"] = {}, - -- playur 4 olivia - ["0840d5"] = {} -} - -PULLS = { - -- cultist - ["https://i.imgur.com/VzhJJaH.png"] = 0, - -- skull - ["https://i.imgur.com/stbBxtx.png"] = 0, - -- tablet - ["https://i.imgur.com/1plY463.png"] = 0, - -- curse - ["http://cloud-3.steamusercontent.com/ugc/1011565208488654691/8F0B399048EBC34CD24B99AAD415AEC40E679C65/"] = 0, - -- tentacle - ["https://i.imgur.com/lns4fhz.png"] = 0, - -- minus eight - ["https://i.imgur.com/9t3rPTQ.png"] = 0, - -- minus seven - ["https://i.imgur.com/4WRD42n.png"] = 0, - -- minus six - ["https://i.imgur.com/c9qdSzS.png"] = 0, - -- minus five - ["https://i.imgur.com/3Ym1IeG.png"] = 0, - -- minus four - ["https://i.imgur.com/qrgGQRD.png"] = 0, - -- minus three - ["https://i.imgur.com/yfs8gHq.png"] = 0, - -- minus two - ["https://i.imgur.com/bfTg2hb.png"] = 0, - -- minus one - ["https://i.imgur.com/w3XbrCC.png"] = 0, - -- zero - ["https://i.imgur.com/btEtVfd.png"] = 0, - -- plus one - ["https://i.imgur.com/uIx8jbY.png"] = 0, - -- elder thing - ["https://i.imgur.com/ttnspKt.png"] = 0, - -- bless - ["http://cloud-3.steamusercontent.com/ugc/1011565208488650618/B2B081032AF3EFDBD90840A5D6888A3CEA228D66/"] = 0, - -- elder sign - ["https://i.imgur.com/nEmqjmj.png"] = 0, -} - -IMAGE_TOKEN_MAP = { - -- cultist - ["https://i.imgur.com/VzhJJaH.png"] = "cultist", - -- skull - ["https://i.imgur.com/stbBxtx.png"] = "skull", - -- tablet - ["https://i.imgur.com/1plY463.png"] = "tablet", - -- elder thing - ["https://i.imgur.com/ttnspKt.png"] = "Elder Thing", - -- curse - ["http://cloud-3.steamusercontent.com/ugc/1011565208488654691/8F0B399048EBC34CD24B99AAD415AEC40E679C65/"] = "curse", - -- tentacle - ["https://i.imgur.com/lns4fhz.png"] = "Auto-Fail", - -- minus eight - ["https://i.imgur.com/9t3rPTQ.png"] = "-8", - -- minus seven - ["https://i.imgur.com/4WRD42n.png"] = "-7", - -- minus six - ["https://i.imgur.com/c9qdSzS.png"] = "-6", - -- minus five - ["https://i.imgur.com/3Ym1IeG.png"] = "-5", - -- minus four - ["https://i.imgur.com/qrgGQRD.png"] = "-4", - -- minus three - ["https://i.imgur.com/yfs8gHq.png"] = "-3", - -- minus two - ["https://i.imgur.com/bfTg2hb.png"] = "-2", - -- minus one - ["https://i.imgur.com/w3XbrCC.png"] = "-1", - -- zero - ["https://i.imgur.com/btEtVfd.png"] = "0", - -- plus one - ["https://i.imgur.com/uIx8jbY.png"] = "+1", - -- bless - ["http://cloud-3.steamusercontent.com/ugc/1011565208488650618/B2B081032AF3EFDBD90840A5D6888A3CEA228D66/"] = "bless", - -- elder sign - ["https://i.imgur.com/nEmqjmj.png"] = "Elder Sign", -} - -function resetStats() - for key,value in pairs(PULLS) do - PULLS[key] = 0 - end - for playerKey, playerValue in pairs(PLAYER_PULLS) do - for key,value in pairs(PULLS) do - PLAYER_PULLS[playerKey][key] = value - end - end - - -end - -function getPlayerName(playerMatGuid) - local playerColour = MAT_GUID_TO_COLOUR[playerMatGuid] - if Player[playerColour].seated then - return Player[playerColour].steam_name - else - return playerColour - end -end - -function printStats() - local squidKing = "Nobody" - local maxSquid = 0 - - printToAll("\nOverall Game stats\n") - printNonZeroTokenPairs(PULLS) - printToAll("\nIndividual Stats\n") - for playerMatGuid, countTable in pairs(PLAYER_PULLS) do - local playerName = getPlayerName(playerMatGuid) - printToAll(playerName .. " Stats", {r=255,g=0,b=0}) - printNonZeroTokenPairs(PLAYER_PULLS[playerMatGuid]) - playerSquidCount = PLAYER_PULLS[playerMatGuid]["https://i.imgur.com/lns4fhz.png"] - if playerSquidCount != nil and playerSquidCount > maxSquid then - squidKing = playerName - end - end - printToAll(squidKing .. " is an auto-fail magnet.", {r=255,g=0,b=0}) -end - -function printNonZeroTokenPairs(theTable) - for key,value in pairs(theTable) do - if value != 0 then - printToAll(IMAGE_TOKEN_MAP[key] .. '=' .. tostring(value)) - end - end -end - --- Remove comments to enable autorotate cards on hands. --- function onObjectEnterScriptingZone(zone, object) --- Autorotate cards with right side up when entering hand. --- if zone.getGUID() == "c506bf" or -- white --- zone.getGUID() == "cbc751" then -- orange --- object.setRotationSmooth({0,270,0}) --- elseif zone.getGUID() == "67ce9a" then -- green --- object.setRotationSmooth({0,0,0}) --- elseif zone.getGUID() == "57c22c" then -- red --- object.setRotationSmooth({0,180,0}) ---end ---end - -function findInRadiusBy(pos, radius, filter, debug) - local radius = (radius or 1) - local objList = Physics.cast({ - origin = pos, - direction = {0,1,0}, - type = 2, - size = {radius, radius, radius}, - max_distance = 0, - debug = (debug or false) - }) - - local filteredList = {} - for _, obj in ipairs(objList) do - if filter == nil then - table.insert(filteredList, obj.hit_object) - elseif filter and filter(obj.hit_object) then - table.insert(filteredList, obj.hit_object) - end - end - return filteredList -end - -function dealCardsInRows(paramlist) - local currPosition={}; - local numRow=1; - local numCard=0; - local invMultiplier=1; - local allCardsDealed=0; - if paramlist.inverse then - invMultiplier=-1; - end - if paramlist.maxCardsDealed==nil then - - allCardsDealed=0; - paramlist.maxCardsDealed=paramlist.cardDeck.getQuantity() - - elseif paramlist.maxCardsDealed>=paramlist.cardDeck.getQuantity() or paramlist.maxCardsDealed<=0 then - - allCardsDealed=0; - paramlist.maxCardsDealed=paramlist.cardDeck.getQuantity() - - else - - allCardsDealed=1; - - end - - if paramlist.mode=="x" then - currPosition={paramlist.iniPosition[1]+(2*g_cardWith*invMultiplier*allCardsDealed),paramlist.iniPosition[2],paramlist.iniPosition[3]}; - - else - currPosition={paramlist.iniPosition[1],paramlist.iniPosition[2],paramlist.iniPosition[3]+(2*g_cardWith*invMultiplier*allCardsDealed)}; - - end - - for i = 1,paramlist.maxCardsDealed,1 do - - paramlist.cardDeck.takeObject - ({ - position= currPosition, - smooth= true - }); - - numCard=numCard+1; - if numCard>=paramlist.maxCardRow then - - if paramlist.mode=="x" then - currPosition={paramlist.iniPosition[1]+(2*g_cardWith*invMultiplier*allCardsDealed),paramlist.iniPosition[2],paramlist.iniPosition[3]}; - currPosition[3]=currPosition[3]-(numRow*g_cardHeigth*invMultiplier); - else - currPosition={paramlist.iniPosition[1],paramlist.iniPosition[2],paramlist.iniPosition[3]+(2*g_cardWith*invMultiplier*allCardsDealed)}; - currPosition[1]=currPosition[1]+(numRow*g_cardHeigth*invMultiplier); - end - numCard=0; - numRow=numRow+1; - - else - if paramlist.mode=="x" then - currPosition[1]=currPosition[1]+(g_cardWith*invMultiplier); - else - currPosition[3]=currPosition[3]+(g_cardWith*invMultiplier); - end - end - end -end - -function isDeck(x) - return x.tag == 'Deck' -end - -function isCardOrDeck(x) - return x.tag == 'Card' or isDeck(x) -end - -function drawEncountercard(params) --[[ Parameter Table Position, Table Rotation]] - local position = params[1] - local rotation = params[2] - local isFaceUp = params[3] - local faceUpRotation - if (isFaceUp) then - faceUpRotation = 0 - else - faceUpRotation = 180 - end - local items = findInRadiusBy(ENCOUNTER_DECK_POS, 4, isCardOrDeck) - if #items > 0 then - for i, v in ipairs(items) do - if v.tag == 'Deck' then - v.takeObject({index = 0, position = position, rotation = {0,rotation.y,faceUpRotation}}) - return - end - end --- we didn't find the deck so just pull the first thing we did find - items[1].setPositionSmooth(position, false, false) - items[1].setRotationSmooth({0,rotation.y,faceUpRotation}, false, false) - return - end --- nothing here, time to reshuffle - reshuffleEncounterDeck(position, {0,rotation.y,faceUpRotation}) -end - -IS_RESHUFFLING = false -function reshuffleEncounterDeck(position, rotation) - -- finishes moving the deck back and draws a card - local function move(deck) - deck.setPositionSmooth(ENCOUNTER_DECK_SPAWN_POS, true, false) - deck.takeObject({index = 0, position = position, rotation = rotation, flip = false}) - Wait.time(function() IS_RESHUFFLING = false end, 1) - end - -- bail out if we're mid reshuffle - if IS_RESHUFFLING then - return - end - local discarded = findInRadiusBy(ENCOUNTER_DECK_DISCARD_POSITION, 4, isDeck) - if #discarded > 0 then - IS_RESHUFFLING = true - local deck = discarded[1] - if not deck.is_face_down then - deck.flip() - end - deck.shuffle() - Wait.time(|| move(deck), 0.3) - else - printToAll("couldn't find encounter discard pile to reshuffle", {1, 0, 0}) - end -end - -CHAOS_TOKENS = {} -CHAOS_TOKENS_LAST_MAT = nil -function putBackChaosTokens() - local chaosbagposition = chaosbag.getPosition() - for k, token in pairs(CHAOS_TOKENS) do - if token != nil then - chaosbag.putObject(token) - token.setPosition({chaosbagposition[1],chaosbagposition[2]+0.5,chaosbagposition[3]}) - end - end - CHAOS_TOKENS = {} - end - -function drawChaostoken(params) - local mat = params[1] - local tokenOffset = params[2] - local isRightClick = params[3] - local isSameMat = (CHAOS_TOKENS_LAST_MAT == nil or CHAOS_TOKENS_LAST_MAT == mat) - if not isSameMat then - putBackChaosTokens() - end - CHAOS_TOKENS_LAST_MAT = mat - -- if we have left clicked and have no tokens OR if we have right clicked - if isRightClick or #CHAOS_TOKENS == 0 then - local items = getObjectFromGUID("83ef06").getObjects() - for i,v in ipairs(items) do - if items[i].getDescription() == "Chaos Bag" then - chaosbag = getObjectFromGUID(items[i].getGUID()) - break - end - end - -- bail out if we have no tokens - if #chaosbag.getObjects() == 0 then - return - end - chaosbag.shuffle() - -- add the token to the list, compute new position based on list length - tokenOffset[1] = tokenOffset[1] + (0.17 * #CHAOS_TOKENS) - local toPosition = mat.positionToWorld(tokenOffset) - local token = chaosbag.takeObject({ - index = 0, - position = toPosition, - rotation = mat.getRotation(), - callback_function = function(obj) take_callback(obj, mat) end - }) - CHAOS_TOKENS[#CHAOS_TOKENS + 1] = token - return - else - putBackChaosTokens() - end -end - -function spawnToken(params) - -- Position to spawn, - -- rotation vector to apply - -- translation vector to apply - -- token type - local position = params[1] - local tokenType = params[2] - local tokenData = TOKEN_DATA[tokenType] - if tokenData == nil then - error("no token data found for '" .. tokenType .. "'") - end - - local token = spawnObject({ - type = 'Custom_Token', - position = position, - rotation = {x=0, y=270, z=0} - }) - token.setCustomObject({ - image = tokenData['image'], - thickness = 0.3, - merge_distance = 5.0, - stackable = true, - }) - token.use_snap_points=false - token.scale(tokenData['scale']) - return token -end - -function round(params) -- Parameter (int number, int numberDecimalPlaces) - return tonumber(string.format("%." .. (params[2] or 0) .. "f", params[1])) -end - -function roundposition(params) -- Parameter (Table position) - return {round({params[1], 2}),round({params[2], 2}),round({params[3], 2})} -end - -function isEqual(params) --Parameter (Table table1, Table table2) returns true if the tables are equal - if params[1][1] == params[2][1] and params[1][2] == params[2][2] and params[1][3] == params[2][3] then - return true - else - return false - end -end - -function isFaceup(params) --Object object - if params.getRotation()[3] > -5 and params.getRotation()[3] < 5 then - return true - else - return false - end -end - ---Difficulty selector script - -function createSetupButtons(args) - local data = getDataValue('modeData', args.key) - if data ~= nil then - local z = -0.15 - if data.easy ~= nil then - args.object.createButton({ - label = 'Easy', - click_function = 'easyClick', - function_owner = args.object, - position = {0, 0.1, z}, - rotation = {0, 0, 0}, - scale = {0.47, 1, 0.47}, - height = 200, - width = 1150, - font_size = 100, - color = {0.87, 0.8, 0.70}, - font_color = {0, 0, 0} - }) - z = z + 0.20 - end - if data.normal ~= nil then - args.object.createButton({ - label = 'Standard', - click_function = 'normalClick', - function_owner = args.object, - position = {0, 0.1, z}, - rotation = {0, 0, 0}, - scale = {0.47, 1, 0.47}, - height = 200, - width = 1150, - font_size = 100, - color = {0.87, 0.8, 0.70}, - font_color = {0, 0, 0} - }) - z = z + 0.20 - end - if data.hard ~= nil then - args.object.createButton({ - label = 'Hard', - click_function = 'hardClick', - function_owner = args.object, - position = {0, 0.1, z}, - rotation = {0, 0, 0}, - scale = {0.47, 1, 0.47}, - height = 200, - width = 1150, - font_size = 100, - color = {0.87, 0.8, 0.70}, - font_color = {0, 0, 0} - }) - z = z + 0.20 - end - if data.expert ~= nil then - args.object.createButton({ - label = 'Expert', - click_function = 'expertClick', - function_owner = args.object, - position = {0, 0.1, z}, - rotation = {0, 0, 0}, - scale = {0.47, 1, 0.47}, - height = 200, - width = 1150, - font_size = 100, - color = {0.87, 0.8, 0.70}, - font_color = {0, 0, 0} - }) - z = z + 0.20 - end - z = z + 0.10 - if data.standalone ~= nil then - args.object.createButton({ - label = 'Standalone', - click_function = 'standaloneClick', - function_owner = args.object, - position = {0, 0.1, z}, - rotation = {0, 0, 0}, - scale = {0.47, 1, 0.47}, - height = 200, - width = 1150, - font_size = 100, - color = {0.87, 0.8, 0.70}, - font_color = {0, 0, 0} - }) - end - end -end - -function fillContainer(args) - local container = getObjectCache(containerId) - - if container ~= nil then - local data = getDataValue('modeData', args.key) - if data == nil then return end - - local value = data[args.mode] - if value == nil or value.token == nil then return end - - local pos = container.getPosition() - if args.object ~= nil then - pos = args.object.getPosition() - end - - cleanContainer(container) - - for _, token in ipairs(value.token) do - local obj = spawnToken_2(token, pos) - if obj ~= nil then - container.putObject(obj) - end - end - - if value.append ~= nil then - for _, token in ipairs(value.append) do - local obj = spawnToken_2(token, pos) - if obj ~= nil then - container.putObject(obj) - end - end - end - - if value.random then - local n = #value.random - if n > 0 then - for _, token in ipairs(value.random[getRandomCount(n)]) do - local obj = spawnToken_2(token, pos) - if obj ~= nil then - container.putObject(obj) - end - end - end - end - - if value.message then - broadcastToAll(value.message) - end - if value.warning then - broadcastToAll(value.warning, { 1, 0.5, 0.5 }) - end - end -end - -function spawnToken_2(id, pos) - local url = getImageUrl(id) - if url ~= '' then - local obj = spawnObject({ - type = 'Custom_Tile', - position = {pos.x, pos.y + 3, pos.z}, - rotation = {x = 0, y = 260, z = 0} - }) - obj.setCustomObject({ - type = 2, - image = url, - thickness = 0.10, - }) - obj.scale {0.81, 1, 0.81} - return obj - end -end - -function getImageUrl(id) - if id == 'p1' then return 'https://i.imgur.com/uIx8jbY.png' end - if id == '0' then return 'https://i.imgur.com/btEtVfd.png' end - if id == 'm1' then return 'https://i.imgur.com/w3XbrCC.png' end - if id == 'm2' then return 'https://i.imgur.com/bfTg2hb.png' end - if id == 'm3' then return 'https://i.imgur.com/yfs8gHq.png' end - if id == 'm4' then return 'https://i.imgur.com/qrgGQRD.png' end - if id == 'm5' then return 'https://i.imgur.com/3Ym1IeG.png' end - if id == 'm6' then return 'https://i.imgur.com/c9qdSzS.png' end - if id == 'm7' then return 'https://i.imgur.com/4WRD42n.png' end - if id == 'm8' then return 'https://i.imgur.com/9t3rPTQ.png' end - if id == 'skull' then return 'https://i.imgur.com/stbBxtx.png' end - if id == 'cultist' then return 'https://i.imgur.com/VzhJJaH.png' end - if id == 'tablet' then return 'https://i.imgur.com/1plY463.png' end - if id == 'elder' then return 'https://i.imgur.com/ttnspKt.png' end - if id == 'red' then return 'https://i.imgur.com/lns4fhz.png' end - if id == 'blue' then return 'https://i.imgur.com/nEmqjmj.png' end - return '' -end - -function cleanContainer(container) - for _, item in ipairs(container.getObjects()) do - destroyObject(container.takeObject({})) - end -end - -function getObjectsInZone(zoneId) - local zoneObject = getObjectCache(zoneId) - - if zoneObject == nil then - return - end - - local objectsInZone = zoneObject.getObjects() - local objectsFound = {} - - for i = 1, #objectsInZone do - local object = objectsInZone[i] - if object.tag == 'Bag' then - table.insert(objectsFound, object.guid) - end - end - - if #objectsFound > 0 then - return objectsFound - end -end - -function getObjectCache(id) - if CACHE.object[id] == nil then - CACHE.object[id] = getObjectFromGUID(id) - end - return CACHE.object[id] -end - -function getDataTable(storage) - if CACHE.data[storage] == nil then - local obj = getObjectCache(tokenDataId) - if obj ~= nil then - CACHE.data[storage] = obj.getTable(storage) - end - end - return CACHE.data[storage] -end - -function getDataValue(storage, key) - local data = getDataTable(storage) - if data ~= nil then - local value = data[key] - if value ~= nil then - local res = {} - for m, v in pairs(value) do - res[m] = v - if res[m].parent ~= nil then - local parentData = getDataValue(storage, res[m].parent) - if parentData ~= nil and parentData[m] ~= nil and parentData[m].token ~= nil then - res[m].token = parentData[m].token - end - res[m].parent = nil - end - end - return res - end - end -end - -function getRandomCount(to) - updateRandomSeed() - return math.random(1, to) -end - -function updateRandomSeed() - local chance = math.random(1,10) - if chance == 1 then - math.randomseed(os.time()) - end -end - +--[[ Lua code. See documentation: http://berserk-games.com/knowledgebase/scripting/ --]] +-- Card size used for autodealing -- + +-- global position constants +ENCOUNTER_DECK_POS = {-3.8, 1, 5.7} +ENCOUNTER_DECK_SPAWN_POS = {-3.8, 3, 5.7} +ENCOUNTER_DECK_DISCARD_POSITION = {-3.8, 0.5, 10.5} +g_cardWith=2.30; +g_cardHeigth=3.40; + +containerId = 'fea079' +tokenDataId = '708279' + + +CACHE = { + object = {}, + data = {} +} + +--[[ The OnLoad function. This is called after everything in the game save finishes loading. +Most of your script code goes here. --]] +function onload() + --Player.White.changeColor('Yellow') + tokenplayerone = { + damageone = "https://i.imgur.com/XIJHw3J.png", + damagethree = "https://i.imgur.com/eqRC712.png", + horrorone = "https://i.imgur.com/Bh0BO47.png", + horrorthree = "https://i.imgur.com/pZvTKA7.png", + resource = "https://i.imgur.com/j5v5E3j.png", + resourcethree = "https://i.imgur.com/1GZsDTt.png", + doom = "https://i.imgur.com/EoL7yaZ.png", + clue = "https://i.imgur.com/wfCaVU0.png" + } + + TOKEN_DATA = { + clue = {image = tokenplayerone.clue, scale = {0.15, 0.15, 0.15}}, + resource = {image = tokenplayerone.resource, scale = {0.17, 0.17, 0.17}}, + doom = {image = tokenplayerone.doom, scale = {0.17, 0.17, 0.17}} + } + + getObjectFromGUID("6161b4").interactable=false + getObjectFromGUID("721ba2").interactable=false + getObjectFromGUID("9f334f").interactable=false + getObjectFromGUID("23a43c").interactable=false + getObjectFromGUID("5450cc").interactable=false + getObjectFromGUID("463022").interactable=false + getObjectFromGUID("9487a4").interactable=false + getObjectFromGUID("91dd9b").interactable=false + getObjectFromGUID("f182ee").interactable=false + +end + +function take_callback(object_spawned, mat) + customObject = object_spawned.getCustomObject() + local player = mat.getGUID(); + + local image = customObject.image + + -- Update global stats + if PULLS[image] == nil then + PULLS[image] = 0 + end + PULLS[image] = PULLS[image] + 1 + -- Update player stats + if PLAYER_PULLS[player][image] == nil then + PLAYER_PULLS[player][image] = 0 + end + PLAYER_PULLS[player][image] = PLAYER_PULLS[player][image] + 1 + +end +MAT_GUID_TO_COLOUR = { + ["8b081b"] = "White", + -- player 2 conrad + ["bd0ff4"] = "Orange", + -- player + ["383d8b"] = "Green", + -- playur 4 olivia + ["0840d5"] = "Red" +} + + +PLAYER_PULLS = { + -- player 1 max + ["8b081b"] = {}, + -- player 2 conrad + ["bd0ff4"] = {}, + -- player + ["383d8b"] = {}, + -- playur 4 olivia + ["0840d5"] = {} +} + +PULLS = { + -- cultist + ["https://i.imgur.com/VzhJJaH.png"] = 0, + -- skull + ["https://i.imgur.com/stbBxtx.png"] = 0, + -- tablet + ["https://i.imgur.com/1plY463.png"] = 0, + -- curse + ["http://cloud-3.steamusercontent.com/ugc/1011565208488654691/8F0B399048EBC34CD24B99AAD415AEC40E679C65/"] = 0, + -- tentacle + ["https://i.imgur.com/lns4fhz.png"] = 0, + -- minus eight + ["https://i.imgur.com/9t3rPTQ.png"] = 0, + -- minus seven + ["https://i.imgur.com/4WRD42n.png"] = 0, + -- minus six + ["https://i.imgur.com/c9qdSzS.png"] = 0, + -- minus five + ["https://i.imgur.com/3Ym1IeG.png"] = 0, + -- minus four + ["https://i.imgur.com/qrgGQRD.png"] = 0, + -- minus three + ["https://i.imgur.com/yfs8gHq.png"] = 0, + -- minus two + ["https://i.imgur.com/bfTg2hb.png"] = 0, + -- minus one + ["https://i.imgur.com/w3XbrCC.png"] = 0, + -- zero + ["https://i.imgur.com/btEtVfd.png"] = 0, + -- plus one + ["https://i.imgur.com/uIx8jbY.png"] = 0, + -- elder thing + ["https://i.imgur.com/ttnspKt.png"] = 0, + -- bless + ["http://cloud-3.steamusercontent.com/ugc/1011565208488650618/B2B081032AF3EFDBD90840A5D6888A3CEA228D66/"] = 0, + -- elder sign + ["https://i.imgur.com/nEmqjmj.png"] = 0, +} + +IMAGE_TOKEN_MAP = { + -- cultist + ["https://i.imgur.com/VzhJJaH.png"] = "cultist", + -- skull + ["https://i.imgur.com/stbBxtx.png"] = "skull", + -- tablet + ["https://i.imgur.com/1plY463.png"] = "tablet", + -- elder thing + ["https://i.imgur.com/ttnspKt.png"] = "Elder Thing", + -- curse + ["http://cloud-3.steamusercontent.com/ugc/1011565208488654691/8F0B399048EBC34CD24B99AAD415AEC40E679C65/"] = "curse", + -- tentacle + ["https://i.imgur.com/lns4fhz.png"] = "Auto-Fail", + -- minus eight + ["https://i.imgur.com/9t3rPTQ.png"] = "-8", + -- minus seven + ["https://i.imgur.com/4WRD42n.png"] = "-7", + -- minus six + ["https://i.imgur.com/c9qdSzS.png"] = "-6", + -- minus five + ["https://i.imgur.com/3Ym1IeG.png"] = "-5", + -- minus four + ["https://i.imgur.com/qrgGQRD.png"] = "-4", + -- minus three + ["https://i.imgur.com/yfs8gHq.png"] = "-3", + -- minus two + ["https://i.imgur.com/bfTg2hb.png"] = "-2", + -- minus one + ["https://i.imgur.com/w3XbrCC.png"] = "-1", + -- zero + ["https://i.imgur.com/btEtVfd.png"] = "0", + -- plus one + ["https://i.imgur.com/uIx8jbY.png"] = "+1", + -- bless + ["http://cloud-3.steamusercontent.com/ugc/1011565208488650618/B2B081032AF3EFDBD90840A5D6888A3CEA228D66/"] = "bless", + -- elder sign + ["https://i.imgur.com/nEmqjmj.png"] = "Elder Sign", +} + +function resetStats() + for key,value in pairs(PULLS) do + PULLS[key] = 0 + end + for playerKey, playerValue in pairs(PLAYER_PULLS) do + for key,value in pairs(PULLS) do + PLAYER_PULLS[playerKey][key] = value + end + end + + +end + +function getPlayerName(playerMatGuid) + local playerColour = MAT_GUID_TO_COLOUR[playerMatGuid] + if Player[playerColour].seated then + return Player[playerColour].steam_name + else + return playerColour + end +end + +function printStats() + local squidKing = "Nobody" + local maxSquid = 0 + + printToAll("\nOverall Game stats\n") + printNonZeroTokenPairs(PULLS) + printToAll("\nIndividual Stats\n") + for playerMatGuid, countTable in pairs(PLAYER_PULLS) do + local playerName = getPlayerName(playerMatGuid) + printToAll(playerName .. " Stats", {r=255,g=0,b=0}) + printNonZeroTokenPairs(PLAYER_PULLS[playerMatGuid]) + playerSquidCount = PLAYER_PULLS[playerMatGuid]["https://i.imgur.com/lns4fhz.png"] + if playerSquidCount != nil and playerSquidCount > maxSquid then + squidKing = playerName + end + end + printToAll(squidKing .. " is an auto-fail magnet.", {r=255,g=0,b=0}) +end + +function printNonZeroTokenPairs(theTable) + for key,value in pairs(theTable) do + if value != 0 then + printToAll(IMAGE_TOKEN_MAP[key] .. '=' .. tostring(value)) + end + end +end + +-- Remove comments to enable autorotate cards on hands. +-- function onObjectEnterScriptingZone(zone, object) +-- Autorotate cards with right side up when entering hand. +-- if zone.getGUID() == "c506bf" or -- white +-- zone.getGUID() == "cbc751" then -- orange +-- object.setRotationSmooth({0,270,0}) +-- elseif zone.getGUID() == "67ce9a" then -- green +-- object.setRotationSmooth({0,0,0}) +-- elseif zone.getGUID() == "57c22c" then -- red +-- object.setRotationSmooth({0,180,0}) +--end +--end + +function findInRadiusBy(pos, radius, filter, debug) + local radius = (radius or 1) + local objList = Physics.cast({ + origin = pos, + direction = {0,1,0}, + type = 2, + size = {radius, radius, radius}, + max_distance = 0, + debug = (debug or false) + }) + + local filteredList = {} + for _, obj in ipairs(objList) do + if filter == nil then + table.insert(filteredList, obj.hit_object) + elseif filter and filter(obj.hit_object) then + table.insert(filteredList, obj.hit_object) + end + end + return filteredList +end + +function dealCardsInRows(paramlist) + local currPosition={}; + local numRow=1; + local numCard=0; + local invMultiplier=1; + local allCardsDealed=0; + if paramlist.inverse then + invMultiplier=-1; + end + if paramlist.maxCardsDealed==nil then + + allCardsDealed=0; + paramlist.maxCardsDealed=paramlist.cardDeck.getQuantity() + + elseif paramlist.maxCardsDealed>=paramlist.cardDeck.getQuantity() or paramlist.maxCardsDealed<=0 then + + allCardsDealed=0; + paramlist.maxCardsDealed=paramlist.cardDeck.getQuantity() + + else + + allCardsDealed=1; + + end + + if paramlist.mode=="x" then + currPosition={paramlist.iniPosition[1]+(2*g_cardWith*invMultiplier*allCardsDealed),paramlist.iniPosition[2],paramlist.iniPosition[3]}; + + else + currPosition={paramlist.iniPosition[1],paramlist.iniPosition[2],paramlist.iniPosition[3]+(2*g_cardWith*invMultiplier*allCardsDealed)}; + + end + + for i = 1,paramlist.maxCardsDealed,1 do + + paramlist.cardDeck.takeObject + ({ + position= currPosition, + smooth= true + }); + + numCard=numCard+1; + if numCard>=paramlist.maxCardRow then + + if paramlist.mode=="x" then + currPosition={paramlist.iniPosition[1]+(2*g_cardWith*invMultiplier*allCardsDealed),paramlist.iniPosition[2],paramlist.iniPosition[3]}; + currPosition[3]=currPosition[3]-(numRow*g_cardHeigth*invMultiplier); + else + currPosition={paramlist.iniPosition[1],paramlist.iniPosition[2],paramlist.iniPosition[3]+(2*g_cardWith*invMultiplier*allCardsDealed)}; + currPosition[1]=currPosition[1]+(numRow*g_cardHeigth*invMultiplier); + end + numCard=0; + numRow=numRow+1; + + else + if paramlist.mode=="x" then + currPosition[1]=currPosition[1]+(g_cardWith*invMultiplier); + else + currPosition[3]=currPosition[3]+(g_cardWith*invMultiplier); + end + end + end +end + +function isDeck(x) + return x.tag == 'Deck' +end + +function isCardOrDeck(x) + return x.tag == 'Card' or isDeck(x) +end + +function drawEncountercard(params) --[[ Parameter Table Position, Table Rotation]] + local position = params[1] + local rotation = params[2] + local isFaceUp = params[3] + local faceUpRotation + if (isFaceUp) then + faceUpRotation = 0 + else + faceUpRotation = 180 + end + local items = findInRadiusBy(ENCOUNTER_DECK_POS, 4, isCardOrDeck) + if #items > 0 then + for i, v in ipairs(items) do + if v.tag == 'Deck' then + v.takeObject({index = 0, position = position, rotation = {0,rotation.y,faceUpRotation}}) + return + end + end +-- we didn't find the deck so just pull the first thing we did find + items[1].setPositionSmooth(position, false, false) + items[1].setRotationSmooth({0,rotation.y,faceUpRotation}, false, false) + return + end +-- nothing here, time to reshuffle + reshuffleEncounterDeck(position, {0,rotation.y,faceUpRotation}) +end + +IS_RESHUFFLING = false +function reshuffleEncounterDeck(position, rotation) + -- finishes moving the deck back and draws a card + local function move(deck) + deck.setPositionSmooth(ENCOUNTER_DECK_SPAWN_POS, true, false) + deck.takeObject({index = 0, position = position, rotation = rotation, flip = false}) + Wait.time(function() IS_RESHUFFLING = false end, 1) + end + -- bail out if we're mid reshuffle + if IS_RESHUFFLING then + return + end + local discarded = findInRadiusBy(ENCOUNTER_DECK_DISCARD_POSITION, 4, isDeck) + if #discarded > 0 then + IS_RESHUFFLING = true + local deck = discarded[1] + if not deck.is_face_down then + deck.flip() + end + deck.shuffle() + Wait.time(|| move(deck), 0.3) + else + printToAll("couldn't find encounter discard pile to reshuffle", {1, 0, 0}) + end +end + +CHAOS_TOKENS = {} +CHAOS_TOKENS_LAST_MAT = nil +function putBackChaosTokens() + local chaosbagposition = chaosbag.getPosition() + for k, token in pairs(CHAOS_TOKENS) do + if token != nil then + chaosbag.putObject(token) + token.setPosition({chaosbagposition[1],chaosbagposition[2]+0.5,chaosbagposition[3]}) + end + end + CHAOS_TOKENS = {} + end + +function drawChaostoken(params) + local mat = params[1] + local tokenOffset = params[2] + local isRightClick = params[3] + local isSameMat = (CHAOS_TOKENS_LAST_MAT == nil or CHAOS_TOKENS_LAST_MAT == mat) + if not isSameMat then + putBackChaosTokens() + end + CHAOS_TOKENS_LAST_MAT = mat + -- if we have left clicked and have no tokens OR if we have right clicked + if isRightClick or #CHAOS_TOKENS == 0 then + local items = getObjectFromGUID("83ef06").getObjects() + for i,v in ipairs(items) do + if items[i].getDescription() == "Chaos Bag" then + chaosbag = getObjectFromGUID(items[i].getGUID()) + break + end + end + -- bail out if we have no tokens + if #chaosbag.getObjects() == 0 then + return + end + chaosbag.shuffle() + -- add the token to the list, compute new position based on list length + tokenOffset[1] = tokenOffset[1] + (0.17 * #CHAOS_TOKENS) + local toPosition = mat.positionToWorld(tokenOffset) + local token = chaosbag.takeObject({ + index = 0, + position = toPosition, + rotation = mat.getRotation(), + callback_function = function(obj) take_callback(obj, mat) end + }) + CHAOS_TOKENS[#CHAOS_TOKENS + 1] = token + return + else + putBackChaosTokens() + end +end + +function spawnToken(params) + -- Position to spawn, + -- rotation vector to apply + -- translation vector to apply + -- token type + local position = params[1] + local tokenType = params[2] + local tokenData = TOKEN_DATA[tokenType] + if tokenData == nil then + error("no token data found for '" .. tokenType .. "'") + end + + local token = spawnObject({ + type = 'Custom_Token', + position = position, + rotation = {x=0, y=270, z=0} + }) + token.setCustomObject({ + image = tokenData['image'], + thickness = 0.3, + merge_distance = 5.0, + stackable = true, + }) + token.use_snap_points=false + token.scale(tokenData['scale']) + return token +end + +function round(params) -- Parameter (int number, int numberDecimalPlaces) + return tonumber(string.format("%." .. (params[2] or 0) .. "f", params[1])) +end + +function roundposition(params) -- Parameter (Table position) + return {round({params[1], 2}),round({params[2], 2}),round({params[3], 2})} +end + +function isEqual(params) --Parameter (Table table1, Table table2) returns true if the tables are equal + if params[1][1] == params[2][1] and params[1][2] == params[2][2] and params[1][3] == params[2][3] then + return true + else + return false + end +end + +function isFaceup(params) --Object object + if params.getRotation()[3] > -5 and params.getRotation()[3] < 5 then + return true + else + return false + end +end + +--Difficulty selector script + +function createSetupButtons(args) + local data = getDataValue('modeData', args.key) + if data ~= nil then + local z = -0.15 + if data.easy ~= nil then + args.object.createButton({ + label = 'Easy', + click_function = 'easyClick', + function_owner = args.object, + position = {0, 0.1, z}, + rotation = {0, 0, 0}, + scale = {0.47, 1, 0.47}, + height = 200, + width = 1150, + font_size = 100, + color = {0.87, 0.8, 0.70}, + font_color = {0, 0, 0} + }) + z = z + 0.20 + end + if data.normal ~= nil then + args.object.createButton({ + label = 'Standard', + click_function = 'normalClick', + function_owner = args.object, + position = {0, 0.1, z}, + rotation = {0, 0, 0}, + scale = {0.47, 1, 0.47}, + height = 200, + width = 1150, + font_size = 100, + color = {0.87, 0.8, 0.70}, + font_color = {0, 0, 0} + }) + z = z + 0.20 + end + if data.hard ~= nil then + args.object.createButton({ + label = 'Hard', + click_function = 'hardClick', + function_owner = args.object, + position = {0, 0.1, z}, + rotation = {0, 0, 0}, + scale = {0.47, 1, 0.47}, + height = 200, + width = 1150, + font_size = 100, + color = {0.87, 0.8, 0.70}, + font_color = {0, 0, 0} + }) + z = z + 0.20 + end + if data.expert ~= nil then + args.object.createButton({ + label = 'Expert', + click_function = 'expertClick', + function_owner = args.object, + position = {0, 0.1, z}, + rotation = {0, 0, 0}, + scale = {0.47, 1, 0.47}, + height = 200, + width = 1150, + font_size = 100, + color = {0.87, 0.8, 0.70}, + font_color = {0, 0, 0} + }) + z = z + 0.20 + end + z = z + 0.10 + if data.standalone ~= nil then + args.object.createButton({ + label = 'Standalone', + click_function = 'standaloneClick', + function_owner = args.object, + position = {0, 0.1, z}, + rotation = {0, 0, 0}, + scale = {0.47, 1, 0.47}, + height = 200, + width = 1150, + font_size = 100, + color = {0.87, 0.8, 0.70}, + font_color = {0, 0, 0} + }) + end + end +end + +function fillContainer(args) + local container = getObjectCache(containerId) + + if container ~= nil then + local data = getDataValue('modeData', args.key) + if data == nil then return end + + local value = data[args.mode] + if value == nil or value.token == nil then return end + + local pos = container.getPosition() + if args.object ~= nil then + pos = args.object.getPosition() + end + + cleanContainer(container) + + for _, token in ipairs(value.token) do + local obj = spawnToken_2(token, pos) + if obj ~= nil then + container.putObject(obj) + end + end + + if value.append ~= nil then + for _, token in ipairs(value.append) do + local obj = spawnToken_2(token, pos) + if obj ~= nil then + container.putObject(obj) + end + end + end + + if value.random then + local n = #value.random + if n > 0 then + for _, token in ipairs(value.random[getRandomCount(n)]) do + local obj = spawnToken_2(token, pos) + if obj ~= nil then + container.putObject(obj) + end + end + end + end + + if value.message then + broadcastToAll(value.message) + end + if value.warning then + broadcastToAll(value.warning, { 1, 0.5, 0.5 }) + end + end +end + +function spawnToken_2(id, pos) + local url = getImageUrl(id) + if url ~= '' then + local obj = spawnObject({ + type = 'Custom_Tile', + position = {pos.x, pos.y + 3, pos.z}, + rotation = {x = 0, y = 260, z = 0} + }) + obj.setCustomObject({ + type = 2, + image = url, + thickness = 0.10, + }) + obj.scale {0.81, 1, 0.81} + return obj + end +end + +function getImageUrl(id) + if id == 'p1' then return 'https://i.imgur.com/uIx8jbY.png' end + if id == '0' then return 'https://i.imgur.com/btEtVfd.png' end + if id == 'm1' then return 'https://i.imgur.com/w3XbrCC.png' end + if id == 'm2' then return 'https://i.imgur.com/bfTg2hb.png' end + if id == 'm3' then return 'https://i.imgur.com/yfs8gHq.png' end + if id == 'm4' then return 'https://i.imgur.com/qrgGQRD.png' end + if id == 'm5' then return 'https://i.imgur.com/3Ym1IeG.png' end + if id == 'm6' then return 'https://i.imgur.com/c9qdSzS.png' end + if id == 'm7' then return 'https://i.imgur.com/4WRD42n.png' end + if id == 'm8' then return 'https://i.imgur.com/9t3rPTQ.png' end + if id == 'skull' then return 'https://i.imgur.com/stbBxtx.png' end + if id == 'cultist' then return 'https://i.imgur.com/VzhJJaH.png' end + if id == 'tablet' then return 'https://i.imgur.com/1plY463.png' end + if id == 'elder' then return 'https://i.imgur.com/ttnspKt.png' end + if id == 'red' then return 'https://i.imgur.com/lns4fhz.png' end + if id == 'blue' then return 'https://i.imgur.com/nEmqjmj.png' end + return '' +end + +function cleanContainer(container) + for _, item in ipairs(container.getObjects()) do + destroyObject(container.takeObject({})) + end +end + +function getObjectsInZone(zoneId) + local zoneObject = getObjectCache(zoneId) + + if zoneObject == nil then + return + end + + local objectsInZone = zoneObject.getObjects() + local objectsFound = {} + + for i = 1, #objectsInZone do + local object = objectsInZone[i] + if object.tag == 'Bag' then + table.insert(objectsFound, object.guid) + end + end + + if #objectsFound > 0 then + return objectsFound + end +end + +function getObjectCache(id) + if CACHE.object[id] == nil then + CACHE.object[id] = getObjectFromGUID(id) + end + return CACHE.object[id] +end + +function getDataTable(storage) + if CACHE.data[storage] == nil then + local obj = getObjectCache(tokenDataId) + if obj ~= nil then + CACHE.data[storage] = obj.getTable(storage) + end + end + return CACHE.data[storage] +end + +function getDataValue(storage, key) + local data = getDataTable(storage) + if data ~= nil then + local value = data[key] + if value ~= nil then + local res = {} + for m, v in pairs(value) do + res[m] = v + if res[m].parent ~= nil then + local parentData = getDataValue(storage, res[m].parent) + if parentData ~= nil and parentData[m] ~= nil and parentData[m].token ~= nil then + res[m].token = parentData[m].token + end + res[m].parent = nil + end + end + return res + end + end +end + +function getRandomCount(to) + updateRandomSeed() + return math.random(1, to) +end + +function updateRandomSeed() + local chance = math.random(1,10) + if chance == 1 then + math.randomseed(os.time()) + end +end + diff --git a/unpacked.yaml b/unpacked.yaml index 0e8358c06..48c50fc24 100644 --- a/unpacked.yaml +++ b/unpacked.yaml @@ -22,7 +22,7 @@ CameraStates: - null - null - null -Date: 11/7/2020 5:09:33 PM +Date: 12/5/2020 3:36:33 PM DecalPallet: - ImageURL: http://cloud-3.steamusercontent.com/ugc/1474319121424323663/BC5570ECF747F1B30224461B576E8B0FE7FA5F33/ Name: Achivement Checkmark @@ -230,9 +230,9 @@ Hands: rotX: 0.0 rotY: 90.0 rotZ: 0.0 - scaleX: 22.88 + scaleX: 22.91 scaleY: 7.0 - scaleZ: 7.07 + scaleZ: 7.08 - Color: Red Transform: posX: -27.96 @@ -263,10 +263,10 @@ Hands: rotX: 0.0 rotY: 90.0 rotZ: 0.0 - scaleX: 22.88 + scaleX: 22.91 scaleY: 7.0 - scaleZ: 7.07 - Hiding: 2 + scaleZ: 7.08 + Hiding: 0 Lighting: AmbientEquatorColor: b: 0.5 @@ -384,7 +384,6 @@ ObjectStates: - !include 'unpacked/Custom_Model_Infinite_Bag Clue tokens 11e0cf.yaml' - !include 'unpacked/Custom_Model_Infinite_Bag Doom tokens b015d8.yaml' - !include 'unpacked/Custom_Token Agenda Deck 85c4c6.yaml' -- !include 'unpacked/Custom_Model_Bag Arkhamdb bag b85d6d.yaml' - !include 'unpacked/Custom_Token b7b45b.yaml' - !include 'unpacked/Custom_Tile 2eca7c.yaml' - !include 'unpacked/Custom_Tile fb09d4.yaml' @@ -412,7 +411,6 @@ ObjectStates: - !include 'unpacked/Custom_Tile Playermat 1 White 8b081b.yaml' - !include 'unpacked/Custom_Tile Playermat 2 Orange bd0ff4.yaml' - !include 'unpacked/Custom_Tile Playermat 4 Red 0840d5.yaml' -- !include 'unpacked/Custom_Tile Deck Importer 928c8e.yaml' - !include 'unpacked/Custom_Model 4ee1f2.yaml' - !include 'unpacked/Custom_Model_Bag Rulebooks, Guides and Tablets 304ffc.yaml' - !include 'unpacked/Custom_Model f18c2d.yaml' @@ -535,11 +533,14 @@ ObjectStates: - !include 'unpacked/ScriptingTrigger b047f8.yaml' - !include 'unpacked/ScriptingTrigger 18538f.yaml' - !include 'unpacked/Custom_Model_Bag Taboo Cards 1fc4e0.yaml' -- !include 'unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef.yaml' -- !include 'unpacked/Custom_Model Custom Data Helper c0b834.yaml' - !include 'unpacked/Custom_Token Chaos Bag Stat Tracker 766620.yaml' -- !include 'unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.yaml' -- !include 'unpacked/Notecard Arkham SCE 1.51 - 1172020 - Page 1 094d4d.yaml' +- !include 'unpacked/Bag All Player Cards 15bb07.yaml' +- !include 'unpacked/Bag Random Basic Weaknesses 770c4e.yaml' +- !include 'unpacked/Custom_Tile New Deck Importer edad66.yaml' +- !include 'unpacked/Custom_Model_Bag Artifact Expansion b43c9c.yaml' +- !include 'unpacked/Deck a9ec03.yaml' +- !include 'unpacked/Custom_Model Custom Data Helper c0b834.yaml' +- !include 'unpacked/Notecard Arkham SCE 1.52 - 1252020 - Page 1 af01b8.yaml' PlayArea: 1.0 PlayerCounts: - 0 @@ -548,7 +549,7 @@ PlayingTime: - 0 - 0 Rules: '' -SaveName: Arkham SCE 1.51 +SaveName: Arkham SCE 1.52 Sky: Sky_Museum SkyURL: https://i.imgur.com/GkQqaOF.jpg SnapPoints: diff --git a/unpacked/3DText 65eb7e.yaml b/unpacked/3DText 65eb7e.yaml index 47c725050..691547c4b 100644 --- a/unpacked/3DText 65eb7e.yaml +++ b/unpacked/3DText 65eb7e.yaml @@ -32,7 +32,7 @@ Transform: posX: -48.92 posY: 1.25 posZ: 71.4 - rotX: 89.97 + rotX: 89.98 rotY: 90.0 rotZ: 0.0 scaleX: 1.0 diff --git a/unpacked/Bag All Player Cards 15bb07.yaml b/unpacked/Bag All Player Cards 15bb07.yaml new file mode 100644 index 000000000..5a0a77249 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07.yaml @@ -0,0 +1,1030 @@ +Autoraise: true +ColorDiffuse: + b: 0.0 + g: 0.366520882 + r: 0.7058823 +ContainedObjects: +- !include 'Bag All Player Cards 15bb07/Card Gilded Volto d0e108.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pantalone 7f1927.yaml' +- !include 'Bag All Player Cards 15bb07/Card Medico Della Peste 6179d5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bauta 9c9196.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hospital Debts 47d6c9.yaml' +- !include 'Bag All Player Cards 15bb07/Card On the Lam f7095f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Wish Eater 464ca1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Key of Ys (5) 1c98ff.yaml' +- !include 'Bag All Player Cards 15bb07/Card Prescient 7e7873.yaml' +- !include 'Bag All Player Cards 15bb07/Card Armor of Ardennes (5) f7a9ab.yaml' +- !include 'Bag All Player Cards 15bb07/Card Zebulon Whateley 6714b2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Swift Reload (2) 2cfa4f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Clarity of Mind 8e57b8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Defiance (2) bf3dd1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Seeking Answers (2) c1365d.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Daisy''s Tote Bag cf41be.yaml' +- !include 'Bag All Player Cards 15bb07/Card Clasp of Black Onyx f295d9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Investments b65011.yaml' +- !include 'Bag All Player Cards 15bb07/Card Guard Dog 08bdf1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Doomed ba2ae1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hair of the Dog 61c4c5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Well-Maintained (1) e454c3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stick to the Plan (3) 82d62c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Abandoned and Alone 79b4af.yaml' +- !include 'Bag All Player Cards 15bb07/Card Granny Orne (3) 52a66f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Backstab cdfd9f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Tetsuo Mori 08e5a6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Until the End of Time 41a9ec.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hired Muscle (1) cdd6aa.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cherished Keepsake 215cec.yaml' +- !include 'Bag All Player Cards 15bb07/Card Henry Wan 9df9df.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cryptic Research (4) 5d25b1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sneak Attack (2) 5f19e0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Extensive Research 013446.yaml' +- !include 'Bag All Player Cards 15bb07/Card Watch this! c40cb4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Quick Study (2) 092e92.yaml' +- !include 'Bag All Player Cards 15bb07/Card Survival Knife 4d971e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cunning Distraction e8ea95.yaml' +- !include 'Bag All Player Cards 15bb07/Card Suggestion (1) 0ec9bf.yaml' +- !include 'Bag All Player Cards 15bb07/Card Strange Solution (4) 9afe23.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pathfinder (1) (Taboo) ecbea8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Snare Trap (2) f66dd9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dendromorphosis 121b2d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mitch Brown f91fd9.yaml' +- !include "Bag All Player Cards 15bb07/Card I've had worse\u2026 (2) 76147b.yaml" +- !include 'Bag All Player Cards 15bb07/Card Truth from Fiction d64c99.yaml' +- !include 'Bag All Player Cards 15bb07/Card Self-Destructive 2204cc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Azure Flame 17319c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Decorated Skull 07350b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Word of Command (2) 26853e.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Tattered Cloak 5d30a1.yaml' +- !include 'Bag All Player Cards 15bb07/Card A Chance Encounter (2) 0edef1.yaml' +- !include 'Bag All Player Cards 15bb07/Card I''ve got a plan! (2) 344e90.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mind Wipe (3) e72762.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hired Dogs 44bc00.yaml' +- !include 'Bag All Player Cards 15bb07/Card Trusted 1bc300.yaml' +- !include 'Bag All Player Cards 15bb07/Card Chicago Typewriter (4) ecfa42.yaml' +- !include 'Bag All Player Cards 15bb07/Card Heroic Rescue (2) 93381d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Elusive (Taboo) 34140c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Colt Vest Pocket 5a305e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ancient Stone (1) 9bc46e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Occult Lexicon 5d6728.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hypnotic Gaze 8f3c8e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Expose Weakness (1) 2e93fd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Burglary (2) 2aeb8a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Eldritch Inspiration ff3f17.yaml' +- !include 'Bag All Player Cards 15bb07/Card Esoteric Atlas (1) 0ce005.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Chthonian Stone (3) 698fcc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Familiar Spirit 971d52.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stealth (3) 26a3bf.yaml' +- !include 'Bag All Player Cards 15bb07/Card Arcane Studies 9e4505.yaml' +- !include 'Bag All Player Cards 15bb07/Card Randall Cho 1bfb78.yaml' +- !include 'Bag All Player Cards 15bb07/Card Flesh Ward 52c686.yaml' +- !include 'Bag All Player Cards 15bb07/Card Robes of Endless Night d9292f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Burning the Midnight Oil 0d29be.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Red-Gloved Man (5) ad18a6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Strange Solution (4) 4874bc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Segment of Onyx (1) ff9f23.yaml' +- !include 'Bag All Player Cards 15bb07/Card The King in Yellow 016b72.yaml' +- !include 'Bag All Player Cards 15bb07/Card Wendy''s Amulet a56ffe.yaml' +- !include 'Bag All Player Cards 15bb07/Card Higher Education 8595fb.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Hospital Debts bd323d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Emergency Cache (3) 408cb5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dream Diary (3) 5f9a10.yaml' +- !include 'Bag All Player Cards 15bb07/Card No Stone Unturned 44cf4a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pet Oozeling 26398a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fearless (2) b2e27e.yaml' +- !include "Bag All Player Cards 15bb07/Card D\xE9j\xE0 Vu (5) 719a45.yaml" +- !include 'Bag All Player Cards 15bb07/Card Scrapper (3) dffe4a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Barricade (3) 2e3115.yaml' +- !include 'Bag All Player Cards 15bb07/Card Handcuffs 5f33be.yaml' +- !include 'Bag All Player Cards 15bb07/Card Neither Rain nor Snow 6da7c4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lost Soul 4f903e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ace of Swords (1) c4d436.yaml' +- !include 'Bag All Player Cards 15bb07/Card Timeworn Brand (5) d3e55b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blessed Blade cf4571.yaml' +- !include 'Bag All Player Cards 15bb07/Card Accursed Fate 85e7d9.yaml' +- !include 'Bag All Player Cards 15bb07/Card False Awakening 3bf831.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scrapper (3) (Taboo) fcffa3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sergeant Monroe 5630c2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Boxing Gloves db4a43.yaml' +- !include 'Bag All Player Cards 15bb07/Card Forbidden Tome (3) f375bf.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bait and Switch (3) 864fb6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Analytical Mind 7b6ab5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Leadership 83d8d7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Spectral Razor 8e8a14.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shotgun (4) c92ea3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blinding Light (2) 8254d4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rise to the Occasion (3) bb501b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hot Streak (4) 4eb231.yaml' +- !include 'Bag All Player Cards 15bb07/Card Forbidden Tome 0a4d22.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sleight of Hand (Taboo) 5a51d1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Teamwork eab2ed.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lupara (3) a6af13.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sneak Attack b18b33.yaml' +- !include 'Bag All Player Cards 15bb07/Card Will to Survive dc4a2c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Obscure Studies c5d8a9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Penny White 73bccf.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Gold Pocket Watch (4) 62d930.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dream Diary b81dcf.yaml' +- !include 'Bag All Player Cards 15bb07/Card Tides of Fate 823e49.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ornate Bow (3) 2acced.yaml' +- !include 'Bag All Player Cards 15bb07/Card A Test of Will (2) 71a760.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shrivelling (5) 7a33b2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sea Change Harpoon 4e405d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Voice of the Messenger f93ea8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Plucky (1) 86b9c5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Old Book of Lore (3) 8a0060.yaml' +- !include 'Bag All Player Cards 15bb07/Card Poisoned 819f52.yaml' +- !include 'Bag All Player Cards 15bb07/Card Moment of Respite (3) 523b76.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rex''s Curse 033a35.yaml' +- !include 'Bag All Player Cards 15bb07/Card Delilah O''Rourke (3) 97a795.yaml' +- !include 'Bag All Player Cards 15bb07/Card Earl Sawyer f14dce.yaml' +- !include 'Bag All Player Cards 15bb07/Card Roland''s .38 Special 49a91e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dr. William T. Maleson 234ff6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shocking Discovery f4dd3d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Howl of Clyhf''ford 952924.yaml' +- !include 'Bag All Player Cards 15bb07/Card Close Call (2) 6aae86.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scavenging 1b76c9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Book of Shadows (3) 296dc8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dr. Elli Horowitz 27e7b3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) a2136a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pnakotic Manuscripts (5) 344d98.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mysterious Raven 59e40d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Knife 0ab3f1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Randolph Carter d253a6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Foul Odor bc4a74.yaml' +- !include 'Bag All Player Cards 15bb07/Card Eavesdrop 256da2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bought in Blood 275dc3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Arcane Enlightenment e69708.yaml' +- !include 'Bag All Player Cards 15bb07/Card Interrogate c70ad8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Solemn Vow ef7c11.yaml' +- !include 'Bag All Player Cards 15bb07/Card Surprising Find (1) ff59dd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) 6bae15.yaml' +- !include 'Bag All Player Cards 15bb07/Card Charles Ross, Esq. 4a2a36.yaml' +- !include 'Bag All Player Cards 15bb07/Card Green Man Medallion c729ab.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Necronomicon (5) (Taboo) 9fa2a5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Nautical Prowess 9d6e9a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Quick Learner (4) 3bbc0b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cheap Shot (2) 0b963c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Elder Sign Amulet (3) 324e49.yaml' +- !include 'Bag All Player Cards 15bb07/Card Library Docent (1) fab3a9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Last Chance 1fe462.yaml' +- !include 'Bag All Player Cards 15bb07/Card Get over here! 5b0f86.yaml' +- !include 'Bag All Player Cards 15bb07/Card Faustian Bargain 17d34b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Crystal Pendulum 6c3156.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lucky! (3) 04d33d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Expedition Journal 9dc3d4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Finn''s Trusty .38 848d9c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blood Eclipse (3) 53d765.yaml' +- !include 'Bag All Player Cards 15bb07/Card Higher Education (3) d48b25.yaml' +- !include 'Bag All Player Cards 15bb07/Card Charon''s Obol (1) 1dbc95.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mauser C96 f32343.yaml' +- !include 'Bag All Player Cards 15bb07/Card Enraptured a5c780.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lantern e66002.yaml' +- !include 'Bag All Player Cards 15bb07/Card Drawing the Sign 3b3c0a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Guiding Spirit (1) f91e14.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cunning e2767a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hypochondria 88ee43.yaml' +- !include 'Bag All Player Cards 15bb07/Card Unearth the Ancients f763e8.yaml' +- !include 'Bag All Player Cards 15bb07/Card First Aid 5cd622.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sell Your Soul 180b5b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Spectral Web 863f1a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Naomi O''Bannion 7f7ecc.yaml' +- !include 'Bag All Player Cards 15bb07/Card High Roller (2) ce1b89.yaml' +- !include 'Bag All Player Cards 15bb07/Card Recharge (2) e27b3c.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom On the Lam 9c4900.yaml' +- !include 'Bag All Player Cards 15bb07/Card Angered Spirits d8705c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Grisly Totem (3) 5fae20.yaml' +- !include 'Bag All Player Cards 15bb07/Card Backstab (3) 7baf75.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Third Time''s a Charm (2) 27ff2d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lesson Learned (2) 037b2e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Empty Vessel (4) c0d236.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Man in the Pallid Mask 6720ef.yaml' +- !include 'Bag All Player Cards 15bb07/Card Banish (1) a00fca.yaml' +- !include 'Bag All Player Cards 15bb07/Card Summoned Hound (1) ab4fb3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Nightmare Bauble (3) d6f6f1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Improvisation 9ef062.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lucid Dreaming (2) 122e98.yaml' +- !include 'Bag All Player Cards 15bb07/Card Becky 587589.yaml' +- !include 'Bag All Player Cards 15bb07/Card If it bleeds... acf2b0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Beretta M1918 (4) 91da6b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Alice Luxley ae20e0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Let God sort them out... d3dcf1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Magnifying Glass (1) 378e84.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ethereal Form db90e2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dynamite Blast (3) 14dcc4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Glory 273584.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dr. Henry Armitage 66197b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pickpocketing (2) 2f4db2.yaml' +- !include 'Bag All Player Cards 15bb07/Card August Lindquist 83b588.yaml' +- !include 'Bag All Player Cards 15bb07/Card Out of Body Experience d64b8f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ineffable Truth (5) f00301.yaml' +- !include 'Bag All Player Cards 15bb07/Card True Grit e25dc1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Oops! 59d89b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cat Burglar (1) 2fe723.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pendant of the Queen 9b0dcf.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cryptic Writings (2) 870bdc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cryptic Grimoire fbfa24.yaml' +- !include 'Bag All Player Cards 15bb07/Card Logical Reasoning (4) 1258c6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lucky Dice (2) 9dd911.yaml' +- !include 'Bag All Player Cards 15bb07/Card Colt Vest Pocket (2) 8dda2d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Essence of the Dream 6ad46b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Keep Faith 8b46b2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fingerprint Kit b9bb2a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Disc of Itzamna d6c44a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Otherworldly Compass (2) 19ab7c.yaml' +- !include 'Bag All Player Cards 15bb07/Card To Fight the Black Wind 00b6c3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Monster Slayer 63b3e5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ineffable Truth (3) 943332.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shards of the Void (3) b94d12.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fire Axe 9da37c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Eucatastrophe (3) eaaee9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Flamethrower (5) cf4f15.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dog Monocle 041012.yaml' +- !include 'Bag All Player Cards 15bb07/Card Belly of the Beast dffa9d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Leadership (2) 80fafa.yaml' +- !include 'Bag All Player Cards 15bb07/Card Final Rhapsody 2c901b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dream Diary (3) e5f9cb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sword Cane 9c32e2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Beloved b4666d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Archaic Glyphs (3) a14a11.yaml' +- !include 'Bag All Player Cards 15bb07/Card Brute Force (1) fb9b7e.yaml' +- !include 'Bag All Player Cards 15bb07/Card On the Hunt a13ca4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Recall the Future (2) a06aa7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Gravedigger''s Shovel (2) 96a440.yaml' +- !include 'Bag All Player Cards 15bb07/Card Otherworld Codex (2) df0e22.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rite of Seeking (4) 194adb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Smuggled Goods 1f3880.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lucky Cigarette Case c607c5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Treasure Hunter (1) 18927e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cherished Keepsake (1) 5a2b49.yaml' +- !include 'Bag All Player Cards 15bb07/Card Eat lead! (2) fc2629.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hard Knocks 68744b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Momentum (1) d753d7.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Council''s Coffer (2) 0e39c2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dark Future 3aa40e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hyperawareness e5dd39.yaml' +- !include 'Bag All Player Cards 15bb07/Card Peter Sylvestre ffdeb5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Taunt d5cac6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blood Pact (3) 64e131.yaml' +- !include 'Bag All Player Cards 15bb07/Card .25 Automatic a5087b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lodge Debts acce72.yaml' +- !include 'Bag All Player Cards 15bb07/Card Intrepid 99d061.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dark Ritual b2b554.yaml' +- !include 'Bag All Player Cards 15bb07/Card Crisis of Identity 367aac.yaml' +- !include 'Bag All Player Cards 15bb07/Card Yaotl (1) a7358f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dayana Esperence (3) 4f2489.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blackjack (2) 37a2b5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Elusive 833305.yaml' +- !include 'Bag All Player Cards 15bb07/Card Reliable (1) 102fad.yaml' +- !include 'Bag All Player Cards 15bb07/Card Contraband b4ad29.yaml' +- !include 'Bag All Player Cards 15bb07/Card Small Favor bf5a5f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Take the Wheel ed4256.yaml' +- !include 'Bag All Player Cards 15bb07/Card Delve Too Deep (Taboo) d4a68a.yaml' +- !include 'Bag All Player Cards 15bb07/Card No Sense of Space or Time 1e6cae.yaml' +- !include 'Bag All Player Cards 15bb07/Card In the Know (1) 7b42b6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Switchblade (2) (Taboo) 842d41.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lantern (2) bda4fd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Opportunist (2) 63f145.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mists of R''lyeh (4) 68fce2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Arcane Studies (4) ca23d4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Double, Double (4) 0e0530.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blackjack 097dcc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Old Shoe 87f6b9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hot Streak (2) f2508d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Deny Existence (5) d24531.yaml' +- !include 'Bag All Player Cards 15bb07/Card Jim''s Trumpet 03c6a7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Nihilism fc4168.yaml' +- !include 'Bag All Player Cards 15bb07/Card Patrice''s Violin ea0007.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pilfer (3) e503ce.yaml' +- !include 'Bag All Player Cards 15bb07/Card Daredevil (2) b3cad4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Madame Labranche 1ee492.yaml' +- !include 'Bag All Player Cards 15bb07/Card Knuckleduster 5690d1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Money Talks 276477.yaml' +- !include 'Bag All Player Cards 15bb07/Card Guardian Angel 3c0249.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dream-Enhancing Serum 98c5af.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mr. Rook (Taboo) a8afba.yaml' +- !include 'Bag All Player Cards 15bb07/Card Contraband (2) 620b6e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ace in the Hole (3) 074858.yaml' +- !include 'Bag All Player Cards 15bb07/Card I''ll see you in hell! 84ba9d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Alter Fate (1) 9e4e11.yaml' +- !include 'Bag All Player Cards 15bb07/Card Double or Nothing efb09b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Emergency Cache (2) 8948c4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Arrogance b2e5b0.yaml' +- !include "Bag All Player Cards 15bb07/Card Coup de Gr\xE2ce 2240f9.yaml" +- !include 'Bag All Player Cards 15bb07/Card Dark Insight f08934.yaml' +- !include 'Bag All Player Cards 15bb07/Card Flamethrower (5) (Taboo) 8f170b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (1) 6e4d54.yaml' +- !include 'Bag All Player Cards 15bb07/Card Key of Ys (5) (Taboo) 244d61.yaml' +- !include 'Bag All Player Cards 15bb07/Card Double or Nothing (Taboo) f98f6f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Parallel Fates 47bdba.yaml' +- !include 'Bag All Player Cards 15bb07/Card .41 Derringer (2) f57af7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shadow Agents 9be144.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mr. Rook 1339b0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Second Wind baef55.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ichtaca 29fc24.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dumb Luck (2) 0c433b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Chuck Fergus (5) 0e72b6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Defiance 59b24f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lita Chantler 3c1944.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fortuitous Discovery dacbf0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Easy Mark (1) cdbb37.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bait and Switch 2c2d9a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Storm of Spirits 9c922f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ever Vigilant (1) bb640d.yaml' +- !include 'Bag All Player Cards 15bb07/Card All In (5) (Taboo) ff1dfe.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lucky! ce0dd5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lonnie Ritter ad0ef0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Eldritch Inspiration (1) e84eff.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pathfinder (1) 7f99cc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Elina Harper 7e2896.yaml' +- !include 'Bag All Player Cards 15bb07/Card Physical Training 1165db.yaml' +- !include 'Bag All Player Cards 15bb07/Card In the Shadows 2561b9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lone Wolf dc3b07.yaml' +- !include 'Bag All Player Cards 15bb07/Card Grete Wagner (3) b39b78.yaml' +- !include 'Bag All Player Cards 15bb07/Card Versatile (2) eca1c8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Grisly Totem a20887.yaml' +- !include 'Bag All Player Cards 15bb07/Card Grisly Totem (3) 1433eb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Accursed Follower ef91a9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Clarity of Mind (3) a53344.yaml' +- !include 'Bag All Player Cards 15bb07/Card Enchanted Blade (3) d0de54.yaml' +- !include 'Bag All Player Cards 15bb07/Card .45 Thompson (3) d4dbc7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dario El-Amin 5ec1a2.yaml' +- !include 'Bag All Player Cards 15bb07/Card A Test of Will (1) 4cfcc7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Tennessee Sour Mash be33f5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Empower Self (2) 3d22c4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Brother Xavier (1) 3c9617.yaml' +- !include 'Bag All Player Cards 15bb07/Card Logical Reasoning 812175.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Bell Tolls 6cbc01.yaml' +- !include 'Bag All Player Cards 15bb07/Card Self-Sacrifice 5e808d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shrewd Analysis 658d38.yaml' +- !include 'Bag All Player Cards 15bb07/Card Leo De Luca eaa415.yaml' +- !include 'Bag All Player Cards 15bb07/Card I''ve got a plan! acd0da.yaml' +- !include 'Bag All Player Cards 15bb07/Card Grit Your Teeth a92a90.yaml' +- !include 'Bag All Player Cards 15bb07/Card Astral Travel 31d087.yaml' +- !include 'Bag All Player Cards 15bb07/Card Liquid Courage c33a10.yaml' +- !include 'Bag All Player Cards 15bb07/Card Tempt Fate 33f906.yaml' +- !include 'Bag All Player Cards 15bb07/Card More Bark Than Bite 29bafb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ancient Ankh 0ce113.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fence (1) 2423e7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Chew Toy of Nightmares bbf1af.yaml' +- !include 'Bag All Player Cards 15bb07/Card Time Warp (2) 4224db.yaml' +- !include 'Bag All Player Cards 15bb07/Card Opportunist a88392.yaml' +- !include 'Bag All Player Cards 15bb07/Card Safeguard (2) 7dc42a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Copycat (3) de40c8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Aquinnah (1) 9393ec.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rite of Sanctification 88865b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Decoy 2ee50e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Extensive Research (1) 3dc25c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shortcut (2) 9bd7cf.yaml' +- !include 'Bag All Player Cards 15bb07/Card Summoned Nightgaunt cf96b9.yaml' +- !include 'Bag All Player Cards 15bb07/Card A Glimmer of Hope f21109.yaml' +- !include 'Bag All Player Cards 15bb07/Card Spiked Collar 6012db.yaml' +- !include 'Bag All Player Cards 15bb07/Card Daring Maneuver cc6b14.yaml' +- !include 'Bag All Player Cards 15bb07/Card Decorated Skull (3) 946a58.yaml' +- !include 'Bag All Player Cards 15bb07/Card Nothing Left to Lose (3) f0389b.yaml' +- !include "Bag All Player Cards 15bb07/Card The Moon \u2022 XVIII (1) e80bd8.yaml" +- !include 'Bag All Player Cards 15bb07/Card Strange Solution (4) d96e4b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Narcolepsy 57e648.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dogcatchers 99800f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Professor Warren Rice 42806b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Monster Slayer (5) e21854.yaml' +- !include 'Bag All Player Cards 15bb07/Card Streetwise a973aa.yaml' +- !include 'Bag All Player Cards 15bb07/Card Zeal 695bb7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Family Inheritance 394603.yaml' +- !include 'Bag All Player Cards 15bb07/Card .32 Colt (2) c026c9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Old Hunting Rifle (3) 44a37f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Uncage the Soul 45d2d2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 5839e4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fieldwork d6771f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scientific Theory (1) 3a0df6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Able Bodied 051742.yaml' +- !include 'Bag All Player Cards 15bb07/Card Alejandro Vela c49b4b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) cbe256.yaml' +- !include 'Bag All Player Cards 15bb07/Card Farsight (4) b4121c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Friendly Human 448d3a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Twilight Blade 223ba3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dread Curse c54d7e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Get over here! (2) 415ca2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Gravedigger''s Shovel 3fe6de.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mauser C96 (2) 725690.yaml' +- !include 'Bag All Player Cards 15bb07/Card Tony''s .38 Long Colt 1186a1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pickpocketing da7c01.yaml' +- !include 'Bag All Player Cards 15bb07/Card Survival Instinct 078efb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Vengeful Hound ce3a1a.yaml' +- !include 'Bag All Player Cards 15bb07/Card You handle this one! dcdcea.yaml' +- !include 'Bag All Player Cards 15bb07/Card Seeking Answers f69e10.yaml' +- !include 'Bag All Player Cards 15bb07/Card Think on Your Feet 6fec31.yaml' +- !include 'Bag All Player Cards 15bb07/Card .45 Thompson 2c6509.yaml' +- !include 'Bag All Player Cards 15bb07/Card Liquid Courage (1) 5065a6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Quantum Flux edd34a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Safeguard 8d6ae6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mk 1 Grenades (4) 0ab574.yaml' +- !include 'Bag All Player Cards 15bb07/Card Police Badge (2) da46e0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Guidance bbfe9b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Plan of Action 96fd5d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Overpower (2) 017e1f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Arbiter of Fates 4fbdb2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lure (2) 1a90a4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Venturer 0e2987.yaml' +- !include 'Bag All Player Cards 15bb07/Card Preposterous Sketches (2) 5e32a5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Survival Knife (2) c1d796.yaml' +- !include 'Bag All Player Cards 15bb07/Card Occult Scraps 6aea76.yaml' +- !include 'Bag All Player Cards 15bb07/Card Kukri 756a35.yaml' +- !include 'Bag All Player Cards 15bb07/Card Well Prepared (2) eea4ef.yaml' +- !include 'Bag All Player Cards 15bb07/Card Storm of Spirits (3) 1e9213.yaml' +- !include 'Bag All Player Cards 15bb07/Card Showmanship ad63bc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hyperawareness (2) 23c3e5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Azure Flame (3) c5fb42.yaml' +- !include 'Bag All Player Cards 15bb07/Card Feed the Mind a614de.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sneak By d099f4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Laboratory Assistant c18ebe.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rabbit''s Foot f34090.yaml' +- !include 'Bag All Player Cards 15bb07/Card Indebted b2ef43.yaml' +- !include 'Bag All Player Cards 15bb07/Card De Vermis Mysteriis (2) b40b98.yaml' +- !include 'Bag All Player Cards 15bb07/Card Burglary bc3451.yaml' +- !include 'Bag All Player Cards 15bb07/Card Across Space and Time fb943f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Kerosene (1) 25ad44.yaml' +- !include 'Bag All Player Cards 15bb07/Card Duke 876557.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sharp Vision (1) 4d9a97.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lt. Wilson Stewart 4120f3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Another Day, Another Dollar (3) 006d44.yaml' +- !include 'Bag All Player Cards 15bb07/Card Act of Desperation 0bea17.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Skeleton Key (2) f8dc01.yaml' +- !include 'Bag All Player Cards 15bb07/Card Crisis of Faith 8b68f4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Telescopic Sight (3) db2c81.yaml' +- !include 'Bag All Player Cards 15bb07/Card One-Two Punch (5) 8ffa44.yaml' +- !include 'Bag All Player Cards 15bb07/Card Swift Reflexes c2d211.yaml' +- !include 'Bag All Player Cards 15bb07/Card Devil''s Luck (1) 812685.yaml' +- !include 'Bag All Player Cards 15bb07/Card Open Gate a33acd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Zoey''s Cross 66d810.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dream Parasite ae16e8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Anatomical Diagrams a8e495.yaml' +- !include 'Bag All Player Cards 15bb07/Card Five of Pentacles (1) 46187b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Springfield M1903 (4) (Taboo) a7da13.yaml' +- !include 'Bag All Player Cards 15bb07/Card Flare (1) 017821.yaml' +- !include 'Bag All Player Cards 15bb07/Card Quick Thinking (Taboo) 308967.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ward of Protection (2) 4d74f6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Flashlight bb1cce.yaml' +- !include 'Bag All Player Cards 15bb07/Card Paranoia c17498.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hatchet Man 857238.yaml' +- !include 'Bag All Player Cards 15bb07/Card Called by the Mists e628de.yaml' +- !include 'Bag All Player Cards 15bb07/Card Deny Existence 8aa0c3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Foolishness fa777f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Eidetic Memory (3) 814ce2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scrounge for Supplies 7651f3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Streetwise (3) d7dbac.yaml' +- !include 'Bag All Player Cards 15bb07/Card Wracked by Nightmares 97781f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Forewarned (1) c17f2c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stray Cat f474b1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Grotesque Statue (2) 6b2e97.yaml' +- !include 'Bag All Player Cards 15bb07/Card Arcane Studies (2) 644af9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Obsessive a2e7d7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bloodlust aafc17.yaml' +- !include 'Bag All Player Cards 15bb07/Card Serpents of Yig 14c396.yaml' +- !include 'Bag All Player Cards 15bb07/Card Crystallizer of Dreams e3bd71.yaml' +- !include 'Bag All Player Cards 15bb07/Card The 13th Vision c1ce8e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mystifying Song 3b8cb7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Run For Your Life 0f32e8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Watcher from Another Dimension 6945f7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stroke of Luck (2) 06228f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hard Knocks (2) 15643b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Agency Backup (5) d6eda3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Boxing Gloves (3) 54293e.yaml' +- !include 'Bag All Player Cards 15bb07/Card First Aid (3) bc80ab.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lockpicks cc11e4.yaml' +- !include 'Bag All Player Cards 15bb07/Card .35 Winchester ebdd78.yaml' +- !include 'Bag All Player Cards 15bb07/Card Look what I found! (2) fd393b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Promise of Power d8b64b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Anything You Can Do, Better 2c563c.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Thing That Follows da227d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Vault of Knowledge 2fdcc9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 66d5a3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Premonition e470cd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dig Deep (2) 0414b4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Followed 0cc3e7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Protective Incantation (1) 599209.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blood-Rite eafd12.yaml' +- !include 'Bag All Player Cards 15bb07/Card Old Keyring 5888da.yaml' +- !include 'Bag All Player Cards 15bb07/Card Taunt (3) 85fe46.yaml' +- !include 'Bag All Player Cards 15bb07/Card Joey The Rat Vigil b51688.yaml' +- !include 'Bag All Player Cards 15bb07/Card Monstrous Transformation 96ae32.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scroll of Prophecies 0d926f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Occult Evidence 3586e6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Forbidden Tome (3) 2f4507.yaml' +- !include 'Bag All Player Cards 15bb07/Card No Stone Unturned (5) 1f3f16.yaml' +- !include 'Bag All Player Cards 15bb07/Card Encyclopedia dbb0e0.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Home Front b80459.yaml' +- !include 'Bag All Player Cards 15bb07/Card Preposterous Sketches 60b353.yaml' +- !include 'Bag All Player Cards 15bb07/Card Barricade edb554.yaml' +- !include 'Bag All Player Cards 15bb07/Card .45 Automatic (2) fe0cc0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Oops! (2) 70772b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Enchanted Blade (3) 84b918.yaml' +- !include 'Bag All Player Cards 15bb07/Card Heroic Rescue bb0f6a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Recharge (4) 591789.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mists of R''lyeh (2) 3d57b4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bury Them Deep e6efe6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Expeditious Retreat (1) ea8324.yaml' +- !include 'Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 8f871b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Silas''s Net 4f11a2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Trench Knife 0d4eb9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Relic of Ages e27a30.yaml' +- !include 'Bag All Player Cards 15bb07/Card Siren Call b9fbff.yaml' +- !include 'Bag All Player Cards 15bb07/Card Arcane Initiate (3) 65b30d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Relic Hunter (3) 3c959c.yaml' +- !include 'Bag All Player Cards 15bb07/Card .41 Derringer fe2db3.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Black Cat (5) 16e57b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cover Up ca25bc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Overzealous 88a9b3.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Hungering Blade (1) bbd11b.yaml' +- !include 'Bag All Player Cards 15bb07/Card You owe me one! d27d12.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bulletproof Vest (3) c4cf62.yaml' +- !include 'Bag All Player Cards 15bb07/Card Alter Fate (3) 83c86b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Alchemical Transmutation (2) 283e54.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fight or Flight 00af4f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mob Enforcer b239d7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Moxie (1) 5fe780.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bounty Contracts 4d9b32.yaml' +- !include 'Bag All Player Cards 15bb07/Card Khopesh of the Abyss dc674e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Smite the Wicked e68658.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Black Book ae3775.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hand of Fate 1ad931.yaml' +- !include 'Bag All Player Cards 15bb07/Card Guts (2) 219c78.yaml' +- !include 'Bag All Player Cards 15bb07/Card Switchblade (2) 2fba3b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Searching for Izzie cd94e3.yaml' +- !include 'Bag All Player Cards 15bb07/Card .45 Thompson (3) b492cb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Detective''s Colt 1911s f4bac6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Haste (2) 1bd139.yaml' +- !include 'Bag All Player Cards 15bb07/Card Waylay da207b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) b5e5f1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sixth Sense (4) 060943.yaml' +- !include 'Bag All Player Cards 15bb07/Card Suggestion (4) e7f37b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stunning Blow 58c435.yaml' +- !include 'Bag All Player Cards 15bb07/Card Feline Discombobulator 7031aa.yaml' +- !include 'Bag All Player Cards 15bb07/Card Three Aces (1) 30062e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Amnesia 2210c1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Gregory Gry 90bf93.yaml' +- !include 'Bag All Player Cards 15bb07/Card Whitton Greene (2) 854c79.yaml' +- !include 'Bag All Player Cards 15bb07/Card Prophesy 493b03.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lady Esprit 37a76b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Track Shoes 6fa7fa.yaml' +- !include 'Bag All Player Cards 15bb07/Card Voice of Ra 0988b2.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Blasphemous Covenant (2) 10b087.yaml' +- !include 'Bag All Player Cards 15bb07/Card Slip Away (2) 4a45c6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Machete 86ee68.yaml' +- !include 'Bag All Player Cards 15bb07/Card Emergency Aid 9c46da.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pilfer cc9563.yaml' +- !include 'Bag All Player Cards 15bb07/Card Veda Whitsley a0c2da.yaml' +- !include 'Bag All Player Cards 15bb07/Card A Chance Encounter 3f3488.yaml' +- !include 'Bag All Player Cards 15bb07/Card Augur cf9ca8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Newspaper (2) 9bcdee.yaml' +- !include 'Bag All Player Cards 15bb07/Card One-Two Punch 22bb1e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Combat Training (1) bd3ecc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Universal Solvent 2f1166.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Painted World dfd48b.yaml' +- !include 'Bag All Player Cards 15bb07/Card A Test of Will 48e516.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Codex of Ages 0e4a82.yaml' +- !include 'Bag All Player Cards 15bb07/Card Abbess Allegria Di Biase 1e7f1b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cornered (2) c6c260.yaml' +- !include 'Bag All Player Cards 15bb07/Card Relic of Ages 7667ef.yaml' +- !include 'Bag All Player Cards 15bb07/Card Anna Kaslow (4) 03a4de.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Eldritch Sophist f6b1b6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Psychosis d83baf.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Painted World 170538.yaml' +- !include 'Bag All Player Cards 15bb07/Card Say Your Prayers 5c3dd0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Leather Jacket dfbc13.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Painted World 170538.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ancient Stone (4) 3289b0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Aquinnah (3) fb9dbb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Manual Dexterity (2) 982716.yaml' +- !include 'Bag All Player Cards 15bb07/Card Strange Solution (4) fa61ba.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sacrifice (1) f2877e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Celaeno Fragments d287bc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 3d35aa.yaml' +- !include 'Bag All Player Cards 15bb07/Card Garrote Wire (2) b45c82.yaml' +- !include 'Bag All Player Cards 15bb07/Card Tooth of Eztli c1a687.yaml' +- !include 'Bag All Player Cards 15bb07/Card Powder of Ibn Ghazi f96ed0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stars of Hyades 1890d0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Alchemical Transmutation 54832d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Well Connected 66b7d5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rise to the Occasion 358387.yaml' +- !include 'Bag All Player Cards 15bb07/Card Granny Orne 1cccfe.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mano a Mano (1) c55160.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dark Prophecy da7613.yaml' +- !include 'Bag All Player Cards 15bb07/Card Machete (Taboo) 6411d5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Warning Shot ec38db.yaml' +- !include 'Bag All Player Cards 15bb07/Card Delay the Inevitable 683937.yaml' +- !include 'Bag All Player Cards 15bb07/Card Streetwise (3) (Taboo) 88a481.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ritual Candles 0a4db3.yaml' +- !include 'Bag All Player Cards 15bb07/Card False Awakening 0de10c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Art Student 07a8f0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Winging It aa3984.yaml' +- !include 'Bag All Player Cards 15bb07/Card Knowledge is Power (Taboo) eccb8a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Catling Gun deea7a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Molly Maxwell 692ced.yaml' +- !include 'Bag All Player Cards 15bb07/Card Randolph Carter b04c8e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Baron Samedi 16ad5d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fishing Net c7b748.yaml' +- !include 'Bag All Player Cards 15bb07/Card Jessica Hyde (1) b8380d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Four of Cups (1) dd4e2a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Newspaper ee20c9.yaml' +- !include 'Bag All Player Cards 15bb07/Card .35 Winchester (Taboo) 41e560.yaml' +- !include 'Bag All Player Cards 15bb07/Card M1918 BAR (4) b1ad65.yaml' +- !include 'Bag All Player Cards 15bb07/Card Leather Coat (1) 5b1550.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hypnotic Gaze (2) e2bc49.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Gaze of Ouraxsh (2) 34e9f8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shining Trapezohedron (4) b4b991.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shell Shock bcf406.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lure (1) d88407.yaml' +- !include 'Bag All Player Cards 15bb07/Card Thomas Dawson 1f7e6e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rookie Mistake e567ff.yaml' +- !include "Bag All Player Cards 15bb07/Card I've had worse\u2026 (4) 3b6834.yaml" +- !include 'Bag All Player Cards 15bb07/Card Counterspell (2) 2236f6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Higher Education (3) (Taboo) 833501.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Silver Key 61fd07.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dreams of the Deep 13eaf0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Delve Too Deep 14e212.yaml' +- !include 'Bag All Player Cards 15bb07/Card Puzzle Box 44334c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Deep Knowledge b176fc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mind Wipe (1) 5d6e57.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sawed-Off Shotgun (5) 4f5f0f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Try and Try Again (3) f1b0f9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Seal of the Elder Sign (5) 91e890.yaml' +- !include 'Bag All Player Cards 15bb07/Card Switchblade 213853.yaml' +- !include 'Bag All Player Cards 15bb07/Card Custom Ammunition (3) f03baa.yaml' +- !include 'Bag All Player Cards 15bb07/Card Internal Injury 4fb446.yaml' +- !include 'Bag All Player Cards 15bb07/Card Physical Training (4) ab51ce.yaml' +- !include 'Bag All Player Cards 15bb07/Card Feed the Mind (3) bc4788.yaml' +- !include 'Bag All Player Cards 15bb07/Card Predestined ec7702.yaml' +- !include 'Bag All Player Cards 15bb07/Card Knowledge is Power 6de21b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ace of Rods (1) 52a677.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Necronomicon d45f10.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bandolier (2) e8b7ad.yaml' +- !include 'Bag All Player Cards 15bb07/Card I''m outta here! 62cf25.yaml' +- !include 'Bag All Player Cards 15bb07/Card Narrow Escape f6ff32.yaml' +- !include 'Bag All Player Cards 15bb07/Card Intel Report 5115d9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Slip Away cf1d4e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fire Extinguisher (1) 8a4673.yaml' +- !include 'Bag All Player Cards 15bb07/Card Valentino Rivas 726d1d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Expose Weakness (3) 77f92c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Chronophobia eeb330.yaml' +- !include 'Bag All Player Cards 15bb07/Card Daring Maneuver (2) fc82a5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Gavriella Mizrah 2237f4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sacrificial Beast 46812e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Nimble b8843c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Split the Angle 67e006.yaml' +- !include 'Bag All Player Cards 15bb07/Card Spirit-Speaker a33470.yaml' +- !include 'Bag All Player Cards 15bb07/Card Unbound Beast 86cf9c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Deciphered Reality (5) 8b0193.yaml' +- !include 'Bag All Player Cards 15bb07/Card Taunt (2) 9956d5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Survival Instinct (2) be4abe.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stubborn Detective 4ea68b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cheat Death (5) 3add54.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mind Over Matter (2) 9b1c5b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Whispers from the Deep dd4a25.yaml' +- !include 'Bag All Player Cards 15bb07/Card Infighting (3) c803ba.yaml' +- !include 'Bag All Player Cards 15bb07/Card Clairvoyance b67371.yaml' +- !include 'Bag All Player Cards 15bb07/Card Improvised Weapon 30f90b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Thrice-Damned Curiosity 3eef18.yaml' +- !include 'Bag All Player Cards 15bb07/Card Self-Centered eff3c8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (5) 090fcf.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ancient Stone (4) 9c56d3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Galvanize (1) 9e7f6a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Book of Shadows (1) 35166c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Backpack f59085.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hiding Spot dd130e.yaml' +- !include 'Bag All Player Cards 15bb07/Card First Watch 0bb3da.yaml' +- !include 'Bag All Player Cards 15bb07/Card Jenny''s Twin .45s d87128.yaml' +- !include 'Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 05da68.yaml' +- !include 'Bag All Player Cards 15bb07/Card All In (5) 7d3a27.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scavenging (2) ff4aea.yaml' +- !include 'Bag All Player Cards 15bb07/Card Unspeakable Oath (Curiosity) f6aba5.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Manipulate Destiny (2) bcc255.yaml' +- !include 'Bag All Player Cards 15bb07/Card Unspeakable Oath (Cowardice) ea0fa1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Quick Thinking 99989c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Physical Training (2) d708d9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dark Pact dd3d09.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bear Trap 74840a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Reckless Assault 3ff641.yaml' +- !include 'Bag All Player Cards 15bb07/Card Search for the Truth 4156cf.yaml' +- !include 'Bag All Player Cards 15bb07/Card Relic of Ages 35bc58.yaml' +- !include 'Bag All Player Cards 15bb07/Card Steadfast 4e1d91.yaml' +- !include 'Bag All Player Cards 15bb07/Card Empower Self (2) 4c0f00.yaml' +- !include 'Bag All Player Cards 15bb07/Card Grotesque Statue (4) 07bc04.yaml' +- !include 'Bag All Player Cards 15bb07/Card Borrowed Time (3) 0db666.yaml' +- !include 'Bag All Player Cards 15bb07/Card Persuasion 1b0235.yaml' +- !include 'Bag All Player Cards 15bb07/Card Occult Invocation 010509.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sign Magick 05d263.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ambush (1) a1fd61.yaml' +- !include 'Bag All Player Cards 15bb07/Card Against All Odds (2) c077bf.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sleight of Hand 819aee.yaml' +- !include 'Bag All Player Cards 15bb07/Card Offer You Cannot Refuse e27c93.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hemispheric Map (3) d2663c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dumb Luck f0e425.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.yaml' +- !include 'Bag All Player Cards 15bb07/Card Obfuscation 5ec6d0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Read the Signs 75eca5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lucky Cigarette Case (3) 0feb74.yaml' +- !include 'Bag All Player Cards 15bb07/Card Grimm''s Fairy Tales 1d75d0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Trench Coat ba560e.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Chthonian Stone 6527a4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Yaztaroth 313167.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sophie f8c873.yaml' +- !include 'Bag All Player Cards 15bb07/Card Token of Faith 2ea0d0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Jerome Davids d99735.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sure Gamble (3) 308be1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Beat Cop 7d4749.yaml' +- !include 'Bag All Player Cards 15bb07/Card Tommy Malloy c3a014.yaml' +- !include 'Bag All Player Cards 15bb07/Card Unsolved Case 22d886.yaml' +- !include 'Bag All Player Cards 15bb07/Card Abigail Foreman (4) 97e9ce.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Price of Failure dc5b38.yaml' +- !include 'Bag All Player Cards 15bb07/Card I''m done runnin''! d8a324.yaml' +- !include 'Bag All Player Cards 15bb07/Card Beat Cop (2) 7001be.yaml' +- !include 'Bag All Player Cards 15bb07/Card On Your Own (3) 2ebdf1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sharpshooter (3) 7f27d6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lockpicks (1) edd6c4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dark Horse 1b4434.yaml' +- !include 'Bag All Player Cards 15bb07/Card Adaptable (1) 731d2a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Meat Cleaver a57f19.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fine Print 39452d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Curse of the Rougarou 569b06.yaml' +- !include 'Bag All Player Cards 15bb07/Card Curiosity 9e5cd2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.yaml' +- !include 'Bag All Player Cards 15bb07/Card Drawing Thin (Taboo) 3d08dc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scene of the Crime ab37af.yaml' +- !include 'Bag All Player Cards 15bb07/Card Resourceful 334f03.yaml' +- !include 'Bag All Player Cards 15bb07/Card .18 Derringer 101a41.yaml' +- !include 'Bag All Player Cards 15bb07/Card Spirit Athame (1) 90a106.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stand Together (3) cd7b97.yaml' +- !include 'Bag All Player Cards 15bb07/Card Painkillers 0c859f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Deduction (2) 95272b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Guardian of the Crystallizer aec357.yaml' +- !include 'Bag All Player Cards 15bb07/Card Graveyard Ghouls 80b7c6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ward of Radiance 69116c.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Eye of Truth (5) d6085d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Miss Doyle (1) e1aedf.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dynamite Blast 97986a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Archaic Glyphs cbfc12.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rabbit''s Foot (3) 3f91af.yaml' +- !include 'Bag All Player Cards 15bb07/Card Song of the Dead (2) 2ae3ce.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ace in the Hole (3) (Taboo) e5d5f0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pay Day (1) 9f0b34.yaml' +- !include 'Bag All Player Cards 15bb07/Card Daredevil e4688b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dream Diary (3) ea40f6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ancient Stone (4) 863f91.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rational Thought 1c7a00.yaml' +- !include 'Bag All Player Cards 15bb07/Card Not without a fight! d1d7fa.yaml' +- !include 'Bag All Player Cards 15bb07/Card Esoteric Atlas (2) 2172e2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Encyclopedia (2) f5bcec.yaml' +- !include 'Bag All Player Cards 15bb07/Card Improvisation 9aee7f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Joey The Rat Vigil (3) 48c9ff.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sixth Sense 6eceef.yaml' +- !include 'Bag All Player Cards 15bb07/Card Grounded (1) 98fc57.yaml' +- !include 'Bag All Player Cards 15bb07/Card Torrent of Power 79287f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Spiritual Resolve (5) 26922c.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Necronomicon (5) 96ba38.yaml' +- !include 'Bag All Player Cards 15bb07/Card Marksmanship (1) 6a9021.yaml' +- !include 'Bag All Player Cards 15bb07/Card Evidence! 2db518.yaml' +- !include 'Bag All Player Cards 15bb07/Card Chainsaw (4) d40f4e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Springfield M1903 (4) a7944d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hypnotic Therapy 7f1b48.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom The Necronomicon 5b2e10.yaml' +- !include 'Bag All Player Cards 15bb07/Card Thermos 5b14dc.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hoods 785f68.yaml' +- !include 'Bag All Player Cards 15bb07/Card Healing Words bba97a.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Skeptic (1) d2cd42.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rite of Seeking (2) 4f2668.yaml' +- !include 'Bag All Player Cards 15bb07/Card Extra Ammunition (1) f60263.yaml' +- !include 'Bag All Player Cards 15bb07/Card Try and Try Again (1) 3dc82f.yaml' +- !include 'Bag All Player Cards 15bb07/Card What Have You Done 2c76d9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stealth ddee79.yaml' +- !include 'Bag All Player Cards 15bb07/Card Truth from Fiction (2) 45cd73.yaml' +- !include 'Bag All Player Cards 15bb07/Card Take the Initiative 50fb37.yaml' +- !include 'Bag All Player Cards 15bb07/Card Atychiphobia a3bc7a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Robes of Endless Night (2) ef43db.yaml' +- !include 'Bag All Player Cards 15bb07/Card John & Jessie Burke cfb393.yaml' +- !include 'Bag All Player Cards 15bb07/Card Counterpunch (2) 92436b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Something Worth Fighting For a3f105.yaml' +- !include 'Bag All Player Cards 15bb07/Card Empower Self (2) ffe4dd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Kleptomania 447a08.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bloodstained Dagger d71f11.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blood Eclipse (1) 5efc92.yaml' +- !include 'Bag All Player Cards 15bb07/Card Relentless af3efd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Take Heart cc6e4d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fool me once... (1) b6506d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fortune or Fate (2) e674e8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bandolier 82775a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bind Monster (2) ba1460.yaml' +- !include 'Bag All Player Cards 15bb07/Card Azure Flame (5) 0ee874.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lightning Gun (5) 2d362c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cryptographic Cipher 4f3142.yaml' +- !include 'Bag All Player Cards 15bb07/Card True Survivor (3) 8837ff.yaml' +- !include 'Bag All Player Cards 15bb07/Card Through the Gates fd9c56.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hope 45c582.yaml' +- !include 'Bag All Player Cards 15bb07/Card Keen Eye (3) 2f9de4.yaml' +- !include 'Bag All Player Cards 15bb07/Card .32 Colt b0f851.yaml' +- !include 'Bag All Player Cards 15bb07/Card Eat lead! a2c7ef.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scrying Mirror 6446d1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Wither (4) f57a6f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mind''s Eye (2) ad58aa.yaml' +- !include 'Bag All Player Cards 15bb07/Card Whitton Greene 3c5099.yaml' +- !include 'Bag All Player Cards 15bb07/Card Unexpected Courage (2) 2f2190.yaml' +- !include 'Bag All Player Cards 15bb07/Card Book of Psalms cc1ef3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Think on Your Feet (2) 3e0653.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dynamite Blast (2) e35bc2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Perseverance 0a390e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Trial by Fire 869d4c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Twila Katherine Price (3) 9f76ec.yaml' +- !include 'Bag All Player Cards 15bb07/Card Clairvoyance (5) e21200.yaml' +- !include 'Bag All Player Cards 15bb07/Card Olive McBride 9683d0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Disc of Itzamna (2) b00b76.yaml' +- !include 'Bag All Player Cards 15bb07/Card Clairvoyance (3) f5d382.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Ancient Covenant (2) 436401.yaml' +- !include 'Bag All Player Cards 15bb07/Card Your Worst Nightmare 406ab2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dr. Francis Morgan f03306.yaml' +- !include 'Bag All Player Cards 15bb07/Card Moonlight Ritual 1cd2bd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Impromptu Barrier 9591ac.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mano a Mano (2) 14424c.yaml' +- !include 'Bag All Player Cards 15bb07/Card On Your Own (3) b0c61c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fine Clothes 5cb973.yaml' +- !include 'Bag All Player Cards 15bb07/Card Moonstone 0d006f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Arcane Insight (4) 536b52.yaml' +- !include 'Bag All Player Cards 15bb07/Card Vicious Blow (2) d2e026.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dig Deep fc9e1b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Drawing Thin 6d9881.yaml' +- !include 'Bag All Player Cards 15bb07/Card Relic of Ages 87718c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Clean Them Out 3319be.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cryptic Writings ff2776.yaml' +- !include 'Bag All Player Cards 15bb07/Card .18 Derringer (2) f8a977.yaml' +- !include 'Bag All Player Cards 15bb07/Card Look what I found! 88d3c0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Caught Red-Handed ecd087.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ineffable Truth c6caf6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Desperate Search 45bdf0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Terrible Secret 06322f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Strange Solution 565b6b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Wither d946d9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lola Santiago (3) 8bec05.yaml' +- !include 'Bag All Player Cards 15bb07/Card Backpack (2) 389a34.yaml' +- !include 'Bag All Player Cards 15bb07/Card Leo De Luca (1) 27446e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Out of Doggie Treats 197242.yaml' +- !include 'Bag All Player Cards 15bb07/Card Live and Learn 050ba1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mi-Go Weapon 2fc31c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cheap Shot b8c93a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Segment of Onyx (1) (Taboo) 922d4c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ward of Protection (5) 7bc995.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scrapper c8505c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Will to Survive (3) 0027f2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Tony''s Quarry d6f8d1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Evidence! (1) 3df5fb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Perception c6ac19.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shrivelling (3) b3ce16.yaml' +- !include 'Bag All Player Cards 15bb07/Card Alyssa Graham 53867b.yaml' +- !include 'Bag All Player Cards 15bb07/Card David Renfield 1f8539.yaml' +- !include 'Bag All Player Cards 15bb07/Card Calling in Favors 9b9e8b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scrying (3) e58d2a.yaml' +- !include 'Bag All Player Cards 15bb07/Card St. Hubert''s Key 423d46.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mists of R''lyeh 5558f1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Arcane Research e425d0.yaml' +- !include "Bag All Player Cards 15bb07/Card The Tower \u2022 XVI d5c93d.yaml" +- !include 'Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) 19b705.yaml' +- !include 'Bag All Player Cards 15bb07/Card Gate Box b8c891.yaml' +- !include 'Bag All Player Cards 15bb07/Card Detached from Reality d12359.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stargazing (1) 968a26.yaml' +- !include 'Bag All Player Cards 15bb07/Card Day of Reckoning a9d77d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dream-Gate fa4c1e.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Stars Are Right 600a3c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dr. Milan Christopher (Taboo) 8ae314.yaml' +- !include 'Bag All Player Cards 15bb07/Card Haunted 249d83.yaml' +- !include 'Bag All Player Cards 15bb07/Card Inquiring Mind 5c3aea.yaml' +- !include 'Bag All Player Cards 15bb07/Card Eureka! ffa4f9.yaml' +- !include 'Bag All Player Cards 15bb07/Card Jake Williams 7c958e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Call of the Unknown 86feae.yaml' +- !include 'Bag All Player Cards 15bb07/Card True Understanding 4167c0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Vantage Point 2f9ab1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Connect the Dots 13413d.yaml' +- !include "Bag All Player Cards 15bb07/Card Death \u2022 XIII (1) 2e5b03.yaml" +- !include 'Bag All Player Cards 15bb07/Card Ghastly Revelation b7c503.yaml' +- !include 'Bag All Player Cards 15bb07/Card Studious (3) 4ea716.yaml' +- !include 'Bag All Player Cards 15bb07/Card Practice Makes Perfect 1ac667.yaml' +- !include 'Bag All Player Cards 15bb07/Card Perception (2) 96b5ed.yaml' +- !include 'Bag All Player Cards 15bb07/Card Reckless c45e67.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Tristan Botley (2) 039e47.yaml' +- !include 'Bag All Player Cards 15bb07/Card Righteous Hunt (1) 491c09.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Enchanted Armor (2) dfe1ee.yaml' +- !include 'Bag All Player Cards 15bb07/Card Sacred Covenant (2) 87226d.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Liber Omnium Finium 242a11.yaml' +- !include 'Bag All Player Cards 15bb07/Card Breaking and Entering 31cfbf.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Ruth Westmacott 782e0a.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Signum Crucis (2) c21c1f.yaml' +- !include "Bag All Player Cards 15bb07/CardCustom R\xEDastrad (1) d89190.yaml" +- !include 'Bag All Player Cards 15bb07/Card Armageddon 3feff1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Paradoxical Covenant (2) 541ee9.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Radiant Smite (1) 9103a5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mariner''s Compass 4e2d75.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shroud of Shadows a565d5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Riot Whistle 55fc3d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Teachings of the Order 90fdb0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stirring Up Trouble (1) e99f0d.yaml' +- !include 'Bag All Player Cards 15bb07/Card False Covenant (2) 3442f5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Eye of Chaos 9a5782.yaml' +- !include 'Bag All Player Cards 15bb07/Card Charisma (3) 9e6c55.yaml' +- !include 'Bag All Player Cards 15bb07/Card Daisy''s Tote Bag 321cb7.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Necronomicon 6b2550.yaml' +- !include 'Bag All Player Cards 15bb07/Card Magnifying Glass 8cc0a6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Old Book of Lore 063fd8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Research Librarian 8f91ce.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dr. Milan Christopher 9934d2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Medical Texts ba16cb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mind over Matter 8cf335.yaml' +- !include 'Bag All Player Cards 15bb07/Card Working a Hunch eb6165.yaml' +- !include 'Bag All Player Cards 15bb07/Card Deduction b265c4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scrying 8a927c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blinding Light 30f860.yaml' +- !include 'Bag All Player Cards 15bb07/Card Manual Dexterity 679b13.yaml' +- !include 'Bag All Player Cards 15bb07/Card Silver Twilight Acolyte 16a89d.yaml' +- !include 'Bag All Player Cards 15bb07/Card .45 Automatic 12660b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dodge e0dff3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Vicious Blow 889121.yaml' +- !include 'Bag All Player Cards 15bb07/Card Overpower 5ab9f4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shortcut d4fd4a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Smoking Pipe 603e29.yaml' +- !include 'Bag All Player Cards 15bb07/Card Prepared for the Worst 831b6b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Let me handle this! 36c0cb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Inspiring Presence 80628f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Crack the Case 8dce44.yaml' +- !include 'Bag All Player Cards 15bb07/Card Enchanted Blade c7d9b5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hawk-Eye Folding Camera 5ada0a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hallowed Mirror 312d38.yaml' +- !include 'Bag All Player Cards 15bb07/Card Astounding Revelation 7686cb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Daring 91e53c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Grete Wagner f6dfe5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stand Together 7ec473.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mysteries Remain 274daa.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Dirge of Reason fe68c6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Soothing Melody 53f076.yaml' +- !include 'Bag All Player Cards 15bb07/Card Keen Eye 0dc75e.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Truth Beckons ca1b5c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Priest of Two Faiths (1) 48e4a3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Under Surveillance (1) cc8321.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blood Pact fc709b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Abyssal Tome (2) a2d392.yaml' +- !include 'Bag All Player Cards 15bb07/Card Butterfly Effect (1) 22fc6c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dark Memory 580a4d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cloak of the Outer Realm 4e1e79.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blade of Ark''at db8043.yaml' +- !include 'Bag All Player Cards 15bb07/Card Enchanted Skull 19094d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Pocket Portal 1ab785.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dreaded End 4b2e72.yaml' +- !include 'Bag All Player Cards 15bb07/Card Heirloom of Hyperborea bf151d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dark Memory c025bf.yaml' +- !include 'Bag All Player Cards 15bb07/Card Forbidden Knowledge 80acd2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Holy Rosary fa1d67.yaml' +- !include 'Bag All Player Cards 15bb07/Card Shrivelling 914053.yaml' +- !include 'Bag All Player Cards 15bb07/Card Arcane Initiate 7307c4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Drawn to the Flame a8298f.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ward of Protection 6656ad.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fearless cd0ac1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Leather Coat 593deb.yaml' +- !include 'Bag All Player Cards 15bb07/Card Baseball Bat 48e103.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lucky! (2) 439af2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Emergency Cache 510c0d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Guts 8f7289.yaml' +- !include 'Bag All Player Cards 15bb07/Card Unexpected Courage acb83a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rite of Seeking 29b842.yaml' +- !include 'Bag All Player Cards 15bb07/Card Peter Sylvestre (2) e1e098.yaml' +- !include 'Bag All Player Cards 15bb07/Card Heirloom of Hyperborea 23c694.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Lucky Penny (2) 8d45ac.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Eye of the Djinn (2) d3f951.yaml' +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 15bb07 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: true +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Bag +Nickname: All Player Cards +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 77.79 + posY: 1.05 + posZ: -4.81 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer (2) f8a977.yaml b/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer (2) f8a977.yaml new file mode 100644 index 000000000..fd2b46fbb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer (2) f8a977.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550820 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f8a977 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .18 Derringer (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer 101a41.yaml b/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer 101a41.yaml new file mode 100644 index 000000000..1abca83bb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer 101a41.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550803 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 101a41 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .18 Derringer +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .25 Automatic a5087b.yaml b/unpacked/Bag All Player Cards 15bb07/Card .25 Automatic a5087b.yaml new file mode 100644 index 000000000..85bf53b92 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .25 Automatic a5087b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266319 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a5087b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .25 Automatic +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .32 Colt (2) c026c9.yaml b/unpacked/Bag All Player Cards 15bb07/Card .32 Colt (2) c026c9.yaml new file mode 100644 index 000000000..d035852b3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .32 Colt (2) c026c9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440922 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4409': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c026c9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .32 Colt (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .32 Colt b0f851.yaml b/unpacked/Bag All Player Cards 15bb07/Card .32 Colt b0f851.yaml new file mode 100644 index 000000000..32d3f1a56 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .32 Colt b0f851.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226328 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b0f851 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .32 Colt +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester (Taboo) 41e560.yaml b/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester (Taboo) 41e560.yaml new file mode 100644 index 000000000..db05d3828 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester (Taboo) 41e560.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450624 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 41e560 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .35 Winchester (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester ebdd78.yaml b/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester ebdd78.yaml new file mode 100644 index 000000000..6124fa01e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester ebdd78.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447932 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4479': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ebdd78 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .35 Winchester +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer (2) f57af7.yaml b/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer (2) f57af7.yaml new file mode 100644 index 000000000..e5a18d928 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer (2) f57af7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315248 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f57af7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .41 Derringer (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer fe2db3.yaml b/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer fe2db3.yaml new file mode 100644 index 000000000..cbf883b68 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer fe2db3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368628 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fe2db3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .41 Derringer +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic (2) fe0cc0.yaml b/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic (2) fe0cc0.yaml new file mode 100644 index 000000000..0a4d17d2c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic (2) fe0cc0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226347 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fe0cc0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .45 Automatic (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic 12660b.yaml b/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic 12660b.yaml new file mode 100644 index 000000000..397145d28 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic 12660b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226330 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 12660b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .45 Automatic +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) b492cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) b492cb.yaml new file mode 100644 index 000000000..bf30b73f9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) b492cb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 292813 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2928': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Guardian +DragSelectable: true +GMNotes: '' +GUID: b492cb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .45 Thompson (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) d4dbc7.yaml b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) d4dbc7.yaml new file mode 100644 index 000000000..bb53303e9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) d4dbc7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 292915 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2929': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Rogue +DragSelectable: true +GMNotes: '' +GUID: d4dbc7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .45 Thompson (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson 2c6509.yaml b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson 2c6509.yaml new file mode 100644 index 000000000..0865b8b60 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson 2c6509.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277608 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2776': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2c6509 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: .45 Thompson +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter (2) 0edef1.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter (2) 0edef1.yaml new file mode 100644 index 000000000..f8c2a8aec --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter (2) 0edef1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368844 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0edef1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: A Chance Encounter (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter 3f3488.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter 3f3488.yaml new file mode 100644 index 000000000..1a747a5a9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter 3f3488.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368812 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3f3488 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: A Chance Encounter +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Glimmer of Hope f21109.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Glimmer of Hope f21109.yaml new file mode 100644 index 000000000..d97cbd6c4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card A Glimmer of Hope f21109.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447733 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4477': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f21109 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: A Glimmer of Hope +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (1) 4cfcc7.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (1) 4cfcc7.yaml new file mode 100644 index 000000000..15eabf56b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (1) 4cfcc7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368837 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4cfcc7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: A Test of Will (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (2) 71a760.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (2) 71a760.yaml new file mode 100644 index 000000000..24ef4e7a0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (2) 71a760.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550821 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 71a760 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: A Test of Will (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Test of Will 48e516.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will 48e516.yaml new file mode 100644 index 000000000..f0d6e72d6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will 48e516.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550811 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 48e516 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: A Test of Will +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 79b4af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 79b4af.yaml new file mode 100644 index 000000000..e1487e2b7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 79b4af.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 375129 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3751': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 79b4af +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Abandoned and Alone +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Abbess Allegria Di Biase 1e7f1b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Abbess Allegria Di Biase 1e7f1b.yaml new file mode 100644 index 000000000..c87508b50 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Abbess Allegria Di Biase 1e7f1b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 296500 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2965': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Ally. Believer. +DragSelectable: true +GMNotes: '' +GUID: 1e7f1b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Abbess Allegria Di Biase +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Abigail Foreman (4) 97e9ce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Abigail Foreman (4) 97e9ce.yaml new file mode 100644 index 000000000..25aa2ec4c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Abigail Foreman (4) 97e9ce.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448839 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4488': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Library Intern +DragSelectable: true +GMNotes: '' +GUID: 97e9ce +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Abigail Foreman (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Able Bodied 051742.yaml b/unpacked/Bag All Player Cards 15bb07/Card Able Bodied 051742.yaml new file mode 100644 index 000000000..5b14498c1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Able Bodied 051742.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274606 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '051742' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Able Bodied +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Abyssal Tome (2) a2d392.yaml b/unpacked/Bag All Player Cards 15bb07/Card Abyssal Tome (2) a2d392.yaml new file mode 100644 index 000000000..0ca101bf4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Abyssal Tome (2) a2d392.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232107 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a2d392 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Abyssal Tome (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 79.16 + posY: 3.28 + posZ: -3.79 + rotX: 357.47 + rotY: 269.94 + rotZ: 2.19 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Accursed Fate 85e7d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Accursed Fate 85e7d9.yaml new file mode 100644 index 000000000..43b5dee0c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Accursed Fate 85e7d9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 537608 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5376': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 85e7d9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Accursed Fate +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Accursed Follower ef91a9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Accursed Follower ef91a9.yaml new file mode 100644 index 000000000..f74dba82c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Accursed Follower ef91a9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266332 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: ef91a9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Accursed Follower +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) (Taboo) e5d5f0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) (Taboo) e5d5f0.yaml new file mode 100644 index 000000000..7f2adafdb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) (Taboo) e5d5f0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450617 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e5d5f0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ace in the Hole (3) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) 074858.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) 074858.yaml new file mode 100644 index 000000000..b1d1e56c7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) 074858.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315252 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 074858 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ace in the Hole (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ace of Rods (1) 52a677.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ace of Rods (1) 52a677.yaml new file mode 100644 index 000000000..50c5cc4e0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ace of Rods (1) 52a677.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 318703 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3187': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Fateful Step +DragSelectable: true +GMNotes: '' +GUID: 52a677 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ace of Rods (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ace of Swords (1) c4d436.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ace of Swords (1) c4d436.yaml new file mode 100644 index 000000000..f41a86a58 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ace of Swords (1) c4d436.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431009 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4310': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Let Your Arrow Fly True +DragSelectable: true +GMNotes: '' +GUID: c4d436 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ace of Swords (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Across Space and Time fb943f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Across Space and Time fb943f.yaml new file mode 100644 index 000000000..2c36e268d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Across Space and Time fb943f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232941 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2329': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Madness. +DragSelectable: true +GMNotes: '' +GUID: fb943f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Across Space and Time +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Act of Desperation 0bea17.yaml b/unpacked/Bag All Player Cards 15bb07/Card Act of Desperation 0bea17.yaml new file mode 100644 index 000000000..6770647c9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Act of Desperation 0bea17.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274607 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0bea17 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Act of Desperation +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Adaptable (1) 731d2a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Adaptable (1) 731d2a.yaml new file mode 100644 index 000000000..4857a1c4d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Adaptable (1) 731d2a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315232 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 731d2a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Adaptable (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Against All Odds (2) c077bf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Against All Odds (2) c077bf.yaml new file mode 100644 index 000000000..6909cc33d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Against All Odds (2) c077bf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368850 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c077bf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Against All Odds (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Agency Backup (5) d6eda3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Agency Backup (5) d6eda3.yaml new file mode 100644 index 000000000..f15922488 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Agency Backup (5) d6eda3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378618 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d6eda3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Agency Backup (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation (2) 283e54.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation (2) 283e54.yaml new file mode 100644 index 000000000..439a954ea --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation (2) 283e54.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 444020 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4440': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 283e54 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Alchemical Transmutation (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation 54832d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation 54832d.yaml new file mode 100644 index 000000000..ada60e5ca --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation 54832d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230320 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 54832d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Alchemical Transmutation +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alejandro Vela c49b4b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alejandro Vela c49b4b.yaml new file mode 100644 index 000000000..a8d773c09 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Alejandro Vela c49b4b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235600 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2356': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Renowned Historian +DragSelectable: true +GMNotes: '' +GUID: c49b4b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Alejandro Vela +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alice Luxley ae20e0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alice Luxley ae20e0.yaml new file mode 100644 index 000000000..6c034f6e4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Alice Luxley ae20e0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 278010 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2780': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Fearless Flatfoot +DragSelectable: true +GMNotes: '' +GUID: ae20e0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Alice Luxley +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card All In (5) (Taboo) ff1dfe.yaml b/unpacked/Bag All Player Cards 15bb07/Card All In (5) (Taboo) ff1dfe.yaml new file mode 100644 index 000000000..953a93214 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card All In (5) (Taboo) ff1dfe.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450620 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ff1dfe +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: All In (5) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card All In (5) 7d3a27.yaml b/unpacked/Bag All Player Cards 15bb07/Card All In (5) 7d3a27.yaml new file mode 100644 index 000000000..493185998 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card All In (5) 7d3a27.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 265502 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2655': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7d3a27 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: All In (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (1) 9e4e11.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (1) 9e4e11.yaml new file mode 100644 index 000000000..f8e71a32e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (1) 9e4e11.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545208 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9e4e11 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Alter Fate (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (3) 83c86b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (3) 83c86b.yaml new file mode 100644 index 000000000..69b27161c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (3) 83c86b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368856 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 83c86b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Alter Fate (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alyssa Graham 53867b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alyssa Graham 53867b.yaml new file mode 100644 index 000000000..f1c4b70ef --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Alyssa Graham 53867b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230330 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Speaker to the Dead +DragSelectable: true +GMNotes: '' +GUID: 53867b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Alyssa Graham +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ambush (1) a1fd61.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ambush (1) a1fd61.yaml new file mode 100644 index 000000000..e09e147b1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ambush (1) a1fd61.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226338 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a1fd61 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ambush (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Amnesia 2210c1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Amnesia 2210c1.yaml new file mode 100644 index 000000000..7a05930b6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Amnesia 2210c1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527400 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5274': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 2210c1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Amnesia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Analytical Mind 7b6ab5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Analytical Mind 7b6ab5.yaml new file mode 100644 index 000000000..8aca3d060 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Analytical Mind 7b6ab5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374532 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3745': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7b6ab5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Analytical Mind +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Anatomical Diagrams a8e495.yaml b/unpacked/Bag All Player Cards 15bb07/Card Anatomical Diagrams a8e495.yaml new file mode 100644 index 000000000..10fe4255d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Anatomical Diagrams a8e495.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368409 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a8e495 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Anatomical Diagrams +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancient Ankh 0ce113.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancient Ankh 0ce113.yaml new file mode 100644 index 000000000..86d652aa4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancient Ankh 0ce113.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 454741 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4547': + BackIsHidden: true + BackURL: https://i.imgur.com/r6F1mt2.jpg + FaceURL: https://i.imgur.com/CN9PXUd.jpg + NumHeight: 5 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Item. Relic. +DragSelectable: true +GMNotes: '' +GUID: 0ce113 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ancient Ankh +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (1) 9bc46e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (1) 9bc46e.yaml new file mode 100644 index 000000000..ab0bb483c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (1) 9bc46e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430639 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Unidentified +DragSelectable: true +GMNotes: '' +GUID: 9bc46e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ancient Stone (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 3289b0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 3289b0.yaml new file mode 100644 index 000000000..bba43cd4b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 3289b0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545203 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Transient Thoughts +DragSelectable: true +GMNotes: '' +GUID: 3289b0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ancient Stone (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 863f91.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 863f91.yaml new file mode 100644 index 000000000..f0cbb8665 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 863f91.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 262202 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2622': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Knowledge of the Elders +DragSelectable: true +GMNotes: '' +GUID: 863f91 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ancient Stone (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 9c56d3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 9c56d3.yaml new file mode 100644 index 000000000..82ff0a78b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 9c56d3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 262201 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2622': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Minds in Harmony +DragSelectable: true +GMNotes: '' +GUID: 9c56d3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ancient Stone (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Angered Spirits d8705c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Angered Spirits d8705c.yaml new file mode 100644 index 000000000..c775cfd9a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Angered Spirits d8705c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374717 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3747': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d8705c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Angered Spirits +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Anna Kaslow (4) 03a4de.yaml b/unpacked/Bag All Player Cards 15bb07/Card Anna Kaslow (4) 03a4de.yaml new file mode 100644 index 000000000..8a4b966b0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Anna Kaslow (4) 03a4de.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 373910 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3739': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Mysterious Soothsayer +DragSelectable: true +GMNotes: '' +GUID: 03a4de +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Anna Kaslow (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Another Day, Another Dollar (3) 006d44.yaml b/unpacked/Bag All Player Cards 15bb07/Card Another Day, Another Dollar (3) 006d44.yaml new file mode 100644 index 000000000..0a3bfb700 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Another Day, Another Dollar (3) 006d44.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378017 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3780': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 006d44 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Another Day, Another Dollar (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Anything You Can Do, Better 2c563c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Anything You Can Do, Better 2c563c.yaml new file mode 100644 index 000000000..2a940c648 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Anything You Can Do, Better 2c563c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538600 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2c563c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Anything You Can Do, Better +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (1) 9393ec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (1) 9393ec.yaml new file mode 100644 index 000000000..c87f3f21b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (1) 9393ec.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368841 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Forgotten Daughter +DragSelectable: true +GMNotes: '' +GUID: 9393ec +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Aquinnah (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (3) fb9dbb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (3) fb9dbb.yaml new file mode 100644 index 000000000..e814b44bc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (3) fb9dbb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368861 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Forgotten Daughter +DragSelectable: true +GMNotes: '' +GUID: fb9dbb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Aquinnah (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arbiter of Fates 4fbdb2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arbiter of Fates 4fbdb2.yaml new file mode 100644 index 000000000..07bbdc823 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Arbiter of Fates 4fbdb2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538700 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4fbdb2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Arbiter of Fates +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Enlightenment e69708.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Enlightenment e69708.yaml new file mode 100644 index 000000000..53e697a60 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Enlightenment e69708.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538803 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e69708 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Arcane Enlightenment +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate (3) 65b30d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate (3) 65b30d.yaml new file mode 100644 index 000000000..816a3ba43 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate (3) 65b30d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230349 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 65b30d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Arcane Initiate (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate 7307c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate 7307c4.yaml new file mode 100644 index 000000000..1db9560bf --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate 7307c4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230318 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7307c4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Arcane Initiate +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Insight (4) 536b52.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Insight (4) 536b52.yaml new file mode 100644 index 000000000..09ec15a5e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Insight (4) 536b52.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430659 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 536b52 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Arcane Insight (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Research e425d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Research e425d0.yaml new file mode 100644 index 000000000..cfa7fd6fa --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Research e425d0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230315 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e425d0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Arcane Research +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (2) 644af9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (2) 644af9.yaml new file mode 100644 index 000000000..980e83adc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (2) 644af9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230340 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 644af9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Arcane Studies (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (4) ca23d4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (4) ca23d4.yaml new file mode 100644 index 000000000..3938612c9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (4) ca23d4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538726 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ca23d4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Arcane Studies (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies 9e4505.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies 9e4505.yaml new file mode 100644 index 000000000..2d78d9da8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies 9e4505.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230324 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9e4505 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Arcane Studies +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 3d35aa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 3d35aa.yaml new file mode 100644 index 000000000..e147fb0a1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 3d35aa.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430653 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Prophecy Foretold +DragSelectable: true +GMNotes: '' +GUID: 3d35aa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Archaic Glyphs (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 66d5a3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 66d5a3.yaml new file mode 100644 index 000000000..3da68235d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 66d5a3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 441024 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4410': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Markings of Isis +DragSelectable: true +GMNotes: '' +GUID: 66d5a3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Archaic Glyphs (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) a14a11.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) a14a11.yaml new file mode 100644 index 000000000..93529b895 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) a14a11.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430652 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Guiding Stones +DragSelectable: true +GMNotes: '' +GUID: a14a11 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Archaic Glyphs (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs cbfc12.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs cbfc12.yaml new file mode 100644 index 000000000..e8012616c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs cbfc12.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368420 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Untranslated +DragSelectable: true +GMNotes: '' +GUID: cbfc12 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Archaic Glyphs +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Armageddon 3feff1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Armageddon 3feff1.yaml new file mode 100644 index 000000000..6cc5f9855 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Armageddon 3feff1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553109 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3feff1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Armageddon +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.44 + rotX: 0.23 + rotY: 270.0 + rotZ: 358.97 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Armor of Ardennes (5) f7a9ab.yaml b/unpacked/Bag All Player Cards 15bb07/Card Armor of Ardennes (5) f7a9ab.yaml new file mode 100644 index 000000000..97bb467a3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Armor of Ardennes (5) f7a9ab.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226360 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f7a9ab +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Armor of Ardennes (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arrogance b2e5b0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arrogance b2e5b0.yaml new file mode 100644 index 000000000..8d76519ff --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Arrogance b2e5b0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538601 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: b2e5b0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Arrogance +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Art Student 07a8f0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Art Student 07a8f0.yaml new file mode 100644 index 000000000..f3c8c0bc7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Art Student 07a8f0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368428 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 07a8f0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Art Student +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Astounding Revelation 7686cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Astounding Revelation 7686cb.yaml new file mode 100644 index 000000000..7d50094e1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Astounding Revelation 7686cb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 441025 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4410': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7686cb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Astounding Revelation +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Astral Travel 31d087.yaml b/unpacked/Bag All Player Cards 15bb07/Card Astral Travel 31d087.yaml new file mode 100644 index 000000000..bd3746bac --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Astral Travel 31d087.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230312 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 31d087 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Astral Travel +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Atychiphobia a3bc7a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Atychiphobia a3bc7a.yaml new file mode 100644 index 000000000..fe65b9179 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Atychiphobia a3bc7a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550802 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: a3bc7a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Atychiphobia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Augur cf9ca8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Augur cf9ca8.yaml new file mode 100644 index 000000000..cd559c8d5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Augur cf9ca8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440626 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4406': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cf9ca8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Augur +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card August Lindquist 83b588.yaml b/unpacked/Bag All Player Cards 15bb07/Card August Lindquist 83b588.yaml new file mode 100644 index 000000000..c2ae8d941 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card August Lindquist 83b588.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 312509 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3125': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Elegant and Elusive +DragSelectable: true +GMNotes: '' +GUID: 83b588 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: August Lindquist +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (3) c5fb42.yaml b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (3) c5fb42.yaml new file mode 100644 index 000000000..4bfd9c047 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (3) c5fb42.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538723 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c5fb42 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Azure Flame (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (5) 0ee874.yaml b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (5) 0ee874.yaml new file mode 100644 index 000000000..d4ce8c542 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (5) 0ee874.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538728 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0ee874 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Azure Flame (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Azure Flame 17319c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame 17319c.yaml new file mode 100644 index 000000000..4abb200da --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame 17319c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538705 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 17319c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Azure Flame +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Backpack (2) 389a34.yaml b/unpacked/Bag All Player Cards 15bb07/Card Backpack (2) 389a34.yaml new file mode 100644 index 000000000..bf2648338 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Backpack (2) 389a34.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545210 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 389a34 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Backpack (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Backpack f59085.yaml b/unpacked/Bag All Player Cards 15bb07/Card Backpack f59085.yaml new file mode 100644 index 000000000..7022a6a63 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Backpack f59085.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368517 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f59085 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Backpack +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Backstab (3) 7baf75.yaml b/unpacked/Bag All Player Cards 15bb07/Card Backstab (3) 7baf75.yaml new file mode 100644 index 000000000..b019051be --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Backstab (3) 7baf75.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538627 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7baf75 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Backstab (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Backstab cdfd9f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Backstab cdfd9f.yaml new file mode 100644 index 000000000..a11880b26 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Backstab cdfd9f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368716 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cdfd9f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Backstab +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch (3) 864fb6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch (3) 864fb6.yaml new file mode 100644 index 000000000..2db4fb4fd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch (3) 864fb6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374417 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3744': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 864fb6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bait and Switch (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch 2c2d9a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch 2c2d9a.yaml new file mode 100644 index 000000000..6de433420 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch 2c2d9a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368809 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2c2d9a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bait and Switch +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bandolier (2) e8b7ad.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bandolier (2) e8b7ad.yaml new file mode 100644 index 000000000..5b060cd09 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bandolier (2) e8b7ad.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 314204 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3142': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e8b7ad +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bandolier (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bandolier 82775a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bandolier 82775a.yaml new file mode 100644 index 000000000..9d3e96159 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bandolier 82775a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226325 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 82775a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bandolier +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Banish (1) a00fca.yaml b/unpacked/Bag All Player Cards 15bb07/Card Banish (1) a00fca.yaml new file mode 100644 index 000000000..0b4da0a48 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Banish (1) a00fca.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277509 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2775': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a00fca +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Banish (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Baron Samedi 16ad5d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Baron Samedi 16ad5d.yaml new file mode 100644 index 000000000..d056e5a68 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Baron Samedi 16ad5d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527552 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5275': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 16ad5d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Baron Samedi +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Barricade (3) 2e3115.yaml b/unpacked/Bag All Player Cards 15bb07/Card Barricade (3) 2e3115.yaml new file mode 100644 index 000000000..d2b9c2b34 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Barricade (3) 2e3115.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430651 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2e3115 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Barricade (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Barricade edb554.yaml b/unpacked/Bag All Player Cards 15bb07/Card Barricade edb554.yaml new file mode 100644 index 000000000..4359d6c1c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Barricade edb554.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368404 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: edb554 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Barricade +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 48e103.yaml b/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 48e103.yaml new file mode 100644 index 000000000..739b8fe47 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 48e103.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368830 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 48e103 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Baseball Bat +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bauta 9c9196.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bauta 9c9196.yaml new file mode 100644 index 000000000..1fdb7ca20 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bauta 9c9196.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 295601 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2956': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9c9196 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bauta +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 47.65 + posY: 4.0 + posZ: -5.33 + rotX: 359.98 + rotY: 270.0 + rotZ: 0.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bear Trap 74840a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bear Trap 74840a.yaml new file mode 100644 index 000000000..aed9e965f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bear Trap 74840a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 454100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4541': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Trap. +DragSelectable: true +GMNotes: '' +GUID: 74840a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bear Trap +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Beat Cop (2) 7001be.yaml b/unpacked/Bag All Player Cards 15bb07/Card Beat Cop (2) 7001be.yaml new file mode 100644 index 000000000..80d4a0587 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Beat Cop (2) 7001be.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226348 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7001be +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Beat Cop (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Beat Cop 7d4749.yaml b/unpacked/Bag All Player Cards 15bb07/Card Beat Cop 7d4749.yaml new file mode 100644 index 000000000..030dca2ca --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Beat Cop 7d4749.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226331 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7d4749 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Beat Cop +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Becky 587589.yaml b/unpacked/Bag All Player Cards 15bb07/Card Becky 587589.yaml new file mode 100644 index 000000000..e153972e7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Becky 587589.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274000 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Custom Marlin Model 1894 +DragSelectable: true +GMNotes: '' +GUID: '587589' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Becky +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Belly of the Beast dffa9d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Belly of the Beast dffa9d.yaml new file mode 100644 index 000000000..defd27a13 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Belly of the Beast dffa9d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277911 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2779': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dffa9d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Belly of the Beast +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Beloved b4666d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Beloved b4666d.yaml new file mode 100644 index 000000000..eefcd5138 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Beloved b4666d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266330 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b4666d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Beloved +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Beretta M1918 (4) 91da6b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Beretta M1918 (4) 91da6b.yaml new file mode 100644 index 000000000..bb27fe664 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Beretta M1918 (4) 91da6b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538629 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 91da6b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Beretta M1918 (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bind Monster (2) ba1460.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bind Monster (2) ba1460.yaml new file mode 100644 index 000000000..b4eeff9f8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bind Monster (2) ba1460.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230347 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ba1460 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bind Monster (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blackjack (2) 37a2b5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blackjack (2) 37a2b5.yaml new file mode 100644 index 000000000..8d538721a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blackjack (2) 37a2b5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 314105 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3141': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 37a2b5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blackjack (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blackjack 097dcc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blackjack 097dcc.yaml new file mode 100644 index 000000000..55ae3048f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blackjack 097dcc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226321 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 097dcc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blackjack +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blade of Ark'at db8043.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blade of Ark'at db8043.yaml new file mode 100644 index 000000000..ef1cdc702 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blade of Ark'at db8043.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231726 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false +Description: Shellblade Tribute +DragSelectable: true +GMNotes: '' +GUID: db8043 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blade of Ark'at +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.6 + posY: 3.29 + posZ: -2.99 + rotX: 359.4 + rotY: 270.03 + rotZ: 356.03 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blessed Blade cf4571.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blessed Blade cf4571.yaml new file mode 100644 index 000000000..7835f86fa --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blessed Blade cf4571.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266312 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cf4571 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blessed Blade +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blinding Light (2) 8254d4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blinding Light (2) 8254d4.yaml new file mode 100644 index 000000000..cc78d6b2f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blinding Light (2) 8254d4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230342 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8254d4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blinding Light (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blinding Light 30f860.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blinding Light 30f860.yaml new file mode 100644 index 000000000..cd415d671 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blinding Light 30f860.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230311 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 30f860 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blinding Light +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (1) 5efc92.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (1) 5efc92.yaml new file mode 100644 index 000000000..cb0b15bec --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (1) 5efc92.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545200 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5efc92 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blood Eclipse (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (3) 53d765.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (3) 53d765.yaml new file mode 100644 index 000000000..0da3d09fa --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (3) 53d765.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 314000 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3140': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 53d765 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blood Eclipse (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blood Pact (3) 64e131.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blood Pact (3) 64e131.yaml new file mode 100644 index 000000000..efb1667a7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blood Pact (3) 64e131.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230348 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 64e131 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blood Pact (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blood Pact fc709b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blood Pact fc709b.yaml new file mode 100644 index 000000000..8ab3f6e9f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blood Pact fc709b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232106 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fc709b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blood Pact +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 79.17 + posY: 3.27 + posZ: -3.98 + rotX: 357.88 + rotY: 269.93 + rotZ: 2.9 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blood-Rite eafd12.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blood-Rite eafd12.yaml new file mode 100644 index 000000000..bea38f3d4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blood-Rite eafd12.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379021 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3790': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: eafd12 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blood-Rite +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bloodlust aafc17.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bloodlust aafc17.yaml new file mode 100644 index 000000000..eb095c0f3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bloodlust aafc17.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440925 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4409': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Treachery +DragSelectable: true +GMNotes: '' +GUID: aafc17 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bloodlust +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bloodstained Dagger d71f11.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bloodstained Dagger d71f11.yaml new file mode 100644 index 000000000..1438c0adf --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bloodstained Dagger d71f11.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2741': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/778493212055041441/90F035BD69A7C5C6B6F43426DDDA3A09DFCBCBDF/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Murder Weapon +DragSelectable: true +GMNotes: '' +GUID: d71f11 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bloodstained Dagger +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Book of Psalms cc1ef3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Book of Psalms cc1ef3.yaml new file mode 100644 index 000000000..a42c5ebee --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Book of Psalms cc1ef3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266311 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cc1ef3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Book of Psalms +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (1) 35166c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (1) 35166c.yaml new file mode 100644 index 000000000..f671c9e87 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (1) 35166c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230336 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 35166c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Book of Shadows (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (3) 296dc8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (3) 296dc8.yaml new file mode 100644 index 000000000..74a899087 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (3) 296dc8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230354 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 296dc8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Book of Shadows (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Borrowed Time (3) 0db666.yaml b/unpacked/Bag All Player Cards 15bb07/Card Borrowed Time (3) 0db666.yaml new file mode 100644 index 000000000..be4644cf0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Borrowed Time (3) 0db666.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315253 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0db666 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Borrowed Time (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bought in Blood 275dc3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bought in Blood 275dc3.yaml new file mode 100644 index 000000000..287889c97 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bought in Blood 275dc3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 377141 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3771': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 275dc3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bought in Blood +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bounty Contracts 4d9b32.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bounty Contracts 4d9b32.yaml new file mode 100644 index 000000000..2d010c6a4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bounty Contracts 4d9b32.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274004 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4d9b32 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bounty Contracts +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves (3) 54293e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves (3) 54293e.yaml new file mode 100644 index 000000000..1380181d4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves (3) 54293e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545325 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 54293e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Boxing Gloves (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves db4a43.yaml b/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves db4a43.yaml new file mode 100644 index 000000000..bfccddef0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves db4a43.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545303 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: db4a43 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Boxing Gloves +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering 31cfbf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering 31cfbf.yaml new file mode 100644 index 000000000..ef1d2444b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering 31cfbf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553106 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 31cfbf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Breaking and Entering +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.41 + rotX: 0.22 + rotY: 270.0 + rotZ: 358.87 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Brother Xavier (1) 3c9617.yaml b/unpacked/Bag All Player Cards 15bb07/Card Brother Xavier (1) 3c9617.yaml new file mode 100644 index 000000000..e9537c84e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Brother Xavier (1) 3c9617.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226340 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Pure of Spirit +DragSelectable: true +GMNotes: '' +GUID: 3c9617 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Brother Xavier (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Brute Force (1) fb9b7e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Brute Force (1) fb9b7e.yaml new file mode 100644 index 000000000..1186456bc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Brute Force (1) fb9b7e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380230 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3802': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fb9b7e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Brute Force (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bulletproof Vest (3) c4cf62.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bulletproof Vest (3) c4cf62.yaml new file mode 100644 index 000000000..52b402e62 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bulletproof Vest (3) c4cf62.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368521 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c4cf62 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bulletproof Vest (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Burglary (2) 2aeb8a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Burglary (2) 2aeb8a.yaml new file mode 100644 index 000000000..a3e79ae15 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Burglary (2) 2aeb8a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447631 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4476': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2aeb8a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Burglary (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Burglary bc3451.yaml b/unpacked/Bag All Player Cards 15bb07/Card Burglary bc3451.yaml new file mode 100644 index 000000000..876f79cab --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Burglary bc3451.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368622 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bc3451 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Burglary +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Burning the Midnight Oil 0d29be.yaml b/unpacked/Bag All Player Cards 15bb07/Card Burning the Midnight Oil 0d29be.yaml new file mode 100644 index 000000000..abaab00a5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Burning the Midnight Oil 0d29be.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538812 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0d29be +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Burning the Midnight Oil +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bury Them Deep e6efe6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bury Them Deep e6efe6.yaml new file mode 100644 index 000000000..ebf364459 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bury Them Deep e6efe6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431818 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4318': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e6efe6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bury Them Deep +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Butterfly Effect (1) 22fc6c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Butterfly Effect (1) 22fc6c.yaml new file mode 100644 index 000000000..7d5db28c8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Butterfly Effect (1) 22fc6c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232108 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 22fc6c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Butterfly Effect (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 79.39 + posY: 3.27 + posZ: -3.7 + rotX: 357.19 + rotY: 269.96 + rotZ: 1.32 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Call of the Unknown 86feae.yaml b/unpacked/Bag All Player Cards 15bb07/Card Call of the Unknown 86feae.yaml new file mode 100644 index 000000000..c36ae7cb7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Call of the Unknown 86feae.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 377244 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3772': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 86feae +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Call of the Unknown +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Called by the Mists e628de.yaml b/unpacked/Bag All Player Cards 15bb07/Card Called by the Mists e628de.yaml new file mode 100644 index 000000000..520e4dc17 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Called by the Mists e628de.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550801 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: e628de +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Called by the Mists +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Calling in Favors 9b9e8b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Calling in Favors 9b9e8b.yaml new file mode 100644 index 000000000..f796884f1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Calling in Favors 9b9e8b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368510 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9b9e8b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Calling in Favors +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cat Burglar (1) 2fe723.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cat Burglar (1) 2fe723.yaml new file mode 100644 index 000000000..bdf9db249 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cat Burglar (1) 2fe723.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315239 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2fe723 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cat Burglar (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Catling Gun deea7a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Catling Gun deea7a.yaml new file mode 100644 index 000000000..86fbe9933 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Catling Gun deea7a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551200 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5512': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: deea7a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Catling Gun +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Caught Red-Handed ecd087.yaml b/unpacked/Bag All Player Cards 15bb07/Card Caught Red-Handed ecd087.yaml new file mode 100644 index 000000000..45d0c4bd5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Caught Red-Handed ecd087.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 376840 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3768': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ecd087 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Caught Red-Handed +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Celaeno Fragments d287bc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Celaeno Fragments d287bc.yaml new file mode 100644 index 000000000..e337f502d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Celaeno Fragments d287bc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538804 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Book of Books +DragSelectable: true +GMNotes: '' +GUID: d287bc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Celaeno Fragments +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Chainsaw (4) d40f4e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Chainsaw (4) d40f4e.yaml new file mode 100644 index 000000000..ed8cd3736 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Chainsaw (4) d40f4e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550827 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d40f4e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Chainsaw (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Charisma (3) 9e6c55.yaml b/unpacked/Bag All Player Cards 15bb07/Card Charisma (3) 9e6c55.yaml new file mode 100644 index 000000000..bc7aa4fb2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Charisma (3) 9e6c55.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 292524 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2925': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9e6c55 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Charisma (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 85.21 + posY: 2.24 + posZ: -20.16 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Charles Ross, Esq. 4a2a36.yaml b/unpacked/Bag All Player Cards 15bb07/Card Charles Ross, Esq. 4a2a36.yaml new file mode 100644 index 000000000..284f1fe9e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Charles Ross, Esq. 4a2a36.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368430 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Acquisitions and Solicitation +DragSelectable: true +GMNotes: '' +GUID: 4a2a36 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Charles Ross, Esq. +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Charon's Obol (1) 1dbc95.yaml b/unpacked/Bag All Player Cards 15bb07/Card Charon's Obol (1) 1dbc95.yaml new file mode 100644 index 000000000..67d00ff94 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Charon's Obol (1) 1dbc95.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315233 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Ferryman's Pay +DragSelectable: true +GMNotes: '' +GUID: 1dbc95 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Charon's Obol (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot (2) 0b963c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot (2) 0b963c.yaml new file mode 100644 index 000000000..6bdc460dd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot (2) 0b963c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538621 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0b963c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cheap Shot (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot b8c93a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot b8c93a.yaml new file mode 100644 index 000000000..69a5d4373 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot b8c93a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368715 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b8c93a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cheap Shot +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cheat Death (5) 3add54.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cheat Death (5) 3add54.yaml new file mode 100644 index 000000000..9ad605c43 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cheat Death (5) 3add54.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315261 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3add54 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cheat Death (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake (1) 5a2b49.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake (1) 5a2b49.yaml new file mode 100644 index 000000000..137b1ce3f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake (1) 5a2b49.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550818 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5a2b49 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cherished Keepsake (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake 215cec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake 215cec.yaml new file mode 100644 index 000000000..5094f292f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake 215cec.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368821 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 215cec +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cherished Keepsake +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Chew Toy of Nightmares bbf1af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Chew Toy of Nightmares bbf1af.yaml new file mode 100644 index 000000000..e2b5a628a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Chew Toy of Nightmares bbf1af.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551506 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5515': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Nightmares, I Tell You +DragSelectable: true +GMNotes: '' +GUID: bbf1af +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Chew Toy of Nightmares +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Chicago Typewriter (4) ecfa42.yaml b/unpacked/Bag All Player Cards 15bb07/Card Chicago Typewriter (4) ecfa42.yaml new file mode 100644 index 000000000..71d2c90b8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Chicago Typewriter (4) ecfa42.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315260 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ecfa42 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Chicago Typewriter (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Chronophobia eeb330.yaml b/unpacked/Bag All Player Cards 15bb07/Card Chronophobia eeb330.yaml new file mode 100644 index 000000000..5e73a4302 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Chronophobia eeb330.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431207 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4312': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: eeb330 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Chronophobia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (5) 0e72b6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (5) 0e72b6.yaml new file mode 100644 index 000000000..87afd6aa8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (5) 0e72b6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538630 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: O'Bannion Driver +DragSelectable: true +GMNotes: '' +GUID: 0e72b6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Chuck Fergus (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (3) f5d382.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (3) f5d382.yaml new file mode 100644 index 000000000..d2e551e15 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (3) f5d382.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538724 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f5d382 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Clairvoyance (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (5) e21200.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (5) e21200.yaml new file mode 100644 index 000000000..263047200 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (5) e21200.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538729 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e21200 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Clairvoyance (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance b67371.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance b67371.yaml new file mode 100644 index 000000000..8c0c22ce6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance b67371.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538706 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b67371 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Clairvoyance +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind (3) a53344.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind (3) a53344.yaml new file mode 100644 index 000000000..09a797b4a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind (3) a53344.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 313603 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3136': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a53344 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Clarity of Mind (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind 8e57b8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind 8e57b8.yaml new file mode 100644 index 000000000..b183d84a5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind 8e57b8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230322 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8e57b8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Clarity of Mind +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clasp of Black Onyx f295d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clasp of Black Onyx f295d9.yaml new file mode 100644 index 000000000..680523134 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Clasp of Black Onyx f295d9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232332 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2323': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: A Gift Unlooked For +DragSelectable: true +GMNotes: '' +GUID: f295d9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Clasp of Black Onyx +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clean Them Out 3319be.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clean Them Out 3319be.yaml new file mode 100644 index 000000000..1ad0abff1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Clean Them Out 3319be.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545309 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3319be +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Clean Them Out +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cloak of the Outer Realm 4e1e79.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cloak of the Outer Realm 4e1e79.yaml new file mode 100644 index 000000000..600f2d00d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cloak of the Outer Realm 4e1e79.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231723 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false +Description: Interwoven Distortion +DragSelectable: true +GMNotes: '' +GUID: 4e1e79 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cloak of the Outer Realm +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.89 + posY: 3.29 + posZ: -3.07 + rotX: 358.21 + rotY: 270.06 + rotZ: 356.77 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Close Call (2) 6aae86.yaml b/unpacked/Bag All Player Cards 15bb07/Card Close Call (2) 6aae86.yaml new file mode 100644 index 000000000..d0f1d21e8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Close Call (2) 6aae86.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368848 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6aae86 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Close Call (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket (2) 8dda2d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket (2) 8dda2d.yaml new file mode 100644 index 000000000..0c8dff10f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket (2) 8dda2d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545205 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8dda2d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Colt Vest Pocket (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket 5a305e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket 5a305e.yaml new file mode 100644 index 000000000..dd4c0ce9a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket 5a305e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 276101 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2761': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5a305e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Colt Vest Pocket +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Combat Training (1) bd3ecc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Combat Training (1) bd3ecc.yaml new file mode 100644 index 000000000..fd47d9880 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Combat Training (1) bd3ecc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226335 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bd3ecc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Combat Training (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Connect the Dots 13413d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Connect the Dots 13413d.yaml new file mode 100644 index 000000000..1c3dcdafe --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Connect the Dots 13413d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430809 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4308': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 13413d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Connect the Dots +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Contraband (2) 620b6e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Contraband (2) 620b6e.yaml new file mode 100644 index 000000000..a9d847e26 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Contraband (2) 620b6e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315304 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3153': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 620b6e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Contraband (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Contraband b4ad29.yaml b/unpacked/Bag All Player Cards 15bb07/Card Contraband b4ad29.yaml new file mode 100644 index 000000000..679f5c890 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Contraband b4ad29.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368717 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b4ad29 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Contraband +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Copycat (3) de40c8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Copycat (3) de40c8.yaml new file mode 100644 index 000000000..b2e55ee56 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Copycat (3) de40c8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538628 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: de40c8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Copycat (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cornered (2) c6c260.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cornered (2) c6c260.yaml new file mode 100644 index 000000000..eab6f3203 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cornered (2) c6c260.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368851 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c6c260 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cornered (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Counterpunch (2) 92436b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Counterpunch (2) 92436b.yaml new file mode 100644 index 000000000..e664f3e7e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Counterpunch (2) 92436b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545320 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 92436b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Counterpunch (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml new file mode 100644 index 000000000..7f0908f69 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545310 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 20645e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Counterpunch +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) 2236f6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) 2236f6.yaml new file mode 100644 index 000000000..4dab5ef7c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) 2236f6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230346 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2236f6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Counterspell (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Coup de Grâce 2240f9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Coup de Grâce 2240f9.yaml new file mode 100644 index 000000000..f060302bd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Coup de Grâce 2240f9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 276200 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2762': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2240f9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "Coup de Gr\xE2ce" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cover Up ca25bc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cover Up ca25bc.yaml new file mode 100644 index 000000000..7672cb832 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cover Up ca25bc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 552421 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5524': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ca25bc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cover Up +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crack the Case 8dce44.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crack the Case 8dce44.yaml new file mode 100644 index 000000000..b73a8b808 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Crack the Case 8dce44.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277812 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8dce44 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Crack the Case +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crisis of Faith 8b68f4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crisis of Faith 8b68f4.yaml new file mode 100644 index 000000000..d93c3a861 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Crisis of Faith 8b68f4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266301 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 8b68f4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Crisis of Faith +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity 367aac.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity 367aac.yaml new file mode 100644 index 000000000..8a9eb2f4f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity 367aac.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374935 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3749': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 367aac +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Crisis of Identity +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire fbfa24.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire fbfa24.yaml new file mode 100644 index 000000000..b2ac2299d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire fbfa24.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266316 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Untranslated +DragSelectable: true +GMNotes: '' +GUID: fbfa24 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cryptic Grimoire +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Research (4) 5d25b1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Research (4) 5d25b1.yaml new file mode 100644 index 000000000..92b41e985 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Research (4) 5d25b1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430657 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5d25b1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cryptic Research (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings (2) 870bdc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings (2) 870bdc.yaml new file mode 100644 index 000000000..d00170bab --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings (2) 870bdc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538822 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 870bdc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cryptic Writings (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings ff2776.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings ff2776.yaml new file mode 100644 index 000000000..6baa1c047 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings ff2776.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538813 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ff2776 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cryptic Writings +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptographic Cipher 4f3142.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptographic Cipher 4f3142.yaml new file mode 100644 index 000000000..5b9f53712 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptographic Cipher 4f3142.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266315 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4f3142 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cryptographic Cipher +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crystal Pendulum 6c3156.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crystal Pendulum 6c3156.yaml new file mode 100644 index 000000000..2cbad8c81 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Crystal Pendulum 6c3156.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538709 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6c3156 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Crystal Pendulum +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 8f871b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 8f871b.yaml new file mode 100644 index 000000000..187d803c7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 8f871b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230353 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8f871b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Crystalline Elder Sign (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crystallizer of Dreams e3bd71.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crystallizer of Dreams e3bd71.yaml new file mode 100644 index 000000000..9374315f1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Crystallizer of Dreams e3bd71.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440722 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4407': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e3bd71 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Crystallizer of Dreams +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cunning Distraction e8ea95.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cunning Distraction e8ea95.yaml new file mode 100644 index 000000000..b6b0b2858 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cunning Distraction e8ea95.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368819 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e8ea95 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cunning Distraction +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cunning e2767a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cunning e2767a.yaml new file mode 100644 index 000000000..76587470b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cunning e2767a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527606 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5276': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e2767a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cunning +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Curiosity 9e5cd2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Curiosity 9e5cd2.yaml new file mode 100644 index 000000000..8abe7ca9d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Curiosity 9e5cd2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430808 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4308': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9e5cd2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Curiosity +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Curse of the Rougarou 569b06.yaml b/unpacked/Bag All Player Cards 15bb07/Card Curse of the Rougarou 569b06.yaml new file mode 100644 index 000000000..e5ecd0f89 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Curse of the Rougarou 569b06.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 297101 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2971': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Curse. +DragSelectable: true +GMNotes: '' +GUID: 569b06 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Curse of the Rougarou +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Custom Ammunition (3) f03baa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Custom Ammunition (3) f03baa.yaml new file mode 100644 index 000000000..8906f9566 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Custom Ammunition (3) f03baa.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226354 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f03baa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Custom Ammunition (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag 321cb7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag 321cb7.yaml new file mode 100644 index 000000000..692e01716 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag 321cb7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 370422 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3704': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Signature +DragSelectable: true +GMNotes: '' +GUID: 321cb7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Daisy's Tote Bag +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daredevil (2) b3cad4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daredevil (2) b3cad4.yaml new file mode 100644 index 000000000..406c38954 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Daredevil (2) b3cad4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447633 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4476': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b3cad4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Daredevil (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daredevil e4688b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daredevil e4688b.yaml new file mode 100644 index 000000000..7a39d7453 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Daredevil e4688b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538616 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e4688b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Daredevil +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daring 91e53c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daring 91e53c.yaml new file mode 100644 index 000000000..62e8c7454 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Daring 91e53c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379827 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3798': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 91e53c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Daring +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver (2) fc82a5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver (2) fc82a5.yaml new file mode 100644 index 000000000..7897ad6b2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver (2) fc82a5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538620 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fc82a5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Daring Maneuver (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver cc6b14.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver cc6b14.yaml new file mode 100644 index 000000000..ebfd24878 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver cc6b14.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368706 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cc6b14 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Daring Maneuver +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dario El-Amin 5ec1a2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dario El-Amin 5ec1a2.yaml new file mode 100644 index 000000000..a8df6dcca --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dario El-Amin 5ec1a2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368630 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Unscrupulous Investor +DragSelectable: true +GMNotes: '' +GUID: 5ec1a2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dario El-Amin +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Future 3aa40e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Future 3aa40e.yaml new file mode 100644 index 000000000..3933fb200 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Future 3aa40e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538701 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 3aa40e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dark Future +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Horse 1b4434.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Horse 1b4434.yaml new file mode 100644 index 000000000..efb2dd8ca --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Horse 1b4434.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368833 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1b4434 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dark Horse +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Insight f08934.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Insight f08934.yaml new file mode 100644 index 000000000..3b5ea676a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Insight f08934.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 444260 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4442': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f08934 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dark Insight +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Memory 580a4d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Memory 580a4d.yaml new file mode 100644 index 000000000..b394c3261 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Memory 580a4d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266201 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2662': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038865190/8B0106D5599808B6E00387C2535AC1C3F2330034/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false +Description: Advanced +DragSelectable: true +GMNotes: '' +GUID: 580a4d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dark Memory +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 79.49 + posY: 3.27 + posZ: -3.0 + rotX: 357.65 + rotY: 270.07 + rotZ: 357.85 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Memory c025bf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Memory c025bf.yaml new file mode 100644 index 000000000..aa4876ca7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Memory c025bf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230527 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2305': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Signature +DragSelectable: true +GMNotes: '' +GUID: c025bf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dark Memory +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Pact dd3d09.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Pact dd3d09.yaml new file mode 100644 index 000000000..ff57e6003 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Pact dd3d09.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440813 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4408': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: dd3d09 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dark Pact +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy da7613.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy da7613.yaml new file mode 100644 index 000000000..be5a112ff --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy da7613.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230309 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: da7613 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dark Prophecy +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Ritual b2b554.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Ritual b2b554.yaml new file mode 100644 index 000000000..4b8929c5b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Ritual b2b554.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266320 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b2b554 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dark Ritual +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card David Renfield 1f8539.yaml b/unpacked/Bag All Player Cards 15bb07/Card David Renfield 1f8539.yaml new file mode 100644 index 000000000..5f6a88140 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card David Renfield 1f8539.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230325 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Esteemed Eschatologist +DragSelectable: true +GMNotes: '' +GUID: 1f8539 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: David Renfield +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning a9d77d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning a9d77d.yaml new file mode 100644 index 000000000..509148ccc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning a9d77d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266334 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: a9d77d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Day of Reckoning +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dayana Esperence (3) 4f2489.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dayana Esperence (3) 4f2489.yaml new file mode 100644 index 000000000..5d32e9d57 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dayana Esperence (3) 4f2489.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379616 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3796': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Deals with "Devils" +DragSelectable: true +GMNotes: '' +GUID: 4f2489 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dayana Esperence (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card De Vermis Mysteriis (2) b40b98.yaml b/unpacked/Bag All Player Cards 15bb07/Card De Vermis Mysteriis (2) b40b98.yaml new file mode 100644 index 000000000..d28338e46 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card De Vermis Mysteriis (2) b40b98.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 293313 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2933': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Signs of the Black Stars +DragSelectable: true +GMNotes: '' +GUID: b40b98 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: De Vermis Mysteriis (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Death • XIII (1) 2e5b03.yaml b/unpacked/Bag All Player Cards 15bb07/Card Death • XIII (1) 2e5b03.yaml new file mode 100644 index 000000000..9d78b6442 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Death • XIII (1) 2e5b03.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290207 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2902': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Free from the Past +DragSelectable: true +GMNotes: '' +GUID: 2e5b03 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "Death \u2022 XIII (1)" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deciphered Reality (5) 8b0193.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deciphered Reality (5) 8b0193.yaml new file mode 100644 index 000000000..9433357ac --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Deciphered Reality (5) 8b0193.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430660 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8b0193 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Deciphered Reality (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull (3) 946a58.yaml b/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull (3) 946a58.yaml new file mode 100644 index 000000000..34e2dc71b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull (3) 946a58.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545204 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Doom Begets Doom +DragSelectable: true +GMNotes: '' +GUID: 946a58 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Decorated Skull (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull 07350b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull 07350b.yaml new file mode 100644 index 000000000..fd5f683a9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull 07350b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368618 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Doom Begets Doom +DragSelectable: true +GMNotes: '' +GUID: 07350b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Decorated Skull +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Decoy 2ee50e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Decoy 2ee50e.yaml new file mode 100644 index 000000000..b12cf6d2a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Decoy 2ee50e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 292914 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2929': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2ee50e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Decoy +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deduction (2) 95272b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deduction (2) 95272b.yaml new file mode 100644 index 000000000..665ebff5b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Deduction (2) 95272b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430642 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 95272b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Deduction (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deduction b265c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deduction b265c4.yaml new file mode 100644 index 000000000..ba16f3ad9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Deduction b265c4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368402 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b265c4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Deduction +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deep Knowledge b176fc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deep Knowledge b176fc.yaml new file mode 100644 index 000000000..5a090e51b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Deep Knowledge b176fc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266317 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b176fc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Deep Knowledge +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Defiance (2) bf3dd1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Defiance (2) bf3dd1.yaml new file mode 100644 index 000000000..a5f046048 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Defiance (2) bf3dd1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230338 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bf3dd1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Defiance (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Defiance 59b24f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Defiance 59b24f.yaml new file mode 100644 index 000000000..0107710e4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Defiance 59b24f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230302 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 59b24f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Defiance +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Delay the Inevitable 683937.yaml b/unpacked/Bag All Player Cards 15bb07/Card Delay the Inevitable 683937.yaml new file mode 100644 index 000000000..c0de23cc4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Delay the Inevitable 683937.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431007 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4310': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '683937' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Delay the Inevitable +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Delilah O'Rourke (3) 97a795.yaml b/unpacked/Bag All Player Cards 15bb07/Card Delilah O'Rourke (3) 97a795.yaml new file mode 100644 index 000000000..09f807e0f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Delilah O'Rourke (3) 97a795.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 449035 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4490': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Syndicate Assassin +DragSelectable: true +GMNotes: '' +GUID: 97a795 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Delilah O'Rourke (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep (Taboo) d4a68a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep (Taboo) d4a68a.yaml new file mode 100644 index 000000000..3fb5db2a6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep (Taboo) d4a68a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450615 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d4a68a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Delve Too Deep (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep 14e212.yaml b/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep 14e212.yaml new file mode 100644 index 000000000..aa1079ed8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep 14e212.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230310 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 14e212 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Delve Too Deep +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dendromorphosis 121b2d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dendromorphosis 121b2d.yaml new file mode 100644 index 000000000..af479dcc1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dendromorphosis 121b2d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545211 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 121b2d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dendromorphosis +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deny Existence (5) d24531.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deny Existence (5) d24531.yaml new file mode 100644 index 000000000..be4892994 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Deny Existence (5) d24531.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379617 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3796': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d24531 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Deny Existence (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deny Existence 8aa0c3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deny Existence 8aa0c3.yaml new file mode 100644 index 000000000..64d668761 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Deny Existence 8aa0c3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430908 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4309': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8aa0c3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Deny Existence +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Desperate Search 45bdf0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Desperate Search 45bdf0.yaml new file mode 100644 index 000000000..0b4a28feb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Desperate Search 45bdf0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368507 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 45bdf0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Desperate Search +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Detached from Reality d12359.yaml b/unpacked/Bag All Player Cards 15bb07/Card Detached from Reality d12359.yaml new file mode 100644 index 000000000..7d4a3112c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Detached from Reality d12359.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274008 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d12359 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Detached from Reality +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Detective's Colt 1911s f4bac6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Detective's Colt 1911s f4bac6.yaml new file mode 100644 index 000000000..53f68c8df --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Detective's Colt 1911s f4bac6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379555 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3795': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f4bac6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Detective's Colt 1911s +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Devil's Luck (1) 812685.yaml b/unpacked/Bag All Player Cards 15bb07/Card Devil's Luck (1) 812685.yaml new file mode 100644 index 000000000..47177c067 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Devil's Luck (1) 812685.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368835 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '812685' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Devil's Luck (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dig Deep (2) 0414b4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dig Deep (2) 0414b4.yaml new file mode 100644 index 000000000..2f8efc1d1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dig Deep (2) 0414b4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368845 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0414b4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dig Deep (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dig Deep fc9e1b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dig Deep fc9e1b.yaml new file mode 100644 index 000000000..c63fb6320 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dig Deep fc9e1b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368831 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fc9e1b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dig Deep +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna (2) b00b76.yaml b/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna (2) b00b76.yaml new file mode 100644 index 000000000..f7e6fb3e4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna (2) b00b76.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430648 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Protective Amulet +DragSelectable: true +GMNotes: '' +GUID: b00b76 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Disc of Itzamna (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna d6c44a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna d6c44a.yaml new file mode 100644 index 000000000..e8abbf10e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna d6c44a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538805 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Protective Amulet +DragSelectable: true +GMNotes: '' +GUID: d6c44a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Disc of Itzamna +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dodge e0dff3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dodge e0dff3.yaml new file mode 100644 index 000000000..877f24946 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dodge e0dff3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226313 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e0dff3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dodge +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dog Monocle 041012.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dog Monocle 041012.yaml new file mode 100644 index 000000000..001452e68 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dog Monocle 041012.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 552011 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5520': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '041012' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dog Monocle +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dogcatchers 99800f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dogcatchers 99800f.yaml new file mode 100644 index 000000000..b6fcb7c8f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dogcatchers 99800f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551405 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5514': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 99800f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dogcatchers +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Doomed ba2ae1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Doomed ba2ae1.yaml new file mode 100644 index 000000000..fbcfaf642 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Doomed ba2ae1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440814 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4408': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: ba2ae1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Doomed +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing (Taboo) f98f6f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing (Taboo) f98f6f.yaml new file mode 100644 index 000000000..e590a2d57 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing (Taboo) f98f6f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450625 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f98f6f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Double or Nothing (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing efb09b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing efb09b.yaml new file mode 100644 index 000000000..2312092b2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing efb09b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 261701 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2617': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: efb09b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Double or Nothing +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Double, Double (4) 0e0530.yaml b/unpacked/Bag All Player Cards 15bb07/Card Double, Double (4) 0e0530.yaml new file mode 100644 index 000000000..fc9c41819 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Double, Double (4) 0e0530.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378019 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3780': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0e0530 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Double, Double (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Elli Horowitz 27e7b3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Elli Horowitz 27e7b3.yaml new file mode 100644 index 000000000..fece4bf7a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Elli Horowitz 27e7b3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368433 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Assistant Curator +DragSelectable: true +GMNotes: '' +GUID: 27e7b3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dr. Elli Horowitz +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Francis Morgan f03306.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Francis Morgan f03306.yaml new file mode 100644 index 000000000..a60b54c18 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Francis Morgan f03306.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232907 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2329': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Professor of Archaeology +DragSelectable: true +GMNotes: '' +GUID: f03306 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dr. Francis Morgan +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Henry Armitage 66197b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Henry Armitage 66197b.yaml new file mode 100644 index 000000000..282f25ab2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Henry Armitage 66197b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232900 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2329': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Head Librarian +DragSelectable: true +GMNotes: '' +GUID: 66197b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dr. Henry Armitage +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher (Taboo) 8ae314.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher (Taboo) 8ae314.yaml new file mode 100644 index 000000000..9a5370162 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher (Taboo) 8ae314.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450614 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Professor of Entomology +DragSelectable: true +GMNotes: '' +GUID: 8ae314 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dr. Milan Christopher (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher 9934d2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher 9934d2.yaml new file mode 100644 index 000000000..48836873e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher 9934d2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368434 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Professor of Entomology +DragSelectable: true +GMNotes: '' +GUID: 9934d2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dr. Milan Christopher +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson 234ff6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson 234ff6.yaml new file mode 100644 index 000000000..a2c280251 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson 234ff6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368423 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Working on Something Big +DragSelectable: true +GMNotes: '' +GUID: 234ff6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dr. William T. Maleson +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin (Taboo) 3d08dc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin (Taboo) 3d08dc.yaml new file mode 100644 index 000000000..00449b192 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin (Taboo) 3d08dc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450609 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3d08dc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Drawing Thin (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin 6d9881.yaml b/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin 6d9881.yaml new file mode 100644 index 000000000..f10339744 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin 6d9881.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277910 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2779': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6d9881 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Drawing Thin +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Drawing the Sign 3b3c0a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Drawing the Sign 3b3c0a.yaml new file mode 100644 index 000000000..239030cd5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Drawing the Sign 3b3c0a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431111 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4311': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 3b3c0a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Drawing the Sign +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Drawn to the Flame a8298f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Drawn to the Flame a8298f.yaml new file mode 100644 index 000000000..2956422ea --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Drawn to the Flame a8298f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230304 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a8298f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Drawn to the Flame +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dread Curse c54d7e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dread Curse c54d7e.yaml new file mode 100644 index 000000000..f8ad7a84c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dread Curse c54d7e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266333 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: c54d7e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dread Curse +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dreaded End 4b2e72.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dreaded End 4b2e72.yaml new file mode 100644 index 000000000..85ed2d05d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dreaded End 4b2e72.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231725 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false +Description: Gift of the Void +DragSelectable: true +GMNotes: '' +GUID: 4b2e72 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dreaded End +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.32 + posY: 3.32 + posZ: -3.01 + rotX: 0.26 + rotY: 270.0 + rotZ: 358.1 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) 5f9a10.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) 5f9a10.yaml new file mode 100644 index 000000000..2f3afeefd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) 5f9a10.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447834 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4478': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Dreams of an Explorer +DragSelectable: true +GMNotes: '' +GUID: 5f9a10 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dream Diary (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) e5f9cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) e5f9cb.yaml new file mode 100644 index 000000000..d3c1f6ba9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) e5f9cb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447835 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4478': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Dreams of a Madman +DragSelectable: true +GMNotes: '' +GUID: e5f9cb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dream Diary (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) ea40f6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) ea40f6.yaml new file mode 100644 index 000000000..1cbc66ab4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) ea40f6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447836 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4478': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Dreams of a Child +DragSelectable: true +GMNotes: '' +GUID: ea40f6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dream Diary (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary b81dcf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary b81dcf.yaml new file mode 100644 index 000000000..04eabce64 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary b81dcf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379928 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3799': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Untranslated +DragSelectable: true +GMNotes: '' +GUID: b81dcf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dream Diary +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream Parasite ae16e8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream Parasite ae16e8.yaml new file mode 100644 index 000000000..db5accdef --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream Parasite ae16e8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448736 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4487': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: ae16e8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dream Parasite +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream-Enhancing Serum 98c5af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream-Enhancing Serum 98c5af.yaml new file mode 100644 index 000000000..bf2500bb3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream-Enhancing Serum 98c5af.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379931 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3799': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 98c5af +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dream-Enhancing Serum +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream-Gate fa4c1e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream-Gate fa4c1e.yaml new file mode 100644 index 000000000..1fddf7291 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream-Gate fa4c1e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 541109 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5411': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/775107869050061525/A759DF697FFB26F0F5B75E116A923E33F88FCA7B/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fa4c1e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dream-Gate +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dreams of the Deep 13eaf0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dreams of the Deep 13eaf0.yaml new file mode 100644 index 000000000..d06dcb88d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dreams of the Deep 13eaf0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 444147 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4441': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 13eaf0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dreams of the Deep +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Duke 876557.yaml b/unpacked/Bag All Player Cards 15bb07/Card Duke 876557.yaml new file mode 100644 index 000000000..924814262 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Duke 876557.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 371112 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3711': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '876557' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Duke +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck (2) 0c433b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck (2) 0c433b.yaml new file mode 100644 index 000000000..81bfca44b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck (2) 0c433b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550823 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0c433b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dumb Luck (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck f0e425.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck f0e425.yaml new file mode 100644 index 000000000..9dc1de05d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck f0e425.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368814 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f0e425 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dumb Luck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (2) e35bc2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (2) e35bc2.yaml new file mode 100644 index 000000000..b1a37daf6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (2) e35bc2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226349 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e35bc2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dynamite Blast (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (3) 14dcc4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (3) 14dcc4.yaml new file mode 100644 index 000000000..2283a499f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (3) 14dcc4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545327 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 14dcc4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dynamite Blast (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast 97986a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast 97986a.yaml new file mode 100644 index 000000000..ff0cbad04 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast 97986a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226319 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 97986a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dynamite Blast +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Déjà Vu (5) 719a45.yaml b/unpacked/Bag All Player Cards 15bb07/Card Déjà Vu (5) 719a45.yaml new file mode 100644 index 000000000..d7454e7d0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Déjà Vu (5) 719a45.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550829 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 719a45 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "D\xE9j\xE0 Vu (5)" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Earl Sawyer f14dce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Earl Sawyer f14dce.yaml new file mode 100644 index 000000000..226cbbca7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Earl Sawyer f14dce.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232950 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2329': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Smarter Than He Lets On +DragSelectable: true +GMNotes: '' +GUID: f14dce +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Earl Sawyer +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Easy Mark (1) cdbb37.yaml b/unpacked/Bag All Player Cards 15bb07/Card Easy Mark (1) cdbb37.yaml new file mode 100644 index 000000000..3ae454939 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Easy Mark (1) cdbb37.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440724 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4407': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cdbb37 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Easy Mark (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eat lead! (2) fc2629.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eat lead! (2) fc2629.yaml new file mode 100644 index 000000000..5155dea9b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Eat lead! (2) fc2629.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226342 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fc2629 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Eat lead!" (2)' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eat lead! a2c7ef.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eat lead! a2c7ef.yaml new file mode 100644 index 000000000..d8797e851 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Eat lead! a2c7ef.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440923 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4409': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a2c7ef +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Eat lead!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eavesdrop 256da2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eavesdrop 256da2.yaml new file mode 100644 index 000000000..df5540b54 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Eavesdrop 256da2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368711 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 256da2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Eavesdrop +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eidetic Memory (3) 814ce2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eidetic Memory (3) 814ce2.yaml new file mode 100644 index 000000000..6c010e294 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Eidetic Memory (3) 814ce2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430650 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 814ce2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Eidetic Memory (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Elder Sign Amulet (3) 324e49.yaml b/unpacked/Bag All Player Cards 15bb07/Card Elder Sign Amulet (3) 324e49.yaml new file mode 100644 index 000000000..0173cb363 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Elder Sign Amulet (3) 324e49.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368522 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 324e49 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Elder Sign Amulet (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration (1) e84eff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration (1) e84eff.yaml new file mode 100644 index 000000000..84f5865c3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration (1) e84eff.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538718 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e84eff +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Eldritch Inspiration (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration ff3f17.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration ff3f17.yaml new file mode 100644 index 000000000..dfb34364c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration ff3f17.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430907 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4309': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ff3f17 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Eldritch Inspiration +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Elina Harper 7e2896.yaml b/unpacked/Bag All Player Cards 15bb07/Card Elina Harper 7e2896.yaml new file mode 100644 index 000000000..666d3f132 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Elina Harper 7e2896.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 369816 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3698': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Knows Too Much +DragSelectable: true +GMNotes: '' +GUID: 7e2896 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Elina Harper +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Elusive (Taboo) 34140c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Elusive (Taboo) 34140c.yaml new file mode 100644 index 000000000..6b5e99a6a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Elusive (Taboo) 34140c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450601 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 34140c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Elusive (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Elusive 833305.yaml b/unpacked/Bag All Player Cards 15bb07/Card Elusive 833305.yaml new file mode 100644 index 000000000..08f2ffa14 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Elusive 833305.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368712 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '833305' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Elusive +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Emergency Aid 9c46da.yaml b/unpacked/Bag All Player Cards 15bb07/Card Emergency Aid 9c46da.yaml new file mode 100644 index 000000000..911bd719c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Emergency Aid 9c46da.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226317 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9c46da +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Emergency Aid +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (2) 8948c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (2) 8948c4.yaml new file mode 100644 index 000000000..84fcb5cef --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (2) 8948c4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368519 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8948c4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Emergency Cache (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (3) 408cb5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (3) 408cb5.yaml new file mode 100644 index 000000000..00d5c2593 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (3) 408cb5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368520 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 408cb5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Emergency Cache (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache 510c0d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache 510c0d.yaml new file mode 100644 index 000000000..0cdfa0b21 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache 510c0d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368509 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 510c0d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Emergency Cache +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 3d22c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 3d22c4.yaml new file mode 100644 index 000000000..ec9ae563a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 3d22c4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448033 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4480': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Acuity +DragSelectable: true +GMNotes: '' +GUID: 3d22c4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Empower Self (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 4c0f00.yaml b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 4c0f00.yaml new file mode 100644 index 000000000..7fa90cd0c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 4c0f00.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448032 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4480': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Alacrity +DragSelectable: true +GMNotes: '' +GUID: 4c0f00 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Empower Self (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) ffe4dd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) ffe4dd.yaml new file mode 100644 index 000000000..1e73ccf34 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) ffe4dd.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448031 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4480': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Stamina +DragSelectable: true +GMNotes: '' +GUID: ffe4dd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Empower Self (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Empty Vessel (4) c0d236.yaml b/unpacked/Bag All Player Cards 15bb07/Card Empty Vessel (4) c0d236.yaml new file mode 100644 index 000000000..fce252bca --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Empty Vessel (4) c0d236.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448936 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4489': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Abandoned by the Gods +DragSelectable: true +GMNotes: '' +GUID: c0d236 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Empty Vessel (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) 84b918.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) 84b918.yaml new file mode 100644 index 000000000..63ec9d437 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) 84b918.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 292815 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2928': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Guardian +DragSelectable: true +GMNotes: '' +GUID: 84b918 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Enchanted Blade (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) d0de54.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) d0de54.yaml new file mode 100644 index 000000000..0bb74ac29 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) d0de54.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 293314 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2933': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Mystic +DragSelectable: true +GMNotes: '' +GUID: d0de54 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Enchanted Blade (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade c7d9b5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade c7d9b5.yaml new file mode 100644 index 000000000..8459d2b6a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade c7d9b5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277607 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2776': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c7d9b5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Enchanted Blade +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Skull 19094d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Skull 19094d.yaml new file mode 100644 index 000000000..8803f551e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Skull 19094d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231727 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false +Description: Mask of the Burning Pit +DragSelectable: true +GMNotes: '' +GUID: 19094d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Enchanted Skull +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.51 + posY: 3.35 + posZ: -3.38 + rotX: 359.95 + rotY: 270.0 + rotZ: 359.84 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia (2) f5bcec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia (2) f5bcec.yaml new file mode 100644 index 000000000..e3447d4f5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia (2) f5bcec.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430646 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f5bcec +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Encyclopedia (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia dbb0e0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia dbb0e0.yaml new file mode 100644 index 000000000..3f4bb1f91 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia dbb0e0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538806 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dbb0e0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Encyclopedia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enraptured a5c780.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enraptured a5c780.yaml new file mode 100644 index 000000000..9f0856ef6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Enraptured a5c780.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230301 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a5c780 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Enraptured +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (1) 0ce005.yaml b/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (1) 0ce005.yaml new file mode 100644 index 000000000..e0ecd30b2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (1) 0ce005.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 293216 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2932': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0ce005 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Esoteric Atlas (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (2) 2172e2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (2) 2172e2.yaml new file mode 100644 index 000000000..35c627d90 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (2) 2172e2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538820 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2172e2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Esoteric Atlas (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Essence of the Dream 6ad46b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Essence of the Dream 6ad46b.yaml new file mode 100644 index 000000000..c7f708efd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Essence of the Dream 6ad46b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379929 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3799': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6ad46b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Essence of the Dream +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ethereal Form db90e2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Form db90e2.yaml new file mode 100644 index 000000000..e42f8099e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Form db90e2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380128 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3801': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: db90e2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ethereal Form +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) eaaee9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) eaaee9.yaml new file mode 100644 index 000000000..b106bf76d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) eaaee9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374419 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3744': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: eaaee9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Eucatastrophe (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eureka! ffa4f9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eureka! ffa4f9.yaml new file mode 100644 index 000000000..8224b9cf9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Eureka! ffa4f9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368400 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ffa4f9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Eureka! +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (1) bb640d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (1) bb640d.yaml new file mode 100644 index 000000000..0421d16ff --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (1) bb640d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226334 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bb640d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ever Vigilant (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Evidence! (1) 3df5fb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Evidence! (1) 3df5fb.yaml new file mode 100644 index 000000000..09ac54701 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Evidence! (1) 3df5fb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545318 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3df5fb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Evidence! (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 1.28 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Evidence! 2db518.yaml b/unpacked/Bag All Player Cards 15bb07/Card Evidence! 2db518.yaml new file mode 100644 index 000000000..91f6f2da7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Evidence! 2db518.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226309 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2db518 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Evidence! +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Expedition Journal 9dc3d4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Expedition Journal 9dc3d4.yaml new file mode 100644 index 000000000..a868b89a6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Expedition Journal 9dc3d4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235649 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2356': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9dc3d4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Expedition Journal +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Expeditious Retreat (1) ea8324.yaml b/unpacked/Bag All Player Cards 15bb07/Card Expeditious Retreat (1) ea8324.yaml new file mode 100644 index 000000000..88bcfc8f6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Expeditious Retreat (1) ea8324.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447734 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4477': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ea8324 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Expeditious Retreat (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (1) 2e93fd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (1) 2e93fd.yaml new file mode 100644 index 000000000..704f9d530 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (1) 2e93fd.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430635 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2e93fd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Expose Weakness (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (3) 77f92c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (3) 77f92c.yaml new file mode 100644 index 000000000..9e5498451 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (3) 77f92c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 262203 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2622': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 77f92c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Expose Weakness (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Extensive Research (1) 3dc25c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Extensive Research (1) 3dc25c.yaml new file mode 100644 index 000000000..79080aa30 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Extensive Research (1) 3dc25c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447833 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4478': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3dc25c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Extensive Research (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Extensive Research 013446.yaml b/unpacked/Bag All Player Cards 15bb07/Card Extensive Research 013446.yaml new file mode 100644 index 000000000..6bbe867ef --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Extensive Research 013446.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538814 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '013446' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Extensive Research +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Extra Ammunition (1) f60263.yaml b/unpacked/Bag All Player Cards 15bb07/Card Extra Ammunition (1) f60263.yaml new file mode 100644 index 000000000..3b3ce8bcc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Extra Ammunition (1) f60263.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226337 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f60263 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Extra Ammunition (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos 9a5782.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos 9a5782.yaml new file mode 100644 index 000000000..8fae26049 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos 9a5782.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553110 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9a5782 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Eye of Chaos +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.44 + rotX: 0.22 + rotY: 270.0 + rotZ: 359.05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card False Awakening 0de10c.yaml b/unpacked/Bag All Player Cards 15bb07/Card False Awakening 0de10c.yaml new file mode 100644 index 000000000..a936d5073 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card False Awakening 0de10c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 552309 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5523': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/780749631103449151/FFAADF06C9BF9D1F4F3FE22D45CEBBB15D9B58CF/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0de10c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: False Awakening +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card False Awakening 3bf831.yaml b/unpacked/Bag All Player Cards 15bb07/Card False Awakening 3bf831.yaml new file mode 100644 index 000000000..d25105955 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card False Awakening 3bf831.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448519 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4485': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/780749631103449151/FFAADF06C9BF9D1F4F3FE22D45CEBBB15D9B58CF/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 3bf831 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: False Awakening +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card False Covenant (2) 3442f5.yaml b/unpacked/Bag All Player Cards 15bb07/Card False Covenant (2) 3442f5.yaml new file mode 100644 index 000000000..872af3394 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card False Covenant (2) 3442f5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553108 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3442f5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: False Covenant (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.44 + rotX: 0.23 + rotY: 270.0 + rotZ: 358.97 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Familiar Spirit 971d52.yaml b/unpacked/Bag All Player Cards 15bb07/Card Familiar Spirit 971d52.yaml new file mode 100644 index 000000000..7727a06a5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Familiar Spirit 971d52.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538708 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 971d52 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Familiar Spirit +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.yaml b/unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.yaml new file mode 100644 index 000000000..8a64063c6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431557 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4315': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '394603' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Family Inheritance +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Farsight (4) b4121c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Farsight (4) b4121c.yaml new file mode 100644 index 000000000..361c64474 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Farsight (4) b4121c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538829 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b4121c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Farsight (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Faustian Bargain 17d34b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Faustian Bargain 17d34b.yaml new file mode 100644 index 000000000..5b2e5e28f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Faustian Bargain 17d34b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266322 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 17d34b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Faustian Bargain +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fearless (2) b2e27e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fearless (2) b2e27e.yaml new file mode 100644 index 000000000..1f71fba05 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fearless (2) b2e27e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230337 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b2e27e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fearless (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fearless cd0ac1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fearless cd0ac1.yaml new file mode 100644 index 000000000..7bc4f0497 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fearless cd0ac1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230303 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cd0ac1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fearless +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind (3) bc4788.yaml b/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind (3) bc4788.yaml new file mode 100644 index 000000000..9d79fbe70 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind (3) bc4788.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 262200 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2622': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bc4788 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Feed the Mind (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind a614de.yaml b/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind a614de.yaml new file mode 100644 index 000000000..6f1bb93d0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind a614de.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538807 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a614de +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Feed the Mind +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Feline Discombobulator 7031aa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Feline Discombobulator 7031aa.yaml new file mode 100644 index 000000000..e6fb1cf08 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Feline Discombobulator 7031aa.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551302 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5513': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: It Discombobulates Felines +DragSelectable: true +GMNotes: '' +GUID: 7031aa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Feline Discombobulator +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fence (1) 2423e7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fence (1) 2423e7.yaml new file mode 100644 index 000000000..ec93a9d86 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fence (1) 2423e7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315238 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2423e7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fence (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fieldwork d6771f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fieldwork d6771f.yaml new file mode 100644 index 000000000..7714c6add --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fieldwork d6771f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368429 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d6771f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fieldwork +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fight or Flight 00af4f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fight or Flight 00af4f.yaml new file mode 100644 index 000000000..4c4822667 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fight or Flight 00af4f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368813 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 00af4f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fight or Flight +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 2c901b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 2c901b.yaml new file mode 100644 index 000000000..1efaa38a8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 2c901b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 372011 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3720': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2c901b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Final Rhapsody +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fine Clothes 5cb973.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fine Clothes 5cb973.yaml new file mode 100644 index 000000000..01b3763e4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fine Clothes 5cb973.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368511 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5cb973 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fine Clothes +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fine Print 39452d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fine Print 39452d.yaml new file mode 100644 index 000000000..99326657a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fine Print 39452d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545213 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 39452d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fine Print +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit b9bb2a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit b9bb2a.yaml new file mode 100644 index 000000000..1ad8536de --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit b9bb2a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430810 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4308': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b9bb2a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fingerprint Kit +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Finn's Trusty .38 848d9c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Finn's Trusty .38 848d9c.yaml new file mode 100644 index 000000000..990f3c3c3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Finn's Trusty .38 848d9c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 376739 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3767': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 848d9c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Finn's Trusty .38 +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fire Axe 9da37c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fire Axe 9da37c.yaml new file mode 100644 index 000000000..cc0f121a5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fire Axe 9da37c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368825 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9da37c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fire Axe +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (1) 8a4673.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (1) 8a4673.yaml new file mode 100644 index 000000000..444246e59 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (1) 8a4673.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368838 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8a4673 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fire Extinguisher (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card First Aid (3) bc80ab.yaml b/unpacked/Bag All Player Cards 15bb07/Card First Aid (3) bc80ab.yaml new file mode 100644 index 000000000..5903f26cc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card First Aid (3) bc80ab.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226353 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bc80ab +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: First Aid (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card First Aid 5cd622.yaml b/unpacked/Bag All Player Cards 15bb07/Card First Aid 5cd622.yaml new file mode 100644 index 000000000..b66256f9e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card First Aid 5cd622.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226324 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5cd622 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: First Aid +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card First Watch 0bb3da.yaml b/unpacked/Bag All Player Cards 15bb07/Card First Watch 0bb3da.yaml new file mode 100644 index 000000000..b548af958 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card First Watch 0bb3da.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379828 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3798': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0bb3da +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: First Watch +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fishing Net c7b748.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fishing Net c7b748.yaml new file mode 100644 index 000000000..a96b68cea --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fishing Net c7b748.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 7502 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '75': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Trap. +DragSelectable: true +GMNotes: '' +GUID: c7b748 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fishing Net +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Five of Pentacles (1) 46187b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Five of Pentacles (1) 46187b.yaml new file mode 100644 index 000000000..af47ca469 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Five of Pentacles (1) 46187b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274609 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: From the Brink +DragSelectable: true +GMNotes: '' +GUID: 46187b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Five of Pentacles (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) (Taboo) 8f170b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) (Taboo) 8f170b.yaml new file mode 100644 index 000000000..eb4d25783 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) (Taboo) 8f170b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450608 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8f170b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Flamethrower (5) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) cf4f15.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) cf4f15.yaml new file mode 100644 index 000000000..08c1f3f40 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) cf4f15.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 314002 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3140': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cf4f15 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Flamethrower (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flare (1) 017821.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flare (1) 017821.yaml new file mode 100644 index 000000000..4c98b45ec --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Flare (1) 017821.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368839 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 017821 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Flare (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flashlight bb1cce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flashlight bb1cce.yaml new file mode 100644 index 000000000..0d76fa4f6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Flashlight bb1cce.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368515 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bb1cce +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Flashlight +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flesh Ward 52c686.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flesh Ward 52c686.yaml new file mode 100644 index 000000000..0d81136a5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Flesh Ward 52c686.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545304 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 52c686 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Flesh Ward +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Followed 0cc3e7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Followed 0cc3e7.yaml new file mode 100644 index 000000000..409984734 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Followed 0cc3e7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380025 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3800': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0cc3e7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Followed +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fool me once... (1) b6506d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fool me once... (1) b6506d.yaml new file mode 100644 index 000000000..59f7897a7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fool me once... (1) b6506d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379830 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3798': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b6506d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Fool me once..." (1)' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Foolishness fa777f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Foolishness fa777f.yaml new file mode 100644 index 000000000..eb78bbba4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Foolishness fa777f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230502 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2305': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fa777f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Foolishness +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Knowledge 80acd2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Knowledge 80acd2.yaml new file mode 100644 index 000000000..8f80b9385 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Knowledge 80acd2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230316 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 80acd2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Forbidden Knowledge +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) 2f4507.yaml b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) 2f4507.yaml new file mode 100644 index 000000000..70c5a880e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) 2f4507.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538827 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Dark Knowledge +DragSelectable: true +GMNotes: '' +GUID: 2f4507 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Forbidden Tome (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) f375bf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) f375bf.yaml new file mode 100644 index 000000000..8e3a051fc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) f375bf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538828 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Secrets Revealed +DragSelectable: true +GMNotes: '' +GUID: f375bf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Forbidden Tome (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome 0a4d22.yaml b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome 0a4d22.yaml new file mode 100644 index 000000000..ff0d440af --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome 0a4d22.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538808 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Untranslated +DragSelectable: true +GMNotes: '' +GUID: 0a4d22 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Forbidden Tome +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Forewarned (1) c17f2c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Forewarned (1) c17f2c.yaml new file mode 100644 index 000000000..dbac4e520 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Forewarned (1) c17f2c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430636 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c17f2c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Forewarned (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fortuitous Discovery dacbf0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fortuitous Discovery dacbf0.yaml new file mode 100644 index 000000000..f5b4e22ed --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fortuitous Discovery dacbf0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440627 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4406': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dacbf0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fortuitous Discovery +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fortune or Fate (2) e674e8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fortune or Fate (2) e674e8.yaml new file mode 100644 index 000000000..34e452bc4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fortune or Fate (2) e674e8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 293015 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2930': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e674e8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fortune or Fate (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Foul Odor bc4a74.yaml b/unpacked/Bag All Player Cards 15bb07/Card Foul Odor bc4a74.yaml new file mode 100644 index 000000000..406848064 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Foul Odor bc4a74.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551303 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5513': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: bc4a74 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Foul Odor +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Four of Cups (1) dd4e2a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Four of Cups (1) dd4e2a.yaml new file mode 100644 index 000000000..9ae437237 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Four of Cups (1) dd4e2a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430905 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4309': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Chalice of the Heart +DragSelectable: true +GMNotes: '' +GUID: dd4e2a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Four of Cups (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Friendly Human 448d3a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Friendly Human 448d3a.yaml new file mode 100644 index 000000000..df95df8f3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Friendly Human 448d3a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551608 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5516': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: I Guess His Name is "Pete?" +DragSelectable: true +GMNotes: '' +GUID: 448d3a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Friendly Human +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Galvanize (1) 9e7f6a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Galvanize (1) 9e7f6a.yaml new file mode 100644 index 000000000..abbacde7a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Galvanize (1) 9e7f6a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545319 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9e7f6a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Galvanize (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Garrote Wire (2) b45c82.yaml b/unpacked/Bag All Player Cards 15bb07/Card Garrote Wire (2) b45c82.yaml new file mode 100644 index 000000000..9cfbd5264 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Garrote Wire (2) b45c82.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 449034 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4490': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b45c82 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Garrote Wire (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gate Box b8c891.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gate Box b8c891.yaml new file mode 100644 index 000000000..2a94f6059 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Gate Box b8c891.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274007 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Worlds within Worlds +DragSelectable: true +GMNotes: '' +GUID: b8c891 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Gate Box +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gavriella Mizrah 2237f4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gavriella Mizrah 2237f4.yaml new file mode 100644 index 000000000..c0934225a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Gavriella Mizrah 2237f4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 312511 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3125': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Not Going Down That Easily +DragSelectable: true +GMNotes: '' +GUID: 2237f4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Gavriella Mizrah +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Get over here! (2) 415ca2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Get over here! (2) 415ca2.yaml new file mode 100644 index 000000000..7fdfbcd03 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Get over here! (2) 415ca2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545321 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 415ca2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Get over here!" (2)' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Get over here! 5b0f86.yaml b/unpacked/Bag All Player Cards 15bb07/Card Get over here! 5b0f86.yaml new file mode 100644 index 000000000..1b8d30875 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Get over here! 5b0f86.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545312 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5b0f86 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Get over here!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ghastly Revelation b7c503.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ghastly Revelation b7c503.yaml new file mode 100644 index 000000000..5bd8178df --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ghastly Revelation b7c503.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379018 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3790': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b7c503 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ghastly Revelation +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gilded Volto d0e108.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gilded Volto d0e108.yaml new file mode 100644 index 000000000..b940f7129 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Gilded Volto d0e108.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 295604 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2956': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d0e108 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Gilded Volto +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 47.32 + posY: 4.0 + posZ: -3.34 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (1) 6e4d54.yaml b/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (1) 6e4d54.yaml new file mode 100644 index 000000000..8a6c55a99 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (1) 6e4d54.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538819 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6e4d54 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Glimpse the Unthinkable (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (5) 090fcf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (5) 090fcf.yaml new file mode 100644 index 000000000..ab8dd89ea --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (5) 090fcf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379022 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3790': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 090fcf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Glimpse the Unthinkable (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Glory 273584.yaml b/unpacked/Bag All Player Cards 15bb07/Card Glory 273584.yaml new file mode 100644 index 000000000..6784d5022 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Glory 273584.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545313 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '273584' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Glory +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Granny Orne (3) 52a66f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Granny Orne (3) 52a66f.yaml new file mode 100644 index 000000000..aa37102b4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Granny Orne (3) 52a66f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550825 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Tough Old Bird +DragSelectable: true +GMNotes: '' +GUID: 52a66f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Granny Orne (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Granny Orne 1cccfe.yaml b/unpacked/Bag All Player Cards 15bb07/Card Granny Orne 1cccfe.yaml new file mode 100644 index 000000000..fb737ef99 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Granny Orne 1cccfe.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550806 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Tough Old Bird +DragSelectable: true +GMNotes: '' +GUID: 1cccfe +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Granny Orne +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel (2) 96a440.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel (2) 96a440.yaml new file mode 100644 index 000000000..58da4a7cd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel (2) 96a440.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440622 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4406': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 96a440 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Gravedigger's Shovel (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel 3fe6de.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel 3fe6de.yaml new file mode 100644 index 000000000..107e149d2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel 3fe6de.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368829 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3fe6de +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Gravedigger's Shovel +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Graveyard Ghouls 80b7c6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Graveyard Ghouls 80b7c6.yaml new file mode 100644 index 000000000..ffb142016 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Graveyard Ghouls 80b7c6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 373819 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3738': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 80b7c6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Graveyard Ghouls +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Green Man Medallion c729ab.yaml b/unpacked/Bag All Player Cards 15bb07/Card Green Man Medallion c729ab.yaml new file mode 100644 index 000000000..e70014074 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Green Man Medallion c729ab.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 371565 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3715': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Hour of the Huntress +DragSelectable: true +GMNotes: '' +GUID: c729ab +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Green Man Medallion +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gregory Gry 90bf93.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gregory Gry 90bf93.yaml new file mode 100644 index 000000000..85e0e7d70 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Gregory Gry 90bf93.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380029 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3800': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Muckraker +DragSelectable: true +GMNotes: '' +GUID: 90bf93 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Gregory Gry +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner (3) b39b78.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner (3) b39b78.yaml new file mode 100644 index 000000000..a7ddf2622 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner (3) b39b78.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545326 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Purifier +DragSelectable: true +GMNotes: '' +GUID: b39b78 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Grete Wagner (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner f6dfe5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner f6dfe5.yaml new file mode 100644 index 000000000..e9aef8213 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner f6dfe5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545305 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Purifier +DragSelectable: true +GMNotes: '' +GUID: f6dfe5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Grete Wagner +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grimm's Fairy Tales 1d75d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grimm's Fairy Tales 1d75d0.yaml new file mode 100644 index 000000000..96ef5d64c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Grimm's Fairy Tales 1d75d0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550804 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1d75d0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Grimm's Fairy Tales +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 1433eb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 1433eb.yaml new file mode 100644 index 000000000..3917bf82d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 1433eb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 293217 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2932': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Seeker +DragSelectable: true +GMNotes: '' +GUID: 1433eb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Grisly Totem (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 5fae20.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 5fae20.yaml new file mode 100644 index 000000000..c890d4f44 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 5fae20.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 293016 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2930': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Survivor +DragSelectable: true +GMNotes: '' +GUID: 5fae20 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Grisly Totem (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem a20887.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem a20887.yaml new file mode 100644 index 000000000..8971e71c4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem a20887.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277606 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2776': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a20887 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Grisly Totem +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grit Your Teeth a92a90.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grit Your Teeth a92a90.yaml new file mode 100644 index 000000000..0ae3dd663 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Grit Your Teeth a92a90.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550813 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a92a90 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Grit Your Teeth +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (2) 6b2e97.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (2) 6b2e97.yaml new file mode 100644 index 000000000..b7166a108 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (2) 6b2e97.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538719 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6b2e97 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Grotesque Statue (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (4) 07bc04.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (4) 07bc04.yaml new file mode 100644 index 000000000..b9983e3b0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (4) 07bc04.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230356 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 07bc04 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Grotesque Statue (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grounded (1) 98fc57.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grounded (1) 98fc57.yaml new file mode 100644 index 000000000..650092088 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Grounded (1) 98fc57.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230332 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 98fc57 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Grounded (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guard Dog 08bdf1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guard Dog 08bdf1.yaml new file mode 100644 index 000000000..1fa117ad5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Guard Dog 08bdf1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226326 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 08bdf1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Guard Dog +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guardian Angel 3c0249.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guardian Angel 3c0249.yaml new file mode 100644 index 000000000..2acf00644 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Guardian Angel 3c0249.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266300 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3c0249 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Guardian Angel +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guardian of the Crystallizer aec357.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guardian of the Crystallizer aec357.yaml new file mode 100644 index 000000000..1cd967b93 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Guardian of the Crystallizer aec357.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440723 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4407': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: aec357 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Guardian of the Crystallizer +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guidance bbfe9b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guidance bbfe9b.yaml new file mode 100644 index 000000000..5b0246ef5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Guidance bbfe9b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368406 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bbfe9b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Guidance +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guiding Spirit (1) f91e14.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guiding Spirit (1) f91e14.yaml new file mode 100644 index 000000000..7e4326a7f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Guiding Spirit (1) f91e14.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 293014 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2930': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f91e14 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Guiding Spirit (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guts (2) 219c78.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guts (2) 219c78.yaml new file mode 100644 index 000000000..2c23f1bc3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Guts (2) 219c78.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538722 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 219c78 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Guts (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guts 8f7289.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guts 8f7289.yaml new file mode 100644 index 000000000..96c6a6f72 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Guts 8f7289.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368500 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8f7289 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Guts +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hair of the Dog 61c4c5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hair of the Dog 61c4c5.yaml new file mode 100644 index 000000000..e8a5dc107 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hair of the Dog 61c4c5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 552515 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5525': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 61c4c5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hair of the Dog +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror 312d38.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror 312d38.yaml new file mode 100644 index 000000000..73adf3ade --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror 312d38.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378620 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 312d38 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hallowed Mirror +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hand of Fate 1ad931.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hand of Fate 1ad931.yaml new file mode 100644 index 000000000..fd14c83ad --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hand of Fate 1ad931.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266314 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1ad931 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hand of Fate +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Handcuffs 5f33be.yaml b/unpacked/Bag All Player Cards 15bb07/Card Handcuffs 5f33be.yaml new file mode 100644 index 000000000..bbe4a5f60 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Handcuffs 5f33be.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 313301 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3133': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5f33be +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Handcuffs +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (2) 15643b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (2) 15643b.yaml new file mode 100644 index 000000000..5ceb5242c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (2) 15643b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315242 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 15643b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hard Knocks (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 68744b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 68744b.yaml new file mode 100644 index 000000000..3fae3d7d9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 68744b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368623 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 68744b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hard Knocks +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Haste (2) 1bd139.yaml b/unpacked/Bag All Player Cards 15bb07/Card Haste (2) 1bd139.yaml new file mode 100644 index 000000000..9fcb70e30 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Haste (2) 1bd139.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447632 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4476': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1bd139 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Haste (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hatchet Man 857238.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hatchet Man 857238.yaml new file mode 100644 index 000000000..757ee43a3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hatchet Man 857238.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 261704 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2617': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '857238' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hatchet Man +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Haunted 249d83.yaml b/unpacked/Bag All Player Cards 15bb07/Card Haunted 249d83.yaml new file mode 100644 index 000000000..81972ab42 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Haunted 249d83.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527402 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5274': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 249d83 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Haunted +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hawk-Eye Folding Camera 5ada0a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hawk-Eye Folding Camera 5ada0a.yaml new file mode 100644 index 000000000..68bb91c07 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hawk-Eye Folding Camera 5ada0a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277813 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5ada0a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hawk-Eye Folding Camera +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Healing Words bba97a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Healing Words bba97a.yaml new file mode 100644 index 000000000..1215ca015 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Healing Words bba97a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380127 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3801': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bba97a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Healing Words +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea 23c694.yaml b/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea 23c694.yaml new file mode 100644 index 000000000..89dbd7c2b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea 23c694.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230626 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Artifact from Another Life +DragSelectable: true +GMNotes: '' +GUID: 23c694 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Heirloom of Hyperborea +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -61.68 + posY: 3.34 + posZ: -62.66 + rotX: 357.37 + rotY: 269.99 + rotZ: 1.44 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea bf151d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea bf151d.yaml new file mode 100644 index 000000000..92381f51e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea bf151d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266200 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2662': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038865190/8B0106D5599808B6E00387C2535AC1C3F2330034/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false +Description: Artifact from Another Life (Advanced) +DragSelectable: true +GMNotes: '' +GUID: bf151d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Heirloom of Hyperborea +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hemispheric Map (3) d2663c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hemispheric Map (3) d2663c.yaml new file mode 100644 index 000000000..8509b04e2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hemispheric Map (3) d2663c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 261101 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2611': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d2663c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hemispheric Map (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Henry Wan 9df9df.yaml b/unpacked/Bag All Player Cards 15bb07/Card Henry Wan 9df9df.yaml new file mode 100644 index 000000000..ed72d934d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Henry Wan 9df9df.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277709 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2777': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Aspiring Actor +DragSelectable: true +GMNotes: '' +GUID: 9df9df +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Henry Wan +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue (2) 93381d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue (2) 93381d.yaml new file mode 100644 index 000000000..9b08b68d7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue (2) 93381d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447934 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4479': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 93381d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Heroic Rescue (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue bb0f6a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue bb0f6a.yaml new file mode 100644 index 000000000..1830f4a3e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue bb0f6a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226311 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bb0f6a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Heroic Rescue +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hiding Spot dd130e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hiding Spot dd130e.yaml new file mode 100644 index 000000000..cc5c0f8b9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hiding Spot dd130e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368808 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dd130e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hiding Spot +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card High Roller (2) ce1b89.yaml b/unpacked/Bag All Player Cards 15bb07/Card High Roller (2) ce1b89.yaml new file mode 100644 index 000000000..1fa8ee7cc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card High Roller (2) ce1b89.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315247 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ce1b89 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: High Roller (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) (Taboo) 833501.yaml b/unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) (Taboo) 833501.yaml new file mode 100644 index 000000000..d9a48f9da --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) (Taboo) 833501.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450604 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '833501' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Higher Education (3) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) d48b25.yaml b/unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) d48b25.yaml new file mode 100644 index 000000000..42e39b0e4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) d48b25.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430649 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d48b25 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Higher Education (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Higher Education 8595fb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Higher Education 8595fb.yaml new file mode 100644 index 000000000..6ddd26ec4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Higher Education 8595fb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538809 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8595fb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Higher Education +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hired Dogs 44bc00.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hired Dogs 44bc00.yaml new file mode 100644 index 000000000..d7427c611 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hired Dogs 44bc00.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551912 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5519': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 44bc00 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hired Dogs +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hired Muscle (1) cdd6aa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hired Muscle (1) cdd6aa.yaml new file mode 100644 index 000000000..fc7533273 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hired Muscle (1) cdd6aa.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315234 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cdd6aa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hired Muscle (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Holy Rosary fa1d67.yaml b/unpacked/Bag All Player Cards 15bb07/Card Holy Rosary fa1d67.yaml new file mode 100644 index 000000000..bb6dd9834 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Holy Rosary fa1d67.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230323 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fa1d67 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Holy Rosary +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hoods 785f68.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hoods 785f68.yaml new file mode 100644 index 000000000..c86ea685e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hoods 785f68.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378863 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3788': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 785f68 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hoods +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hope 45c582.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hope 45c582.yaml new file mode 100644 index 000000000..1ee006066 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hope 45c582.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440624 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4406': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 45c582 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hope +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hospital Debts 47d6c9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hospital Debts 47d6c9.yaml new file mode 100644 index 000000000..3a322157f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hospital Debts 47d6c9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431425 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4314': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Signature +DragSelectable: true +GMNotes: '' +GUID: 47d6c9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hospital Debts +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 76.49 + posY: 46.21 + posZ: -3.88 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (2) f2508d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (2) f2508d.yaml new file mode 100644 index 000000000..863f5602c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (2) f2508d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315250 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f2508d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hot Streak (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (4) 4eb231.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (4) 4eb231.yaml new file mode 100644 index 000000000..16fd6e951 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (4) 4eb231.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315258 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4eb231 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hot Streak (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Howl of Clyhf'ford 952924.yaml b/unpacked/Bag All Player Cards 15bb07/Card Howl of Clyhf'ford 952924.yaml new file mode 100644 index 000000000..59d291f7b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Howl of Clyhf'ford 952924.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551813 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5518': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '952924' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Howl of Clyhf'ford +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (2) 23c3e5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (2) 23c3e5.yaml new file mode 100644 index 000000000..919019069 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (2) 23c3e5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430644 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 23c3e5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hyperawareness (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness e5dd39.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness e5dd39.yaml new file mode 100644 index 000000000..eac4166a0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness e5dd39.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368424 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e5dd39 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hyperawareness +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (2) e2bc49.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (2) e2bc49.yaml new file mode 100644 index 000000000..9a6469482 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (2) e2bc49.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538721 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e2bc49 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hypnotic Gaze (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze 8f3c8e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze 8f3c8e.yaml new file mode 100644 index 000000000..26032cfc2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze 8f3c8e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230313 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8f3c8e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hypnotic Gaze +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Therapy 7f1b48.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Therapy 7f1b48.yaml new file mode 100644 index 000000000..9ab6fb9af --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Therapy 7f1b48.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379253 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3792': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7f1b48 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hypnotic Therapy +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hypochondria 88ee43.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hypochondria 88ee43.yaml new file mode 100644 index 000000000..637936128 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hypochondria 88ee43.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527404 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5274': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 88ee43 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hypochondria +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card I'll see you in hell! 84ba9d.yaml b/unpacked/Bag All Player Cards 15bb07/Card I'll see you in hell! 84ba9d.yaml new file mode 100644 index 000000000..84c6dd207 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card I'll see you in hell! 84ba9d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226307 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 84ba9d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"I''ll see you in hell!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card I'm done runnin'! d8a324.yaml b/unpacked/Bag All Player Cards 15bb07/Card I'm done runnin'! d8a324.yaml new file mode 100644 index 000000000..abe668b28 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card I'm done runnin'! d8a324.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378762 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3787': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d8a324 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"I''m done runnin''!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card I'm outta here! 62cf25.yaml b/unpacked/Bag All Player Cards 15bb07/Card I'm outta here! 62cf25.yaml new file mode 100644 index 000000000..6e30a15ee --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card I'm outta here! 62cf25.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368707 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 62cf25 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"I''m outta here!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! (2) 344e90.yaml b/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! (2) 344e90.yaml new file mode 100644 index 000000000..41b4ddd96 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! (2) 344e90.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538823 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 344e90 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"I''ve got a plan!" (2)' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! acd0da.yaml b/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! acd0da.yaml new file mode 100644 index 000000000..9f3ff8f0c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! acd0da.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368418 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: acd0da +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"I''ve got a plan!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card I've had worse… (2) 76147b.yaml b/unpacked/Bag All Player Cards 15bb07/Card I've had worse… (2) 76147b.yaml new file mode 100644 index 000000000..5c7bc6652 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card I've had worse… (2) 76147b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378619 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 76147b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "\"I've had worse\u2026\" (2)" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card I've had worse… (4) 3b6834.yaml b/unpacked/Bag All Player Cards 15bb07/Card I've had worse… (4) 3b6834.yaml new file mode 100644 index 000000000..d8fb835b6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card I've had worse… (4) 3b6834.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226355 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3b6834 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "\"I've had worse\u2026\" (4)" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ichtaca 29fc24.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ichtaca 29fc24.yaml new file mode 100644 index 000000000..db52fd8fd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ichtaca 29fc24.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235648 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2356': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Forgotten Guardian +DragSelectable: true +GMNotes: '' +GUID: 29fc24 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ichtaca +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card If it bleeds... acf2b0.yaml b/unpacked/Bag All Player Cards 15bb07/Card If it bleeds... acf2b0.yaml new file mode 100644 index 000000000..1c577e2da --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card If it bleeds... acf2b0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226312 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: acf2b0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"If it bleeds..."' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Impromptu Barrier 9591ac.yaml b/unpacked/Bag All Player Cards 15bb07/Card Impromptu Barrier 9591ac.yaml new file mode 100644 index 000000000..48e67dd19 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Impromptu Barrier 9591ac.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430503 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4305': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9591ac +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Impromptu Barrier +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9aee7f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9aee7f.yaml new file mode 100644 index 000000000..be8755aa2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9aee7f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374834 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3748': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9aee7f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Improvisation +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9ef062.yaml b/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9ef062.yaml new file mode 100644 index 000000000..5cf48f4f6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9ef062.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374834 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3748': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9ef062 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Improvisation +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Improvised Weapon 30f90b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Improvised Weapon 30f90b.yaml new file mode 100644 index 000000000..0c68d428a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Improvised Weapon 30f90b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368811 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 30f90b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Improvised Weapon +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card In the Know (1) 7b42b6.yaml b/unpacked/Bag All Player Cards 15bb07/Card In the Know (1) 7b42b6.yaml new file mode 100644 index 000000000..4d7abd395 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card In the Know (1) 7b42b6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430640 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7b42b6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: In the Know (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card In the Shadows 2561b9.yaml b/unpacked/Bag All Player Cards 15bb07/Card In the Shadows 2561b9.yaml new file mode 100644 index 000000000..aeb9fbda9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card In the Shadows 2561b9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266304 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2561b9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: In the Shadows +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Indebted b2ef43.yaml b/unpacked/Bag All Player Cards 15bb07/Card Indebted b2ef43.yaml new file mode 100644 index 000000000..d20701ab5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Indebted b2ef43.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431205 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4312': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: b2ef43 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Indebted +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (3) 943332.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (3) 943332.yaml new file mode 100644 index 000000000..8356b9a0c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (3) 943332.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538725 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '943332' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ineffable Truth (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (5) f00301.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (5) f00301.yaml new file mode 100644 index 000000000..51a330efb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (5) f00301.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538730 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f00301 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ineffable Truth (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth c6caf6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth c6caf6.yaml new file mode 100644 index 000000000..14bceb97c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth c6caf6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538707 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c6caf6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ineffable Truth +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Infighting (3) c803ba.yaml b/unpacked/Bag All Player Cards 15bb07/Card Infighting (3) c803ba.yaml new file mode 100644 index 000000000..0f7bd9741 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Infighting (3) c803ba.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368854 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c803ba +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Infighting (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Inquiring Mind 5c3aea.yaml b/unpacked/Bag All Player Cards 15bb07/Card Inquiring Mind 5c3aea.yaml new file mode 100644 index 000000000..51e78af7e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Inquiring Mind 5c3aea.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368401 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5c3aea +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Inquiring Mind +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Inspiring Presence 80628f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Inspiring Presence 80628f.yaml new file mode 100644 index 000000000..eb9fbd9dd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Inspiring Presence 80628f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226301 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 80628f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Inspiring Presence +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Intel Report 5115d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Intel Report 5115d9.yaml new file mode 100644 index 000000000..199b0db33 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Intel Report 5115d9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277710 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2777': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5115d9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Intel Report +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Internal Injury 4fb446.yaml b/unpacked/Bag All Player Cards 15bb07/Card Internal Injury 4fb446.yaml new file mode 100644 index 000000000..01a239fbd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Internal Injury 4fb446.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431206 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4312': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 4fb446 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Internal Injury +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Interrogate c70ad8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Interrogate c70ad8.yaml new file mode 100644 index 000000000..47c5631c9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Interrogate c70ad8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431008 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4310': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c70ad8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Interrogate +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Intrepid 99d061.yaml b/unpacked/Bag All Player Cards 15bb07/Card Intrepid 99d061.yaml new file mode 100644 index 000000000..6ab40e766 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Intrepid 99d061.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226304 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 99d061 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Intrepid +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Investments b65011.yaml b/unpacked/Bag All Player Cards 15bb07/Card Investments b65011.yaml new file mode 100644 index 000000000..27929ac73 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Investments b65011.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 292913 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2929': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b65011 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Investments +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jake Williams 7c958e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jake Williams 7c958e.yaml new file mode 100644 index 000000000..4dcd0bac6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Jake Williams 7c958e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 377343 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3773': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7c958e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Jake Williams +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jenny's Twin .45s d87128.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jenny's Twin .45s d87128.yaml new file mode 100644 index 000000000..f5a3a92eb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Jenny's Twin .45s d87128.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 371308 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3713': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d87128 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Jenny's Twin .45s +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jerome Davids d99735.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jerome Davids d99735.yaml new file mode 100644 index 000000000..06a8d360c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Jerome Davids d99735.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 312512 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3125': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: In Way Over His Head +DragSelectable: true +GMNotes: '' +GUID: d99735 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Jerome Davids +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jessica Hyde (1) b8380d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jessica Hyde (1) b8380d.yaml new file mode 100644 index 000000000..43e373326 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Jessica Hyde (1) b8380d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380228 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3802': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Wrong Place, Wrong Time +DragSelectable: true +GMNotes: '' +GUID: b8380d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Jessica Hyde (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) 6bae15.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) 6bae15.yaml new file mode 100644 index 000000000..02bea65ce --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) 6bae15.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230352 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Gift of the Homunculi +DragSelectable: true +GMNotes: '' +GUID: 6bae15 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Jewel of Aureolus (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 03c6a7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 03c6a7.yaml new file mode 100644 index 000000000..4dcf111c8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 03c6a7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 372110 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3721': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 03c6a7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Jim's Trumpet +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil (3) 48c9ff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil (3) 48c9ff.yaml new file mode 100644 index 000000000..4e4eeb93b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil (3) 48c9ff.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 449036 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4490': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: 'Lookin'' Out For #1' +DragSelectable: true +GMNotes: '' +GUID: 48c9ff +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Joey "The Rat" Vigil (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil b51688.yaml b/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil b51688.yaml new file mode 100644 index 000000000..145c10b63 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil b51688.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368629 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: 'Lookin'' Out For #1' +DragSelectable: true +GMNotes: '' +GUID: b51688 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Joey "The Rat" Vigil +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card John & Jessie Burke cfb393.yaml b/unpacked/Bag All Player Cards 15bb07/Card John & Jessie Burke cfb393.yaml new file mode 100644 index 000000000..323141aa5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card John & Jessie Burke cfb393.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 454740 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4547': + BackIsHidden: true + BackURL: https://i.imgur.com/r6F1mt2.jpg + FaceURL: https://i.imgur.com/CN9PXUd.jpg + NumHeight: 5 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Ally. Government. +DragSelectable: true +GMNotes: '' +GUID: cfb393 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: John & Jessie Burke +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Keen Eye (3) 2f9de4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Keen Eye (3) 2f9de4.yaml new file mode 100644 index 000000000..96ec064e3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Keen Eye (3) 2f9de4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226351 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2f9de4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Keen Eye (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Keen Eye 0dc75e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Keen Eye 0dc75e.yaml new file mode 100644 index 000000000..98c966785 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Keen Eye 0dc75e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0dc75e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Keen Eye +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.76 + posY: 3.31 + posZ: -3.97 + rotX: 359.16 + rotY: 269.98 + rotZ: 2.62 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Keep Faith 8b46b2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Keep Faith 8b46b2.yaml new file mode 100644 index 000000000..c185e4d69 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Keep Faith 8b46b2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266328 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8b46b2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Keep Faith +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Kerosene (1) 25ad44.yaml b/unpacked/Bag All Player Cards 15bb07/Card Kerosene (1) 25ad44.yaml new file mode 100644 index 000000000..e73f0056f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Kerosene (1) 25ad44.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 314003 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3140': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 25ad44 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Kerosene (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) (Taboo) 244d61.yaml b/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) (Taboo) 244d61.yaml new file mode 100644 index 000000000..0869a54ea --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) (Taboo) 244d61.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450619 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Let the Storm Rage +DragSelectable: true +GMNotes: '' +GUID: 244d61 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Key of Ys (5) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) 1c98ff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) 1c98ff.yaml new file mode 100644 index 000000000..8a83d0410 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) 1c98ff.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368527 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Let the Storm Rage +DragSelectable: true +GMNotes: '' +GUID: 1c98ff +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Key of Ys (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Khopesh of the Abyss dc674e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Khopesh of the Abyss dc674e.yaml new file mode 100644 index 000000000..fa5311084 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Khopesh of the Abyss dc674e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 546916 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5469': + BackIsHidden: true + BackURL: https://i.imgur.com/NSozoRe.jpg + FaceURL: https://i.imgur.com/HLQOkvy.jpg + NumHeight: 5 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Item. Weapon. Relic. Melee. +DragSelectable: true +GMNotes: '' +GUID: dc674e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Khopesh of the Abyss +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Kleptomania 447a08.yaml b/unpacked/Bag All Player Cards 15bb07/Card Kleptomania 447a08.yaml new file mode 100644 index 000000000..040c8ca49 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Kleptomania 447a08.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438126 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 447a08 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Kleptomania +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Knife 0ab3f1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Knife 0ab3f1.yaml new file mode 100644 index 000000000..b95530911 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Knife 0ab3f1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368512 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0ab3f1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Knife +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power (Taboo) eccb8a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power (Taboo) eccb8a.yaml new file mode 100644 index 000000000..1f6c84b9c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power (Taboo) eccb8a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450611 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: eccb8a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Knowledge is Power (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power 6de21b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power 6de21b.yaml new file mode 100644 index 000000000..91b11ae67 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power 6de21b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 293215 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2932': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6de21b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Knowledge is Power +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Knuckleduster 5690d1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Knuckleduster 5690d1.yaml new file mode 100644 index 000000000..d02b139cd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Knuckleduster 5690d1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368627 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5690d1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Knuckleduster +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Kukri 756a35.yaml b/unpacked/Bag All Player Cards 15bb07/Card Kukri 756a35.yaml new file mode 100644 index 000000000..d02a6f1e1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Kukri 756a35.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368516 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 756a35 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Kukri +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Laboratory Assistant c18ebe.yaml b/unpacked/Bag All Player Cards 15bb07/Card Laboratory Assistant c18ebe.yaml new file mode 100644 index 000000000..9461e94af --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Laboratory Assistant c18ebe.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368427 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c18ebe +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Laboratory Assistant +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lady Esprit 37a76b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lady Esprit 37a76b.yaml new file mode 100644 index 000000000..6b39abc0f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lady Esprit 37a76b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 294203 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2942': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Ally. Sorcerer. +DragSelectable: true +GMNotes: '' +GUID: 37a76b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lady Esprit +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lantern (2) bda4fd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lantern (2) bda4fd.yaml new file mode 100644 index 000000000..ae781bc57 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lantern (2) bda4fd.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440621 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4406': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bda4fd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lantern (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lantern e66002.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lantern e66002.yaml new file mode 100644 index 000000000..c45c85a8c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lantern e66002.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368827 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e66002 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lantern +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Last Chance 1fe462.yaml b/unpacked/Bag All Player Cards 15bb07/Card Last Chance 1fe462.yaml new file mode 100644 index 000000000..068b6c6d5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Last Chance 1fe462.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368804 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1fe462 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Last Chance +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leadership (2) 80fafa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leadership (2) 80fafa.yaml new file mode 100644 index 000000000..14cc4a211 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Leadership (2) 80fafa.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447935 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4479': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 80fafa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Leadership (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leadership 83d8d7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leadership 83d8d7.yaml new file mode 100644 index 000000000..5287c7616 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Leadership 83d8d7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226303 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 83d8d7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Leadership +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leather Coat (1) 5b1550.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leather Coat (1) 5b1550.yaml new file mode 100644 index 000000000..b09a6afcc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Leather Coat (1) 5b1550.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550819 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5b1550 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Leather Coat (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leather Coat 593deb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leather Coat 593deb.yaml new file mode 100644 index 000000000..7d22d9721 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Leather Coat 593deb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368820 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 593deb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Leather Coat +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leather Jacket dfbc13.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leather Jacket dfbc13.yaml new file mode 100644 index 000000000..fbd360209 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Leather Jacket dfbc13.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538608 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dfbc13 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Leather Jacket +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca (1) 27446e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca (1) 27446e.yaml new file mode 100644 index 000000000..7d671c439 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca (1) 27446e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315240 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Louisiana Lion +DragSelectable: true +GMNotes: '' +GUID: 27446e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Leo De Luca (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca eaa415.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca eaa415.yaml new file mode 100644 index 000000000..e0989b522 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca eaa415.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368631 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Louisiana Lion +DragSelectable: true +GMNotes: '' +GUID: eaa415 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Leo De Luca +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lesson Learned (2) 037b2e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lesson Learned (2) 037b2e.yaml new file mode 100644 index 000000000..e54d7c85a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lesson Learned (2) 037b2e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545322 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 037b2e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lesson Learned (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Let God sort them out... d3dcf1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Let God sort them out... d3dcf1.yaml new file mode 100644 index 000000000..cfcd1f4db --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Let God sort them out... d3dcf1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380027 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3800': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d3dcf1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Let God sort them out..."' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Let me handle this! 36c0cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Let me handle this! 36c0cb.yaml new file mode 100644 index 000000000..8a3ad3aeb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Let me handle this! 36c0cb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226305 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 36c0cb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Let me handle this!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Library Docent (1) fab3a9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Library Docent (1) fab3a9.yaml new file mode 100644 index 000000000..4bf595ccc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Library Docent (1) fab3a9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538818 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fab3a9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Library Docent (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lightning Gun (5) 2d362c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lightning Gun (5) 2d362c.yaml new file mode 100644 index 000000000..9b7be935f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lightning Gun (5) 2d362c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226361 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2d362c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lightning Gun (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage (1) 5065a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage (1) 5065a6.yaml new file mode 100644 index 000000000..6c2900e49 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage (1) 5065a6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538618 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5065a6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Liquid Courage (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage c33a10.yaml b/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage c33a10.yaml new file mode 100644 index 000000000..b26ac1613 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage c33a10.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368620 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c33a10 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Liquid Courage +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lita Chantler 3c1944.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lita Chantler 3c1944.yaml new file mode 100644 index 000000000..b3dde02e0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lita Chantler 3c1944.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 295128 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2951': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642393244/74ADDF83D8B03DBF4AD5DC7230C2D12E84685317/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Ally +DragSelectable: true +GMNotes: '' +GUID: 3c1944 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lita Chantler +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Live and Learn 050ba1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Live and Learn 050ba1.yaml new file mode 100644 index 000000000..b986c3167 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Live and Learn 050ba1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368807 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 050ba1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Live and Learn +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lockpicks (1) edd6c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lockpicks (1) edd6c4.yaml new file mode 100644 index 000000000..a771dbaaf --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lockpicks (1) edd6c4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315237 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: edd6c4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lockpicks (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lockpicks cc11e4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lockpicks cc11e4.yaml new file mode 100644 index 000000000..796f89ece --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lockpicks cc11e4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538603 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cc11e4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lockpicks +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lodge Debts acce72.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lodge Debts acce72.yaml new file mode 100644 index 000000000..c2ad3be84 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lodge Debts acce72.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378958 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3789': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: acce72 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lodge "Debts" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning (4) 1258c6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning (4) 1258c6.yaml new file mode 100644 index 000000000..216af575a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning (4) 1258c6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 441023 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4410': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1258c6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Logical Reasoning (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning 812175.yaml b/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning 812175.yaml new file mode 100644 index 000000000..102bc6897 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning 812175.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368417 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '812175' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Logical Reasoning +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lola Santiago (3) 8bec05.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lola Santiago (3) 8bec05.yaml new file mode 100644 index 000000000..4fc568f1a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lola Santiago (3) 8bec05.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315256 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: No-Nonsense Archaeologist +DragSelectable: true +GMNotes: '' +GUID: 8bec05 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lola Santiago (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lone Wolf dc3b07.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lone Wolf dc3b07.yaml new file mode 100644 index 000000000..413894984 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lone Wolf dc3b07.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368619 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dc3b07 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lone Wolf +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lonnie Ritter ad0ef0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lonnie Ritter ad0ef0.yaml new file mode 100644 index 000000000..5d23e30b3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lonnie Ritter ad0ef0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538607 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Feisty Mechanic +DragSelectable: true +GMNotes: '' +GUID: ad0ef0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lonnie Ritter +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Look what I found! (2) fd393b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Look what I found! (2) fd393b.yaml new file mode 100644 index 000000000..c0c355745 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Look what I found! (2) fd393b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550822 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fd393b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Look what I found!" (2)' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Look what I found! 88d3c0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Look what I found! 88d3c0.yaml new file mode 100644 index 000000000..cda192a71 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Look what I found! 88d3c0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368816 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 88d3c0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Look what I found!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lost Soul 4f903e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lost Soul 4f903e.yaml new file mode 100644 index 000000000..dcda0190d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lost Soul 4f903e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232348 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2323': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Madness. Pact. +DragSelectable: true +GMNotes: '' +GUID: 4f903e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lost Soul +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lt. Wilson Stewart 4120f3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lt. Wilson Stewart 4120f3.yaml new file mode 100644 index 000000000..8d1420c3f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lt. Wilson Stewart 4120f3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 233607 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2336': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Logistical Genius +DragSelectable: true +GMNotes: '' +GUID: 4120f3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lt. Wilson Stewart +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucid Dreaming (2) 122e98.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucid Dreaming (2) 122e98.yaml new file mode 100644 index 000000000..a9430dcc4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucid Dreaming (2) 122e98.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527312 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5273': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 122e98 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lucid Dreaming (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case (3) 0feb74.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case (3) 0feb74.yaml new file mode 100644 index 000000000..7e76f26ef --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case (3) 0feb74.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538624 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0feb74 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lucky Cigarette Case (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case c607c5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case c607c5.yaml new file mode 100644 index 000000000..02adbc680 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case c607c5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368624 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c607c5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lucky Cigarette Case +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (2) 9dd911.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (2) 9dd911.yaml new file mode 100644 index 000000000..0c0465d90 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (2) 9dd911.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315244 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '... Or Are They?' +DragSelectable: true +GMNotes: '' +GUID: 9dd911 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lucky Dice (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky! (2) 439af2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky! (2) 439af2.yaml new file mode 100644 index 000000000..86656e349 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky! (2) 439af2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368846 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 439af2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lucky! (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky! (3) 04d33d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky! (3) 04d33d.yaml new file mode 100644 index 000000000..dc17cab01 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky! (3) 04d33d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550826 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 04d33d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lucky! (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky! ce0dd5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky! ce0dd5.yaml new file mode 100644 index 000000000..bbce7a661 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky! ce0dd5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368810 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ce0dd5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lucky! +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lupara (3) a6af13.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lupara (3) a6af13.yaml new file mode 100644 index 000000000..31c38c4bf --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lupara (3) a6af13.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315255 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a6af13 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lupara (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lure (1) d88407.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lure (1) d88407.yaml new file mode 100644 index 000000000..340c7883b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lure (1) d88407.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368836 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d88407 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lure (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lure (2) 1a90a4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lure (2) 1a90a4.yaml new file mode 100644 index 000000000..0116923aa --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lure (2) 1a90a4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374420 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3744': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1a90a4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lure (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card M1918 BAR (4) b1ad65.yaml b/unpacked/Bag All Player Cards 15bb07/Card M1918 BAR (4) b1ad65.yaml new file mode 100644 index 000000000..d7b07262f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card M1918 BAR (4) b1ad65.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226358 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b1ad65 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: M1918 BAR (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Machete (Taboo) 6411d5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Machete (Taboo) 6411d5.yaml new file mode 100644 index 000000000..29b3f5a60 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Machete (Taboo) 6411d5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450600 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6411d5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Machete (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Machete 86ee68.yaml b/unpacked/Bag All Player Cards 15bb07/Card Machete 86ee68.yaml new file mode 100644 index 000000000..8eedf9bea --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Machete 86ee68.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226327 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 86ee68 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Machete +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Madame Labranche 1ee492.yaml b/unpacked/Bag All Player Cards 15bb07/Card Madame Labranche 1ee492.yaml new file mode 100644 index 000000000..9ca4aebff --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Madame Labranche 1ee492.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368828 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Mysterious Benefactress +DragSelectable: true +GMNotes: '' +GUID: 1ee492 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Madame Labranche +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass (1) 378e84.yaml b/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass (1) 378e84.yaml new file mode 100644 index 000000000..f51ef2f55 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass (1) 378e84.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430637 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 378e84 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Magnifying Glass (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass 8cc0a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass 8cc0a6.yaml new file mode 100644 index 000000000..0ea857688 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass 8cc0a6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368421 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8cc0a6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Magnifying Glass +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (1) c55160.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (1) c55160.yaml new file mode 100644 index 000000000..6e3c6b4d5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (1) c55160.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226333 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c55160 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mano a Mano (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (2) 14424c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (2) 14424c.yaml new file mode 100644 index 000000000..8cb29f857 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (2) 14424c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545323 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 14424c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mano a Mano (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity (2) 982716.yaml b/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity (2) 982716.yaml new file mode 100644 index 000000000..7c3ec069d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity (2) 982716.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538623 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '982716' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Manual Dexterity (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity 679b13.yaml b/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity 679b13.yaml new file mode 100644 index 000000000..3b4f3092d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity 679b13.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368504 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 679b13 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Manual Dexterity +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mariner's Compass 4e2d75.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mariner's Compass 4e2d75.yaml new file mode 100644 index 000000000..5cf373401 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mariner's Compass 4e2d75.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553113 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4e2d75 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mariner's Compass +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.44 + rotX: 0.23 + rotY: 270.0 + rotZ: 358.97 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Marksmanship (1) 6a9021.yaml b/unpacked/Bag All Player Cards 15bb07/Card Marksmanship (1) 6a9021.yaml new file mode 100644 index 000000000..61d595f87 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Marksmanship (1) 6a9021.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226339 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6a9021 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Marksmanship (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 (2) 725690.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 (2) 725690.yaml new file mode 100644 index 000000000..8792d6e39 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 (2) 725690.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538619 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '725690' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mauser C96 (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 f32343.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 f32343.yaml new file mode 100644 index 000000000..252c713c0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 f32343.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538604 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f32343 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mauser C96 +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Meat Cleaver a57f19.yaml b/unpacked/Bag All Player Cards 15bb07/Card Meat Cleaver a57f19.yaml new file mode 100644 index 000000000..7a0cdcab2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Meat Cleaver a57f19.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277912 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2779': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a57f19 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Meat Cleaver +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Medical Texts ba16cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Medical Texts ba16cb.yaml new file mode 100644 index 000000000..e9707b94e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Medical Texts ba16cb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368425 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ba16cb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Medical Texts +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Medico Della Peste 6179d5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Medico Della Peste 6179d5.yaml new file mode 100644 index 000000000..354acc616 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Medico Della Peste 6179d5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 295602 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2956': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6179d5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Medico Della Peste +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 49.25 + posY: 4.0 + posZ: 0.2 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mi-Go Weapon 2fc31c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mi-Go Weapon 2fc31c.yaml new file mode 100644 index 000000000..44a483bc4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mi-Go Weapon 2fc31c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 233606 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2336': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2fc31c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mi-Go Weapon +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mind Over Matter (2) 9b1c5b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mind Over Matter (2) 9b1c5b.yaml new file mode 100644 index 000000000..4a429a807 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mind Over Matter (2) 9b1c5b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538824 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9b1c5b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mind Over Matter (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (1) 5d6e57.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (1) 5d6e57.yaml new file mode 100644 index 000000000..4f89acae6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (1) 5d6e57.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230334 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5d6e57 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mind Wipe (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (3) e72762.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (3) e72762.yaml new file mode 100644 index 000000000..432f825ac --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (3) e72762.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230351 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e72762 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mind Wipe (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mind over Matter 8cf335.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mind over Matter 8cf335.yaml new file mode 100644 index 000000000..e13048191 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mind over Matter 8cf335.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368408 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8cf335 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mind over Matter +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mind's Eye (2) ad58aa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mind's Eye (2) ad58aa.yaml new file mode 100644 index 000000000..96eecb604 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mind's Eye (2) ad58aa.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527237 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5272': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ad58aa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mind's Eye (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml b/unpacked/Bag All Player Cards 15bb07/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml new file mode 100644 index 000000000..f7fa18458 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538830 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1a1b58 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Miskatonic Archaeology Funding (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Miss Doyle (1) e1aedf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Miss Doyle (1) e1aedf.yaml new file mode 100644 index 000000000..5c6aebeab --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Miss Doyle (1) e1aedf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440623 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4406': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Cat General of Ulthar +DragSelectable: true +GMNotes: '' +GUID: e1aedf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Miss Doyle (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (2) 3d57b4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (2) 3d57b4.yaml new file mode 100644 index 000000000..18636c827 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (2) 3d57b4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545206 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3d57b4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mists of R'lyeh (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (4) 68fce2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (4) 68fce2.yaml new file mode 100644 index 000000000..65044fd25 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (4) 68fce2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230357 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 68fce2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mists of R'lyeh (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh 5558f1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh 5558f1.yaml new file mode 100644 index 000000000..1a64f9382 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh 5558f1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230326 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5558f1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mists of R'lyeh +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mitch Brown f91fd9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mitch Brown f91fd9.yaml new file mode 100644 index 000000000..480a54985 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mitch Brown f91fd9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 377042 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3770': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f91fd9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mitch Brown +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mk 1 Grenades (4) 0ab574.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mk 1 Grenades (4) 0ab574.yaml new file mode 100644 index 000000000..818eaaedd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mk 1 Grenades (4) 0ab574.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378617 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0ab574 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mk 1 Grenades (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mob Enforcer b239d7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mob Enforcer b239d7.yaml new file mode 100644 index 000000000..bfc8ca17c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mob Enforcer b239d7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527416 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5274': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Enemy +DragSelectable: true +GMNotes: '' +GUID: b239d7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mob Enforcer +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Molly Maxwell 692ced.yaml b/unpacked/Bag All Player Cards 15bb07/Card Molly Maxwell 692ced.yaml new file mode 100644 index 000000000..80c470bd3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Molly Maxwell 692ced.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 466112 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4661': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Exotic Morgana +DragSelectable: true +GMNotes: '' +GUID: 692ced +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Molly Maxwell +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Moment of Respite (3) 523b76.yaml b/unpacked/Bag All Player Cards 15bb07/Card Moment of Respite (3) 523b76.yaml new file mode 100644 index 000000000..66ba3e0cd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Moment of Respite (3) 523b76.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368525 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 523b76 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Moment of Respite (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Momentum (1) d753d7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Momentum (1) d753d7.yaml new file mode 100644 index 000000000..348dbf6fd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Momentum (1) d753d7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380026 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3800': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d753d7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Momentum (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Money Talks 276477.yaml b/unpacked/Bag All Player Cards 15bb07/Card Money Talks 276477.yaml new file mode 100644 index 000000000..7aabf6f34 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Money Talks 276477.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527607 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5276': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '276477' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Money Talks +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer (5) e21854.yaml b/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer (5) e21854.yaml new file mode 100644 index 000000000..010c2444c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer (5) e21854.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226359 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e21854 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Monster Slayer (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer 63b3e5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer 63b3e5.yaml new file mode 100644 index 000000000..87f12df1c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer 63b3e5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545314 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 63b3e5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Monster Slayer +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Monstrous Transformation 96ae32.yaml b/unpacked/Bag All Player Cards 15bb07/Card Monstrous Transformation 96ae32.yaml new file mode 100644 index 000000000..c19788eb8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Monstrous Transformation 96ae32.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 296704 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2967': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 96ae32 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Monstrous Transformation +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual 1cd2bd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual 1cd2bd.yaml new file mode 100644 index 000000000..665ad2629 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual 1cd2bd.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230306 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1cd2bd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Moonlight Ritual +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Moonstone 0d006f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Moonstone 0d006f.yaml new file mode 100644 index 000000000..c4274fabb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Moonstone 0d006f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447731 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4477': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0d006f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Moonstone +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card More Bark Than Bite 29bafb.yaml b/unpacked/Bag All Player Cards 15bb07/Card More Bark Than Bite 29bafb.yaml new file mode 100644 index 000000000..53d787288 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card More Bark Than Bite 29bafb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551201 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5512': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 29bafb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: More Bark Than Bite +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Moxie (1) 5fe780.yaml b/unpacked/Bag All Player Cards 15bb07/Card Moxie (1) 5fe780.yaml new file mode 100644 index 000000000..15adcba0c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Moxie (1) 5fe780.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315235 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5fe780 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Moxie (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook (Taboo) a8afba.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook (Taboo) a8afba.yaml new file mode 100644 index 000000000..47abb5e65 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook (Taboo) a8afba.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450610 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Dealer in Secrets +DragSelectable: true +GMNotes: '' +GUID: a8afba +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mr. "Rook" (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook 1339b0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook 1339b0.yaml new file mode 100644 index 000000000..7e82eb42c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook 1339b0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277811 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1339b0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mr. "Rook" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mysteries Remain 274daa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mysteries Remain 274daa.yaml new file mode 100644 index 000000000..eb70eb82d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mysteries Remain 274daa.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 370046 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3700': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 274daa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mysteries Remain +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mysterious Raven 59e40d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mysterious Raven 59e40d.yaml new file mode 100644 index 000000000..8b2f61640 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mysterious Raven 59e40d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550807 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 59e40d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mysterious Raven +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mystifying Song 3b8cb7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mystifying Song 3b8cb7.yaml new file mode 100644 index 000000000..87721c8eb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mystifying Song 3b8cb7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 444451 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4444': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3b8cb7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mystifying Song +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Naomi O'Bannion 7f7ecc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Naomi O'Bannion 7f7ecc.yaml new file mode 100644 index 000000000..0b1c9cae6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Naomi O'Bannion 7f7ecc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 233135 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2331': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241296009359/3EF850792428E467A4475333CCBBF6E6B5975186/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Ruthless Tactician +DragSelectable: true +GMNotes: '' +GUID: 7f7ecc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Naomi O'Bannion +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Narcolepsy 57e648.yaml b/unpacked/Bag All Player Cards 15bb07/Card Narcolepsy 57e648.yaml new file mode 100644 index 000000000..0b8ce83ee --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Narcolepsy 57e648.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438127 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 57e648 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Narcolepsy +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Narrow Escape f6ff32.yaml b/unpacked/Bag All Player Cards 15bb07/Card Narrow Escape f6ff32.yaml new file mode 100644 index 000000000..8940c499d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Narrow Escape f6ff32.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368708 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f6ff32 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Narrow Escape +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nautical Prowess 9d6e9a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nautical Prowess 9d6e9a.yaml new file mode 100644 index 000000000..0dac077c5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Nautical Prowess 9d6e9a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 444348 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4443': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9d6e9a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Nautical Prowess +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Neither Rain nor Snow 6da7c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Neither Rain nor Snow 6da7c4.yaml new file mode 100644 index 000000000..7debb40eb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Neither Rain nor Snow 6da7c4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550800 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6da7c4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Neither Rain nor Snow +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Newspaper (2) 9bcdee.yaml b/unpacked/Bag All Player Cards 15bb07/Card Newspaper (2) 9bcdee.yaml new file mode 100644 index 000000000..cb7ff2363 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Newspaper (2) 9bcdee.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368847 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9bcdee +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Newspaper (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Newspaper ee20c9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Newspaper ee20c9.yaml new file mode 100644 index 000000000..08b01a685 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Newspaper ee20c9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368826 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ee20c9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Newspaper +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nightmare Bauble (3) d6f6f1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nightmare Bauble (3) d6f6f1.yaml new file mode 100644 index 000000000..67f34743f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Nightmare Bauble (3) d6f6f1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448735 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4487': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d6f6f1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Nightmare Bauble (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nihilism fc4168.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nihilism fc4168.yaml new file mode 100644 index 000000000..73df4e2b7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Nihilism fc4168.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538702 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: fc4168 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Nihilism +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nimble b8843c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nimble b8843c.yaml new file mode 100644 index 000000000..7267574d6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Nimble b8843c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538615 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b8843c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Nimble +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card No Sense of Space or Time 1e6cae.yaml b/unpacked/Bag All Player Cards 15bb07/Card No Sense of Space or Time 1e6cae.yaml new file mode 100644 index 000000000..94154e8ff --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card No Sense of Space or Time 1e6cae.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551507 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5515': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 1e6cae +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: No Sense of Space or Time +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned (5) 1f3f16.yaml b/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned (5) 1f3f16.yaml new file mode 100644 index 000000000..5b9f8d479 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned (5) 1f3f16.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430658 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1f3f16 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: No Stone Unturned (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned 44cf4a.yaml b/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned 44cf4a.yaml new file mode 100644 index 000000000..25ac39c01 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned 44cf4a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368415 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 44cf4a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: No Stone Unturned +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Not without a fight! d1d7fa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Not without a fight! d1d7fa.yaml new file mode 100644 index 000000000..ccee8243b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Not without a fight! d1d7fa.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368803 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d1d7fa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Not without a fight!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nothing Left to Lose (3) f0389b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nothing Left to Lose (3) f0389b.yaml new file mode 100644 index 000000000..3fa63abe5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Nothing Left to Lose (3) f0389b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448738 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4487': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f0389b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Nothing Left to Lose (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Obfuscation 5ec6d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Obfuscation 5ec6d0.yaml new file mode 100644 index 000000000..ccd88f996 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Obfuscation 5ec6d0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266321 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5ec6d0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Obfuscation +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Obscure Studies c5d8a9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Obscure Studies c5d8a9.yaml new file mode 100644 index 000000000..dbabbc033 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Obscure Studies c5d8a9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266302 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c5d8a9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Obscure Studies +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Obsessive a2e7d7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Obsessive a2e7d7.yaml new file mode 100644 index 000000000..569df2e02 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Obsessive a2e7d7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538802 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: a2e7d7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Obsessive +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Occult Evidence 3586e6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Occult Evidence 3586e6.yaml new file mode 100644 index 000000000..18f130b8d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Occult Evidence 3586e6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274002 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3586e6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Occult Evidence +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Occult Invocation 010509.yaml b/unpacked/Bag All Player Cards 15bb07/Card Occult Invocation 010509.yaml new file mode 100644 index 000000000..35a252c32 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Occult Invocation 010509.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538815 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 010509 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Occult Invocation +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon 5d6728.yaml b/unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon 5d6728.yaml new file mode 100644 index 000000000..f5ded8169 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon 5d6728.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379020 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3790': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5d6728 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Occult Lexicon +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Occult Scraps 6aea76.yaml b/unpacked/Bag All Player Cards 15bb07/Card Occult Scraps 6aea76.yaml new file mode 100644 index 000000000..ae684f9ba --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Occult Scraps 6aea76.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266307 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 6aea76 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Occult Scraps +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Offer You Cannot Refuse e27c93.yaml b/unpacked/Bag All Player Cards 15bb07/Card Offer You Cannot Refuse e27c93.yaml new file mode 100644 index 000000000..c4dc67d23 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Offer You Cannot Refuse e27c93.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545212 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: e27c93 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Offer You Cannot Refuse +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore (3) 8a0060.yaml b/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore (3) 8a0060.yaml new file mode 100644 index 000000000..fcac97765 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore (3) 8a0060.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448837 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4488': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8a0060 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Old Book of Lore (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore 063fd8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore 063fd8.yaml new file mode 100644 index 000000000..99dcba086 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore 063fd8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368431 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 063fd8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Old Book of Lore +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Old Hunting Rifle (3) 44a37f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Old Hunting Rifle (3) 44a37f.yaml new file mode 100644 index 000000000..0e26fb679 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Old Hunting Rifle (3) 44a37f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 314800 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3148': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 44a37f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Old Hunting Rifle (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Old Keyring 5888da.yaml b/unpacked/Bag All Player Cards 15bb07/Card Old Keyring 5888da.yaml new file mode 100644 index 000000000..1090bb0af --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Old Keyring 5888da.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550805 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5888da +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Old Keyring +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Old Shoe 87f6b9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Old Shoe 87f6b9.yaml new file mode 100644 index 000000000..5771c66bd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Old Shoe 87f6b9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551714 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5517': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 87f6b9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Old Shoe +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Olive McBride 9683d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Olive McBride 9683d0.yaml new file mode 100644 index 000000000..ad4c0fb90 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Olive McBride 9683d0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230321 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Will Try Anything Once +DragSelectable: true +GMNotes: '' +GUID: 9683d0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Olive McBride +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) 2ebdf1.yaml b/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) 2ebdf1.yaml new file mode 100644 index 000000000..ee39eee6c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) 2ebdf1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545209 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Permanent +DragSelectable: true +GMNotes: '' +GUID: 2ebdf1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: On Your Own (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) b0c61c.yaml b/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) b0c61c.yaml new file mode 100644 index 000000000..e61823046 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) b0c61c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368858 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b0c61c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: On Your Own (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card On the Hunt a13ca4.yaml b/unpacked/Bag All Player Cards 15bb07/Card On the Hunt a13ca4.yaml new file mode 100644 index 000000000..f2055e8bc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card On the Hunt a13ca4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226314 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a13ca4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: On the Hunt +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card On the Lam f7095f.yaml b/unpacked/Bag All Player Cards 15bb07/Card On the Lam f7095f.yaml new file mode 100644 index 000000000..6722b0df7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card On the Lam f7095f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 369424 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3694': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Signature +DragSelectable: true +GMNotes: '' +GUID: f7095f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: On the Lam +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 76.49 + posY: 30.61 + posZ: -3.49 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch (5) 8ffa44.yaml b/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch (5) 8ffa44.yaml new file mode 100644 index 000000000..8d09e2669 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch (5) 8ffa44.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545330 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8ffa44 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: One-Two Punch (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch 22bb1e.yaml b/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch 22bb1e.yaml new file mode 100644 index 000000000..5d72952a9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch 22bb1e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545315 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 22bb1e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: One-Two Punch +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Oops! (2) 70772b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Oops! (2) 70772b.yaml new file mode 100644 index 000000000..a75848061 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Oops! (2) 70772b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 314905 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3149': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 70772b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Oops! (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Oops! 59d89b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Oops! 59d89b.yaml new file mode 100644 index 000000000..353e242db --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Oops! 59d89b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368815 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 59d89b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Oops! +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Open Gate a33acd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Open Gate a33acd.yaml new file mode 100644 index 000000000..7c2b7b940 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Open Gate a33acd.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 444024 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4440': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a33acd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Open Gate +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Opportunist (2) 63f145.yaml b/unpacked/Bag All Player Cards 15bb07/Card Opportunist (2) 63f145.yaml new file mode 100644 index 000000000..06a6cc196 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Opportunist (2) 63f145.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315241 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 63f145 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Opportunist (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Opportunist a88392.yaml b/unpacked/Bag All Player Cards 15bb07/Card Opportunist a88392.yaml new file mode 100644 index 000000000..b22452055 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Opportunist a88392.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 261702 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2617': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a88392 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Opportunist +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ornate Bow (3) 2acced.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ornate Bow (3) 2acced.yaml new file mode 100644 index 000000000..66b3cfde7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ornate Bow (3) 2acced.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368528 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2acced +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ornate Bow (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Otherworld Codex (2) df0e22.yaml b/unpacked/Bag All Player Cards 15bb07/Card Otherworld Codex (2) df0e22.yaml new file mode 100644 index 000000000..21bb9e69d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Otherworld Codex (2) df0e22.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379930 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3799': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: df0e22 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Otherworld Codex (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Otherworldly Compass (2) 19ab7c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Otherworldly Compass (2) 19ab7c.yaml new file mode 100644 index 000000000..70d94cd9f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Otherworldly Compass (2) 19ab7c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430647 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 19ab7c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Otherworldly Compass (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Out of Body Experience d64b8f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Out of Body Experience d64b8f.yaml new file mode 100644 index 000000000..b34ec54fe --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Out of Body Experience d64b8f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235822 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2358': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777501236/D145C8B748FB42258EB442B9DF36797851CEECC3/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Madness. Paradox. +DragSelectable: true +GMNotes: '' +GUID: d64b8f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Out of Body Experience +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Out of Doggie Treats 197242.yaml b/unpacked/Bag All Player Cards 15bb07/Card Out of Doggie Treats 197242.yaml new file mode 100644 index 000000000..060554168 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Out of Doggie Treats 197242.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551609 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5516': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: '197242' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Out of Doggie Treats +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Overpower (2) 017e1f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Overpower (2) 017e1f.yaml new file mode 100644 index 000000000..fae64daa1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Overpower (2) 017e1f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545324 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 017e1f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Overpower (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Overpower 5ab9f4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Overpower 5ab9f4.yaml new file mode 100644 index 000000000..058e6612f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Overpower 5ab9f4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368502 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5ab9f4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Overpower +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Overzealous 88a9b3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Overzealous 88a9b3.yaml new file mode 100644 index 000000000..dd2a3163c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Overzealous 88a9b3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431110 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4311': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 88a9b3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Overzealous +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Painkillers 0c859f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Painkillers 0c859f.yaml new file mode 100644 index 000000000..57fb85089 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Painkillers 0c859f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368513 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0c859f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Painkillers +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pantalone 7f1927.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pantalone 7f1927.yaml new file mode 100644 index 000000000..47d5566be --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pantalone 7f1927.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 295603 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2956': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7f1927 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pantalone +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 51.53 + posY: 3.99 + posZ: 0.85 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Paradoxical Covenant (2) 541ee9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Paradoxical Covenant (2) 541ee9.yaml new file mode 100644 index 000000000..21e694a87 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Paradoxical Covenant (2) 541ee9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553112 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 541ee9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Paradoxical Covenant (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.44 + rotX: 0.23 + rotY: 270.0 + rotZ: 358.97 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Parallel Fates 47bdba.yaml b/unpacked/Bag All Player Cards 15bb07/Card Parallel Fates 47bdba.yaml new file mode 100644 index 000000000..d2d223aef --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Parallel Fates 47bdba.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538713 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 47bdba +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Parallel Fates +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Paranoia c17498.yaml b/unpacked/Bag All Player Cards 15bb07/Card Paranoia c17498.yaml new file mode 100644 index 000000000..c2ff0d647 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Paranoia c17498.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527401 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5274': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: c17498 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Paranoia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) (Taboo) ecbea8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) (Taboo) ecbea8.yaml new file mode 100644 index 000000000..ec0b5a480 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) (Taboo) ecbea8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450602 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ecbea8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pathfinder (1) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) 7f99cc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) 7f99cc.yaml new file mode 100644 index 000000000..c14d83b84 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) 7f99cc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430641 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7f99cc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pathfinder (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Patrice's Violin ea0007.yaml b/unpacked/Bag All Player Cards 15bb07/Card Patrice's Violin ea0007.yaml new file mode 100644 index 000000000..26a286475 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Patrice's Violin ea0007.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274010 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: My Muse +DragSelectable: true +GMNotes: '' +GUID: ea0007 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Patrice's Violin +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pay Day (1) 9f0b34.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pay Day (1) 9f0b34.yaml new file mode 100644 index 000000000..fef12f519 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pay Day (1) 9f0b34.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315262 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9f0b34 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pay Day (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen 9b0dcf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen 9b0dcf.yaml new file mode 100644 index 000000000..68b586f0a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen 9b0dcf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 441027 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4410': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Of Nothing at All +DragSelectable: true +GMNotes: '' +GUID: 9b0dcf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pendant of the Queen +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Penny White 73bccf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Penny White 73bccf.yaml new file mode 100644 index 000000000..31aef2b24 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Penny White 73bccf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 312513 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3125': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Nightmare is Over +DragSelectable: true +GMNotes: '' +GUID: 73bccf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Penny White +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Perception (2) 96b5ed.yaml b/unpacked/Bag All Player Cards 15bb07/Card Perception (2) 96b5ed.yaml new file mode 100644 index 000000000..92ca175c5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Perception (2) 96b5ed.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538826 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 96b5ed +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Perception (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Perception c6ac19.yaml b/unpacked/Bag All Player Cards 15bb07/Card Perception c6ac19.yaml new file mode 100644 index 000000000..920d21fae --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Perception c6ac19.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368506 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c6ac19 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Perception +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Perseverance 0a390e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Perseverance 0a390e.yaml new file mode 100644 index 000000000..58ade344a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Perseverance 0a390e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368817 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0a390e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Perseverance +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Persuasion 1b0235.yaml b/unpacked/Bag All Player Cards 15bb07/Card Persuasion 1b0235.yaml new file mode 100644 index 000000000..f38c42d1d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Persuasion 1b0235.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368414 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1b0235 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Persuasion +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pet Oozeling 26398a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pet Oozeling 26398a.yaml new file mode 100644 index 000000000..f1f2f15dc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pet Oozeling 26398a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 233605 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2336': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 26398a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pet Oozeling +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre (2) e1e098.yaml b/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre (2) e1e098.yaml new file mode 100644 index 000000000..5c849aa47 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre (2) e1e098.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368852 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Big Man on Campus +DragSelectable: true +GMNotes: '' +GUID: e1e098 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Peter Sylvestre (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre ffdeb5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre ffdeb5.yaml new file mode 100644 index 000000000..ec0071e06 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre ffdeb5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368832 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Big Man on Campus +DragSelectable: true +GMNotes: '' +GUID: ffdeb5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Peter Sylvestre +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Physical Training (2) d708d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Physical Training (2) d708d9.yaml new file mode 100644 index 000000000..8b17871f5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Physical Training (2) d708d9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226343 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d708d9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Physical Training (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Physical Training (4) ab51ce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Physical Training (4) ab51ce.yaml new file mode 100644 index 000000000..0e6e85ca7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Physical Training (4) ab51ce.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545329 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ab51ce +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Physical Training (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Physical Training 1165db.yaml b/unpacked/Bag All Player Cards 15bb07/Card Physical Training 1165db.yaml new file mode 100644 index 000000000..a6a9088ab --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Physical Training 1165db.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226323 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1165db +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Physical Training +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing (2) 2f4db2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing (2) 2f4db2.yaml new file mode 100644 index 000000000..d70d0d2e2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing (2) 2f4db2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315246 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2f4db2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pickpocketing (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing da7c01.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing da7c01.yaml new file mode 100644 index 000000000..567a48ff0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing da7c01.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368625 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: da7c01 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pickpocketing +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pilfer (3) e503ce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pilfer (3) e503ce.yaml new file mode 100644 index 000000000..3378adac6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pilfer (3) e503ce.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538626 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e503ce +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pilfer (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pilfer cc9563.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pilfer cc9563.yaml new file mode 100644 index 000000000..3439ec69d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pilfer cc9563.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538613 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cc9563 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pilfer +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Plan of Action 96fd5d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Plan of Action 96fd5d.yaml new file mode 100644 index 000000000..667206ce7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Plan of Action 96fd5d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266318 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 96fd5d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Plan of Action +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Plucky (1) 86b9c5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Plucky (1) 86b9c5.yaml new file mode 100644 index 000000000..093fe2983 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Plucky (1) 86b9c5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368834 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 86b9c5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Plucky (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pnakotic Manuscripts (5) 344d98.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pnakotic Manuscripts (5) 344d98.yaml new file mode 100644 index 000000000..42690239f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pnakotic Manuscripts (5) 344d98.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 262204 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2622': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Mind-Expanding Ideas +DragSelectable: true +GMNotes: '' +GUID: 344d98 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pnakotic Manuscripts (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pocket Portal 1ab785.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pocket Portal 1ab785.yaml new file mode 100644 index 000000000..ccead3f23 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Pocket Portal 1ab785.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231724 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false +Description: Doorway to Another World +DragSelectable: true +GMNotes: '' +GUID: 1ab785 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Pocket Portal +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.27 + posY: 3.31 + posZ: -3.24 + rotX: 1.04 + rotY: 269.97 + rotZ: 357.4 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Poisoned 819f52.yaml b/unpacked/Bag All Player Cards 15bb07/Card Poisoned 819f52.yaml new file mode 100644 index 000000000..118f274fc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Poisoned 819f52.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235644 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2356': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Poision. +DragSelectable: true +GMNotes: '' +GUID: 819f52 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Poisoned +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Police Badge (2) da46e0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Police Badge (2) da46e0.yaml new file mode 100644 index 000000000..4c373505d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Police Badge (2) da46e0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226346 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: da46e0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Police Badge (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Powder of Ibn Ghazi f96ed0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Powder of Ibn Ghazi f96ed0.yaml new file mode 100644 index 000000000..3cc7fec93 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Powder of Ibn Ghazi f96ed0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232951 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2329': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Seeing Things Unseen +DragSelectable: true +GMNotes: '' +GUID: f96ed0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Powder of Ibn Ghazi +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Practice Makes Perfect 1ac667.yaml b/unpacked/Bag All Player Cards 15bb07/Card Practice Makes Perfect 1ac667.yaml new file mode 100644 index 000000000..84160ea4a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Practice Makes Perfect 1ac667.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447832 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4478': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1ac667 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Practice Makes Perfect +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Predestined ec7702.yaml b/unpacked/Bag All Player Cards 15bb07/Card Predestined ec7702.yaml new file mode 100644 index 000000000..24634a1a7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Predestined ec7702.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266329 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ec7702 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Predestined +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Premonition e470cd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Premonition e470cd.yaml new file mode 100644 index 000000000..232f901a8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Premonition e470cd.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 276300 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2763': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e470cd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Premonition +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst 831b6b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst 831b6b.yaml new file mode 100644 index 000000000..fb4538b5d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst 831b6b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226310 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 831b6b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Prepared for the Worst +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches (2) 5e32a5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches (2) 5e32a5.yaml new file mode 100644 index 000000000..51d98f7e4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches (2) 5e32a5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 313906 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3139': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5e32a5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Preposterous Sketches (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches 60b353.yaml b/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches 60b353.yaml new file mode 100644 index 000000000..5a5bdea93 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches 60b353.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368416 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 60b353 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Preposterous Sketches +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Prescient 7e7873.yaml b/unpacked/Bag All Player Cards 15bb07/Card Prescient 7e7873.yaml new file mode 100644 index 000000000..2ec7a97f0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Prescient 7e7873.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538717 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7e7873 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Prescient +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Priest of Two Faiths (1) 48e4a3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Priest of Two Faiths (1) 48e4a3.yaml new file mode 100644 index 000000000..0162990fb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Priest of Two Faiths (1) 48e4a3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232104 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 48e4a3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Priest of Two Faiths (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 79.11 + posY: 3.28 + posZ: -3.98 + rotX: 357.96 + rotY: 269.93 + rotZ: 3.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Professor Warren Rice 42806b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Professor Warren Rice 42806b.yaml new file mode 100644 index 000000000..dd7a873d9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Professor Warren Rice 42806b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232904 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2329': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Professor of Languages +DragSelectable: true +GMNotes: '' +GUID: 42806b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Professor Warren Rice +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Promise of Power d8b64b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Promise of Power d8b64b.yaml new file mode 100644 index 000000000..bfe346b13 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Promise of Power d8b64b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266326 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d8b64b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Promise of Power +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Prophesy 493b03.yaml b/unpacked/Bag All Player Cards 15bb07/Card Prophesy 493b03.yaml new file mode 100644 index 000000000..c5291c460 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Prophesy 493b03.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430906 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4309': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 493b03 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Prophesy +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 599209.yaml b/unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 599209.yaml new file mode 100644 index 000000000..1033bb7cb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 599209.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230333 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '599209' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Protective Incantation (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Psychosis d83baf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Psychosis d83baf.yaml new file mode 100644 index 000000000..eb41820e9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Psychosis d83baf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527403 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5274': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: d83baf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Psychosis +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Puzzle Box 44334c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Puzzle Box 44334c.yaml new file mode 100644 index 000000000..d5449bf43 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Puzzle Box 44334c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 312510 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3125': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Mysterious Device +DragSelectable: true +GMNotes: '' +GUID: 44334c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Puzzle Box +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quantum Flux edd34a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quantum Flux edd34a.yaml new file mode 100644 index 000000000..46cac8843 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Quantum Flux edd34a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230307 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: edd34a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Quantum Flux +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quick Learner (4) 3bbc0b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quick Learner (4) 3bbc0b.yaml new file mode 100644 index 000000000..a7581de37 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Quick Learner (4) 3bbc0b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550828 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3bbc0b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Quick Learner (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quick Study (2) 092e92.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quick Study (2) 092e92.yaml new file mode 100644 index 000000000..8a3534590 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Quick Study (2) 092e92.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430645 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 092e92 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Quick Study (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking (Taboo) 308967.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking (Taboo) 308967.yaml new file mode 100644 index 000000000..e3c8ccfba --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking (Taboo) 308967.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450616 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '308967' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Quick Thinking (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking 99989c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking 99989c.yaml new file mode 100644 index 000000000..3c4612312 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking 99989c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 261703 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2617': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 99989c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Quick Thinking +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot (3) 3f91af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot (3) 3f91af.yaml new file mode 100644 index 000000000..cec60b4ea --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot (3) 3f91af.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368855 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3f91af +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rabbit's Foot (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot f34090.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot f34090.yaml new file mode 100644 index 000000000..caad4af86 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot f34090.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368823 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f34090 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rabbit's Foot +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Randall Cho 1bfb78.yaml b/unpacked/Bag All Player Cards 15bb07/Card Randall Cho 1bfb78.yaml new file mode 100644 index 000000000..98f802a8a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Randall Cho 1bfb78.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545300 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Concerned Brother +DragSelectable: true +GMNotes: '' +GUID: 1bfb78 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Randall Cho +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter b04c8e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter b04c8e.yaml new file mode 100644 index 000000000..147718e18 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter b04c8e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 452300 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4523': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Expert Dreamer +DragSelectable: true +GMNotes: '' +GUID: b04c8e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Randolph Carter +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter d253a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter d253a6.yaml new file mode 100644 index 000000000..b5366673a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter d253a6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 452504 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4525': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Chained to the Waking World +DragSelectable: true +GMNotes: '' +GUID: d253a6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Randolph Carter +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rational Thought 1c7a00.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rational Thought 1c7a00.yaml new file mode 100644 index 000000000..40aab1405 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rational Thought 1c7a00.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379154 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3791': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1c7a00 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rational Thought +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Read the Signs 75eca5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Read the Signs 75eca5.yaml new file mode 100644 index 000000000..c1ce06e2b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Read the Signs 75eca5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380126 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3801': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 75eca5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Read the Signs +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Recall the Future (2) a06aa7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Recall the Future (2) a06aa7.yaml new file mode 100644 index 000000000..be2e270b4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Recall the Future (2) a06aa7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230344 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a06aa7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Recall the Future (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Recharge (2) e27b3c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Recharge (2) e27b3c.yaml new file mode 100644 index 000000000..1dd440599 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Recharge (2) e27b3c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230339 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e27b3c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Recharge (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Recharge (4) 591789.yaml b/unpacked/Bag All Player Cards 15bb07/Card Recharge (4) 591789.yaml new file mode 100644 index 000000000..9604ce911 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Recharge (4) 591789.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538727 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '591789' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Recharge (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Reckless Assault 3ff641.yaml b/unpacked/Bag All Player Cards 15bb07/Card Reckless Assault 3ff641.yaml new file mode 100644 index 000000000..1860649a4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Reckless Assault 3ff641.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368503 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3ff641 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Reckless Assault +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Reckless c45e67.yaml b/unpacked/Bag All Player Cards 15bb07/Card Reckless c45e67.yaml new file mode 100644 index 000000000..7e1a0e60c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Reckless c45e67.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538602 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: c45e67 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Reckless +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.72 + posY: 3.69 + posZ: -65.28 + rotX: 0.23 + rotY: 270.0 + rotZ: 359.14 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relentless af3efd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relentless af3efd.yaml new file mode 100644 index 000000000..87d29ec6a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Relentless af3efd.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545307 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: af3efd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Relentless +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Reliable (1) 102fad.yaml b/unpacked/Bag All Player Cards 15bb07/Card Reliable (1) 102fad.yaml new file mode 100644 index 000000000..f3faf317a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Reliable (1) 102fad.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226336 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 102fad +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Reliable (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relic Hunter (3) 3c959c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relic Hunter (3) 3c959c.yaml new file mode 100644 index 000000000..a39a9f44f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Relic Hunter (3) 3c959c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368523 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3c959c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Relic Hunter (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 35bc58.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 35bc58.yaml new file mode 100644 index 000000000..9ecca802f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 35bc58.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235857 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2358': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777501236/D145C8B748FB42258EB442B9DF36797851CEECC3/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Unleash the Timestream +DragSelectable: true +GMNotes: '' +GUID: 35bc58 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Relic of Ages +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 7667ef.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 7667ef.yaml new file mode 100644 index 000000000..6686c68e2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 7667ef.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235667 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2356': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Forestalling the Future +DragSelectable: true +GMNotes: '' +GUID: 7667ef +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Relic of Ages +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 87718c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 87718c.yaml new file mode 100644 index 000000000..e485d5687 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 87718c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235840 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2358': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777501236/D145C8B748FB42258EB442B9DF36797851CEECC3/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Repossess the Past +DragSelectable: true +GMNotes: '' +GUID: 87718c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Relic of Ages +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages e27a30.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages e27a30.yaml new file mode 100644 index 000000000..82f26a016 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages e27a30.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235603 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2356': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: "\u2026A Device, of Some Sort" +DragSelectable: true +GMNotes: '' +GUID: e27a30 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Relic of Ages +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Research Librarian 8f91ce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Research Librarian 8f91ce.yaml new file mode 100644 index 000000000..9777c120b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Research Librarian 8f91ce.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368426 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8f91ce +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Research Librarian +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Resourceful 334f03.yaml b/unpacked/Bag All Player Cards 15bb07/Card Resourceful 334f03.yaml new file mode 100644 index 000000000..b78d9e6fc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Resourceful 334f03.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368802 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 334f03 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Resourceful +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rex's Curse 033a35.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rex's Curse 033a35.yaml new file mode 100644 index 000000000..1e26c98f8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rex's Curse 033a35.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 371907 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3719': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 033a35 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rex's Curse +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Righteous Hunt (1) 491c09.yaml b/unpacked/Bag All Player Cards 15bb07/Card Righteous Hunt (1) 491c09.yaml new file mode 100644 index 000000000..7a1916063 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Righteous Hunt (1) 491c09.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553101 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 491c09 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Righteous Hunt (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.46 + rotX: 0.24 + rotY: 270.0 + rotZ: 359.03 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Riot Whistle 55fc3d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Riot Whistle 55fc3d.yaml new file mode 100644 index 000000000..f25bb4d5c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Riot Whistle 55fc3d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 55fc3d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Riot Whistle +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.44 + rotX: 0.23 + rotY: 270.0 + rotZ: 358.97 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion (3) bb501b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion (3) bb501b.yaml new file mode 100644 index 000000000..a85470b36 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion (3) bb501b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 314904 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3149': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bb501b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rise to the Occasion (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion 358387.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion 358387.yaml new file mode 100644 index 000000000..0e6f409f6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion 358387.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368801 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '358387' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rise to the Occasion +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 88865b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 88865b.yaml new file mode 100644 index 000000000..bd052174d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 88865b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266313 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 88865b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rite of Sanctification +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (2) 4f2668.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (2) 4f2668.yaml new file mode 100644 index 000000000..aa4b9cb78 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (2) 4f2668.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 313604 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3136': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4f2668 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rite of Seeking (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (4) 194adb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (4) 194adb.yaml new file mode 100644 index 000000000..9d4c48982 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (4) 194adb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230358 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 194adb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rite of Seeking (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking 29b842.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking 29b842.yaml new file mode 100644 index 000000000..6c196844f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking 29b842.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230329 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 29b842 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rite of Seeking +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ritual Candles 0a4db3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ritual Candles 0a4db3.yaml new file mode 100644 index 000000000..8176b20f0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ritual Candles 0a4db3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230317 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0a4db3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ritual Candles +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night (2) ef43db.yaml b/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night (2) ef43db.yaml new file mode 100644 index 000000000..2f3c8be1e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night (2) ef43db.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538720 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ef43db +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Robes of Endless Night (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night d9292f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night d9292f.yaml new file mode 100644 index 000000000..d9e9fe590 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night d9292f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538710 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d9292f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Robes of Endless Night +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special 49a91e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special 49a91e.yaml new file mode 100644 index 000000000..1cc150e91 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special 49a91e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 552220 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5522': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 49a91e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Roland's .38 Special +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rookie Mistake e567ff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rookie Mistake e567ff.yaml new file mode 100644 index 000000000..54731e6bf --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rookie Mistake e567ff.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274001 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e567ff +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rookie Mistake +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Run For Your Life 0f32e8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Run For Your Life 0f32e8.yaml new file mode 100644 index 000000000..191e01366 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Run For Your Life 0f32e8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368505 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0f32e8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Run For Your Life +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sacred Covenant (2) 87226d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sacred Covenant (2) 87226d.yaml new file mode 100644 index 000000000..aafd6f24a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sacred Covenant (2) 87226d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553102 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 87226d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sacred Covenant (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.46 + rotX: 0.24 + rotY: 270.0 + rotZ: 359.03 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sacrifice (1) f2877e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sacrifice (1) f2877e.yaml new file mode 100644 index 000000000..0b5f29b6a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sacrifice (1) f2877e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230362 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f2877e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sacrifice (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sacrificial Beast 46812e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sacrificial Beast 46812e.yaml new file mode 100644 index 000000000..509177500 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sacrificial Beast 46812e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 371466 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3714': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 46812e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sacrificial Beast +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Safeguard (2) 7dc42a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Safeguard (2) 7dc42a.yaml new file mode 100644 index 000000000..840a5303e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Safeguard (2) 7dc42a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447933 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4479': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7dc42a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Safeguard (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Safeguard 8d6ae6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Safeguard 8d6ae6.yaml new file mode 100644 index 000000000..7a4dd0eea --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Safeguard 8d6ae6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545308 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8d6ae6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Safeguard +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sawed-Off Shotgun (5) 4f5f0f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sawed-Off Shotgun (5) 4f5f0f.yaml new file mode 100644 index 000000000..b98a75a37 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sawed-Off Shotgun (5) 4f5f0f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 449037 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4490': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4f5f0f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sawed-Off Shotgun (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Say Your Prayers 5c3dd0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Say Your Prayers 5c3dd0.yaml new file mode 100644 index 000000000..88184da38 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Say Your Prayers 5c3dd0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368501 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5c3dd0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Say Your Prayers +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scavenging (2) ff4aea.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scavenging (2) ff4aea.yaml new file mode 100644 index 000000000..905c17617 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scavenging (2) ff4aea.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448737 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4487': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ff4aea +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scavenging (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scavenging 1b76c9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scavenging 1b76c9.yaml new file mode 100644 index 000000000..18fe12622 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scavenging 1b76c9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368822 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1b76c9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scavenging +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scene of the Crime ab37af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scene of the Crime ab37af.yaml new file mode 100644 index 000000000..d4136c504 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scene of the Crime ab37af.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226318 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ab37af +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scene of the Crime +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (1) 3a0df6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (1) 3a0df6.yaml new file mode 100644 index 000000000..9b93fd505 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (1) 3a0df6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430638 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3a0df6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scientific Theory (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) (Taboo) fcffa3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) (Taboo) fcffa3.yaml new file mode 100644 index 000000000..dbb99517c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) (Taboo) fcffa3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450606 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fcffa3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scrapper (3) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) dffe4a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) dffe4a.yaml new file mode 100644 index 000000000..de79875b1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) dffe4a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368853 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dffe4a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scrapper (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrapper c8505c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrapper c8505c.yaml new file mode 100644 index 000000000..cb132b069 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrapper c8505c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550809 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c8505c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scrapper +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Prophecies 0d926f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Prophecies 0d926f.yaml new file mode 100644 index 000000000..5b8bffed6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Prophecies 0d926f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380125 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3801': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0d926f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scroll of Prophecies +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 5839e4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 5839e4.yaml new file mode 100644 index 000000000..936cc4c04 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 5839e4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450623 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Mystic +DragSelectable: true +GMNotes: '' +GUID: 5839e4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scroll of Secrets (3) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) a2136a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) a2136a.yaml new file mode 100644 index 000000000..3c9d214d3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) a2136a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450622 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Seeker +DragSelectable: true +GMNotes: '' +GUID: a2136a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scroll of Secrets (3) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.yaml new file mode 100644 index 000000000..e713d6399 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 293214 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2932': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Seeker +DragSelectable: true +GMNotes: '' +GUID: 0b12ac +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scroll of Secrets (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.yaml new file mode 100644 index 000000000..8661192b7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 293315 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2933': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Mystic +DragSelectable: true +GMNotes: '' +GUID: 194d88 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scroll of Secrets (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) 19b705.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) 19b705.yaml new file mode 100644 index 000000000..bd03428ba --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) 19b705.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450621 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 19b705 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scroll of Secrets (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.yaml new file mode 100644 index 000000000..eceedd1d5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277604 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2776': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '230835' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scroll of Secrets +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrounge for Supplies 7651f3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrounge for Supplies 7651f3.yaml new file mode 100644 index 000000000..0ab342989 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrounge for Supplies 7651f3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380229 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3802': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7651f3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scrounge for Supplies +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrying (3) e58d2a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrying (3) e58d2a.yaml new file mode 100644 index 000000000..6c05cda72 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrying (3) e58d2a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230350 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e58d2a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scrying (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrying 8a927c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrying 8a927c.yaml new file mode 100644 index 000000000..a88340d07 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrying 8a927c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230319 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8a927c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scrying +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrying Mirror 6446d1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrying Mirror 6446d1.yaml new file mode 100644 index 000000000..cdca6852b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrying Mirror 6446d1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538704 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6446d1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scrying Mirror +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sea Change Harpoon 4e405d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sea Change Harpoon 4e405d.yaml new file mode 100644 index 000000000..0f308d363 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sea Change Harpoon 4e405d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266308 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4e405d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sea Change Harpoon +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Seal of the Elder Sign (5) 91e890.yaml b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Elder Sign (5) 91e890.yaml new file mode 100644 index 000000000..309de9059 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Elder Sign (5) 91e890.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230359 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 91e890 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Seal of the Elder Sign (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 05da68.yaml b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 05da68.yaml new file mode 100644 index 000000000..2f0b2c43b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 05da68.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 313501 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3135': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Over the Threshold and Beyond +DragSelectable: true +GMNotes: '' +GUID: 05da68 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Seal of the Seventh Sign (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Search for the Truth 4156cf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Search for the Truth 4156cf.yaml new file mode 100644 index 000000000..3173daa5b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Search for the Truth 4156cf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 371806 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3718': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4156cf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Search for the Truth +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Searching for Izzie cd94e3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Searching for Izzie cd94e3.yaml new file mode 100644 index 000000000..1db710784 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Searching for Izzie cd94e3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 371209 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3712': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cd94e3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Searching for Izzie +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Second Wind baef55.yaml b/unpacked/Bag All Player Cards 15bb07/Card Second Wind baef55.yaml new file mode 100644 index 000000000..8075df8de --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Second Wind baef55.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226316 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: baef55 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Second Wind +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers (2) c1365d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers (2) c1365d.yaml new file mode 100644 index 000000000..2c86ca2f5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers (2) c1365d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538825 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c1365d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Seeking Answers (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers f69e10.yaml b/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers f69e10.yaml new file mode 100644 index 000000000..81cc0f7e6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers f69e10.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368407 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f69e10 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Seeking Answers +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) (Taboo) 922d4c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) (Taboo) 922d4c.yaml new file mode 100644 index 000000000..598fa188e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) (Taboo) 922d4c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450612 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 922d4c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Segment of Onyx (1) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) ff9f23.yaml b/unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) ff9f23.yaml new file mode 100644 index 000000000..7779bd943 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) ff9f23.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 441026 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4410': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ff9f23 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Segment of Onyx (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Self-Centered eff3c8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Self-Centered eff3c8.yaml new file mode 100644 index 000000000..7476c377c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Self-Centered eff3c8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438125 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: eff3c8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Self-Centered +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Self-Destructive 2204cc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Self-Destructive 2204cc.yaml new file mode 100644 index 000000000..537799924 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Self-Destructive 2204cc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545302 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 2204cc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Self-Destructive +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Self-Sacrifice 5e808d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Self-Sacrifice 5e808d.yaml new file mode 100644 index 000000000..a71573f1d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Self-Sacrifice 5e808d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379831 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3798': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5e808d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Self-Sacrifice +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sell Your Soul 180b5b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sell Your Soul 180b5b.yaml new file mode 100644 index 000000000..2eabb1df7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sell Your Soul 180b5b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545214 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 180b5b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sell Your Soul +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sergeant Monroe 5630c2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sergeant Monroe 5630c2.yaml new file mode 100644 index 000000000..7d275136b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sergeant Monroe 5630c2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 534902 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5349': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/778493212055041441/90F035BD69A7C5C6B6F43426DDDA3A09DFCBCBDF/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Two Days Until Retirement +DragSelectable: true +GMNotes: '' +GUID: 5630c2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sergeant Monroe +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 14c396.yaml b/unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 14c396.yaml new file mode 100644 index 000000000..05914b821 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 14c396.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 377537 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3775': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 14c396 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Serpents of Yig +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shadow Agents 9be144.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shadow Agents 9be144.yaml new file mode 100644 index 000000000..bd8ce86ad --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shadow Agents 9be144.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266305 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 9be144 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shadow Agents +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b94d12.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b94d12.yaml new file mode 100644 index 000000000..972c757cd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b94d12.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 313502 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3135': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b94d12 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shards of the Void (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sharp Vision (1) 4d9a97.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sharp Vision (1) 4d9a97.yaml new file mode 100644 index 000000000..26ed23ed5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sharp Vision (1) 4d9a97.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447732 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4477': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4d9a97 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sharp Vision (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) 7f27d6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) 7f27d6.yaml new file mode 100644 index 000000000..2641fd295 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) 7f27d6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538625 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7f27d6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sharpshooter (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shell Shock bcf406.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shell Shock bcf406.yaml new file mode 100644 index 000000000..ff0265df4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shell Shock bcf406.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431731 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bcf406 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shell Shock +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shining Trapezohedron (4) b4b991.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shining Trapezohedron (4) b4b991.yaml new file mode 100644 index 000000000..085968f95 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shining Trapezohedron (4) b4b991.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527238 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5272': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b4b991 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shining Trapezohedron (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shocking Discovery f4dd3d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shocking Discovery f4dd3d.yaml new file mode 100644 index 000000000..613d1d6a2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shocking Discovery f4dd3d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274003 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f4dd3d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shocking Discovery +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shortcut (2) 9bd7cf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shortcut (2) 9bd7cf.yaml new file mode 100644 index 000000000..51c9091d3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shortcut (2) 9bd7cf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430643 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9bd7cf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shortcut (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shortcut d4fd4a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shortcut d4fd4a.yaml new file mode 100644 index 000000000..ee22dc5ba --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shortcut d4fd4a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368405 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d4fd4a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shortcut +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shotgun (4) c92ea3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shotgun (4) c92ea3.yaml new file mode 100644 index 000000000..449d66400 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shotgun (4) c92ea3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226357 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c92ea3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shotgun (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Showmanship ad63bc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Showmanship ad63bc.yaml new file mode 100644 index 000000000..673164c29 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Showmanship ad63bc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266306 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ad63bc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Showmanship +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shrewd Analysis 658d38.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shrewd Analysis 658d38.yaml new file mode 100644 index 000000000..4a204f99c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shrewd Analysis 658d38.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368419 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 658d38 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shrewd Analysis +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (3) b3ce16.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (3) b3ce16.yaml new file mode 100644 index 000000000..542873f34 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (3) b3ce16.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230355 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b3ce16 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shrivelling (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (5) 7a33b2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (5) 7a33b2.yaml new file mode 100644 index 000000000..d8efe8572 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (5) 7a33b2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230361 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7a33b2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shrivelling (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shrivelling 914053.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling 914053.yaml new file mode 100644 index 000000000..c1a1d8d84 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling 914053.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230328 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '914053' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shrivelling +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows a565d5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows a565d5.yaml new file mode 100644 index 000000000..305ace449 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows a565d5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553111 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a565d5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Shroud of Shadows +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.44 + rotX: 0.23 + rotY: 270.0 + rotZ: 358.97 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sign Magick 05d263.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sign Magick 05d263.yaml new file mode 100644 index 000000000..88a253569 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sign Magick 05d263.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277510 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2775': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 05d263 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sign Magick +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Silas's Net 4f11a2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Silas's Net 4f11a2.yaml new file mode 100644 index 000000000..f60de7c2d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Silas's Net 4f11a2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266309 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4f11a2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Silas's Net +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Silver Twilight Acolyte 16a89d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Silver Twilight Acolyte 16a89d.yaml new file mode 100644 index 000000000..7016f64c6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Silver Twilight Acolyte 16a89d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527417 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5274': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Enemy +DragSelectable: true +GMNotes: '' +GUID: 16a89d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Silver Twilight Acolyte +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Siren Call b9fbff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Siren Call b9fbff.yaml new file mode 100644 index 000000000..4e387b83b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Siren Call b9fbff.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266310 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: b9fbff +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Siren Call +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense (4) 060943.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense (4) 060943.yaml new file mode 100644 index 000000000..2068b2804 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense (4) 060943.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379618 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3796': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 060943 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sixth Sense (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense 6eceef.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense 6eceef.yaml new file mode 100644 index 000000000..db5eeb453 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense 6eceef.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277512 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2775': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6eceef +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sixth Sense +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand (Taboo) 5a51d1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand (Taboo) 5a51d1.yaml new file mode 100644 index 000000000..85e57833a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand (Taboo) 5a51d1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450618 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5a51d1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sleight of Hand (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand 819aee.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand 819aee.yaml new file mode 100644 index 000000000..7b555572d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand 819aee.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368710 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 819aee +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sleight of Hand +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Slip Away (2) 4a45c6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Slip Away (2) 4a45c6.yaml new file mode 100644 index 000000000..38080775c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Slip Away (2) 4a45c6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538622 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4a45c6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Slip Away (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Slip Away cf1d4e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Slip Away cf1d4e.yaml new file mode 100644 index 000000000..247a374fa --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Slip Away cf1d4e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368714 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cf1d4e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Slip Away +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Small Favor bf5a5f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Small Favor bf5a5f.yaml new file mode 100644 index 000000000..8a6152aaa --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Small Favor bf5a5f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378016 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3780': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bf5a5f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Small Favor +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked e68658.yaml b/unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked e68658.yaml new file mode 100644 index 000000000..733281293 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked e68658.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 371605 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3716': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e68658 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Smite the Wicked +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Smoking Pipe 603e29.yaml b/unpacked/Bag All Player Cards 15bb07/Card Smoking Pipe 603e29.yaml new file mode 100644 index 000000000..60fdff2ae --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Smoking Pipe 603e29.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368514 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 603e29 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Smoking Pipe +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Smuggled Goods 1f3880.yaml b/unpacked/Bag All Player Cards 15bb07/Card Smuggled Goods 1f3880.yaml new file mode 100644 index 000000000..bb9306ea2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Smuggled Goods 1f3880.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 376938 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3769': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1f3880 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Smuggled Goods +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Snare Trap (2) f66dd9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Snare Trap (2) f66dd9.yaml new file mode 100644 index 000000000..655bc0b6f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Snare Trap (2) f66dd9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368849 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f66dd9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Snare Trap (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack (2) 5f19e0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack (2) 5f19e0.yaml new file mode 100644 index 000000000..8b706fe9f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack (2) 5f19e0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315245 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5f19e0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sneak Attack (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack b18b33.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack b18b33.yaml new file mode 100644 index 000000000..cc9ba89de --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack b18b33.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368713 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b18b33 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sneak Attack +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sneak By d099f4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sneak By d099f4.yaml new file mode 100644 index 000000000..f569af54c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sneak By d099f4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538614 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d099f4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sneak By +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Solemn Vow ef7c11.yaml b/unpacked/Bag All Player Cards 15bb07/Card Solemn Vow ef7c11.yaml new file mode 100644 index 000000000..126eba1a1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Solemn Vow ef7c11.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440926 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4409': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ef7c11 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Solemn Vow +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Something Worth Fighting For a3f105.yaml b/unpacked/Bag All Player Cards 15bb07/Card Something Worth Fighting For a3f105.yaml new file mode 100644 index 000000000..6673209fe --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Something Worth Fighting For a3f105.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 278011 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2780': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a3f105 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Something Worth Fighting For +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Song of the Dead (2) 2ae3ce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Song of the Dead (2) 2ae3ce.yaml new file mode 100644 index 000000000..eaeabb8d6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Song of the Dead (2) 2ae3ce.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230345 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2ae3ce +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Song of the Dead (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Soothing Melody 53f076.yaml b/unpacked/Bag All Player Cards 15bb07/Card Soothing Melody 53f076.yaml new file mode 100644 index 000000000..e9d908789 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Soothing Melody 53f076.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378621 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 53f076 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Soothing Melody +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 79.59 + posY: 3.25 + posZ: -4.55 + rotX: 358.6 + rotY: 269.96 + rotZ: 2.56 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sophie f8c873.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sophie f8c873.yaml new file mode 100644 index 000000000..0fb70d364 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sophie f8c873.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374264 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3742': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/960860341956230050/FB390FF37A182334B982AA19488275BB5C6E2219/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f8c873 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sophie +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spectral Razor 8e8a14.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spectral Razor 8e8a14.yaml new file mode 100644 index 000000000..def427cf5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Spectral Razor 8e8a14.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448029 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4480': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8e8a14 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Spectral Razor +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spectral Web 863f1a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spectral Web 863f1a.yaml new file mode 100644 index 000000000..8860df83d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Spectral Web 863f1a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 275733 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2757': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/829135524526809828/AB799C8FFD9024655A9F179CCFF1EE30DE0D3C75/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Spell. +DragSelectable: true +GMNotes: '' +GUID: 863f1a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Spectral Web +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spiked Collar 6012db.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spiked Collar 6012db.yaml new file mode 100644 index 000000000..e3b089ed3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Spiked Collar 6012db.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 552110 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5521': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6012db +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Spiked Collar +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spirit Athame (1) 90a106.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spirit Athame (1) 90a106.yaml new file mode 100644 index 000000000..5ff0c0e5a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Spirit Athame (1) 90a106.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230335 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 90a106 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Spirit Athame (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spirit-Speaker a33470.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spirit-Speaker a33470.yaml new file mode 100644 index 000000000..ad53c2e72 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Spirit-Speaker a33470.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 375016 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3750': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a33470 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Spirit-Speaker +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spiritual Resolve (5) 26922c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spiritual Resolve (5) 26922c.yaml new file mode 100644 index 000000000..3ce82bb96 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Spiritual Resolve (5) 26922c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448938 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4489': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 26922c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Spiritual Resolve (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Split the Angle 67e006.yaml b/unpacked/Bag All Player Cards 15bb07/Card Split the Angle 67e006.yaml new file mode 100644 index 000000000..e025b16df --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Split the Angle 67e006.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 381050 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3810': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 67e006 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Split the Angle +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) (Taboo) a7da13.yaml b/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) (Taboo) a7da13.yaml new file mode 100644 index 000000000..6d9853534 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) (Taboo) a7da13.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450607 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a7da13 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Springfield M1903 (4) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) a7944d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) a7944d.yaml new file mode 100644 index 000000000..4c21d98b8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) a7944d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226356 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a7944d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Springfield M1903 (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card St. Hubert's Key 423d46.yaml b/unpacked/Bag All Player Cards 15bb07/Card St. Hubert's Key 423d46.yaml new file mode 100644 index 000000000..dca8de563 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card St. Hubert's Key 423d46.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230331 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Cleansing Fire +DragSelectable: true +GMNotes: '' +GUID: 423d46 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: St. Hubert's Key +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stand Together (3) cd7b97.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stand Together (3) cd7b97.yaml new file mode 100644 index 000000000..ce3bd1c5d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stand Together (3) cd7b97.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226352 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cd7b97 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stand Together (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stand Together 7ec473.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stand Together 7ec473.yaml new file mode 100644 index 000000000..fb0f1eaff --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stand Together 7ec473.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545316 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7ec473 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stand Together +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stargazing (1) 968a26.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stargazing (1) 968a26.yaml new file mode 100644 index 000000000..34fd3d65d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stargazing (1) 968a26.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 444022 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4440': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 968a26 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stargazing (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stars of Hyades 1890d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stars of Hyades 1890d0.yaml new file mode 100644 index 000000000..aa517a96c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stars of Hyades 1890d0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374115 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3741': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1890d0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stars of Hyades +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Steadfast 4e1d91.yaml b/unpacked/Bag All Player Cards 15bb07/Card Steadfast 4e1d91.yaml new file mode 100644 index 000000000..be63fd34f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Steadfast 4e1d91.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431006 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4310': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4e1d91 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Steadfast +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stealth (3) 26a3bf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stealth (3) 26a3bf.yaml new file mode 100644 index 000000000..68cee7b68 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stealth (3) 26a3bf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440720 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4407': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 26a3bf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stealth (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stealth ddee79.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stealth ddee79.yaml new file mode 100644 index 000000000..a77e260ac --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stealth ddee79.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368626 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ddee79 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stealth +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stick to the Plan (3) 82d62c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stick to the Plan (3) 82d62c.yaml new file mode 100644 index 000000000..b3217598f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stick to the Plan (3) 82d62c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226350 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 82d62c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stick to the Plan (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stirring Up Trouble (1) e99f0d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stirring Up Trouble (1) e99f0d.yaml new file mode 100644 index 000000000..fd48d3f95 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stirring Up Trouble (1) e99f0d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553104 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e99f0d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stirring Up Trouble (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.44 + rotX: 0.23 + rotY: 270.0 + rotZ: 358.97 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits (3) 1e9213.yaml b/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits (3) 1e9213.yaml new file mode 100644 index 000000000..666224029 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits (3) 1e9213.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 444021 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4440': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1e9213 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Storm of Spirits (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits 9c922f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits 9c922f.yaml new file mode 100644 index 000000000..92c951738 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits 9c922f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230314 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9c922f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Storm of Spirits +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 4874bc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 4874bc.yaml new file mode 100644 index 000000000..ad094eaf0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 4874bc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430656 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Restorative Concoction +DragSelectable: true +GMNotes: '' +GUID: 4874bc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Strange Solution (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 9afe23.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 9afe23.yaml new file mode 100644 index 000000000..a9e03f4cb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 9afe23.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430654 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Freezing Variant +DragSelectable: true +GMNotes: '' +GUID: 9afe23 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Strange Solution (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) d96e4b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) d96e4b.yaml new file mode 100644 index 000000000..e84c16290 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) d96e4b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 313905 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3139': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Empowering Elixir +DragSelectable: true +GMNotes: '' +GUID: d96e4b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Strange Solution (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) fa61ba.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) fa61ba.yaml new file mode 100644 index 000000000..db4107b10 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) fa61ba.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430655 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Acidic Ichor +DragSelectable: true +GMNotes: '' +GUID: fa61ba +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Strange Solution (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution 565b6b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution 565b6b.yaml new file mode 100644 index 000000000..93d5a03b2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution 565b6b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368422 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Unidentified +DragSelectable: true +GMNotes: '' +GUID: 565b6b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Strange Solution +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stray Cat f474b1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stray Cat f474b1.yaml new file mode 100644 index 000000000..b4d5c9770 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stray Cat f474b1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368824 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f474b1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stray Cat +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) (Taboo) 88a481.yaml b/unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) (Taboo) 88a481.yaml new file mode 100644 index 000000000..45dcc0a5e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) (Taboo) 88a481.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450605 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 88a481 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Streetwise (3) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) d7dbac.yaml b/unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) d7dbac.yaml new file mode 100644 index 000000000..0e8ba33c1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) d7dbac.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315251 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d7dbac +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Streetwise (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Streetwise a973aa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Streetwise a973aa.yaml new file mode 100644 index 000000000..a3fa20068 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Streetwise a973aa.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538609 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a973aa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Streetwise +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stroke of Luck (2) 06228f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stroke of Luck (2) 06228f.yaml new file mode 100644 index 000000000..acdfde614 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stroke of Luck (2) 06228f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368843 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 06228f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stroke of Luck (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stubborn Detective 4ea68b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stubborn Detective 4ea68b.yaml new file mode 100644 index 000000000..f8014f020 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stubborn Detective 4ea68b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527418 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5274': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Enemy +DragSelectable: true +GMNotes: '' +GUID: 4ea68b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stubborn Detective +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Studious (3) 4ea716.yaml b/unpacked/Bag All Player Cards 15bb07/Card Studious (3) 4ea716.yaml new file mode 100644 index 000000000..fa74a0955 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Studious (3) 4ea716.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379019 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3790': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4ea716 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Studious (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stunning Blow 58c435.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stunning Blow 58c435.yaml new file mode 100644 index 000000000..410b49a6e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stunning Blow 58c435.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368805 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 58c435 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stunning Blow +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Suggestion (1) 0ec9bf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Suggestion (1) 0ec9bf.yaml new file mode 100644 index 000000000..010cff2fe --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Suggestion (1) 0ec9bf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440721 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4407': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0ec9bf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Suggestion (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Suggestion (4) e7f37b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Suggestion (4) e7f37b.yaml new file mode 100644 index 000000000..3a944b36a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Suggestion (4) e7f37b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315259 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e7f37b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Suggestion (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Summoned Hound (1) ab4fb3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Summoned Hound (1) ab4fb3.yaml new file mode 100644 index 000000000..33c898568 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Summoned Hound (1) ab4fb3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527235 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5272': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ab4fb3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Summoned Hound (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Summoned Nightgaunt cf96b9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Summoned Nightgaunt cf96b9.yaml new file mode 100644 index 000000000..b40ed01ec --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Summoned Nightgaunt cf96b9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 546917 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5469': + BackIsHidden: true + BackURL: https://i.imgur.com/NSozoRe.jpg + FaceURL: https://i.imgur.com/HLQOkvy.jpg + NumHeight: 5 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Monster. Nightgaunt. Power. +DragSelectable: true +GMNotes: '' +GUID: cf96b9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Summoned Nightgaunt +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sure Gamble (3) 308be1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sure Gamble (3) 308be1.yaml new file mode 100644 index 000000000..4332c05cc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sure Gamble (3) 308be1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315254 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 308be1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sure Gamble (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Surprising Find (1) ff59dd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Surprising Find (1) ff59dd.yaml new file mode 100644 index 000000000..33b56a4df --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Surprising Find (1) ff59dd.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448838 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4488': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ff59dd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Surprising Find (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct (2) be4abe.yaml b/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct (2) be4abe.yaml new file mode 100644 index 000000000..da44277fe --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct (2) be4abe.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368842 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: be4abe +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Survival Instinct (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct 078efb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct 078efb.yaml new file mode 100644 index 000000000..577bbaaa9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct 078efb.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368800 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 078efb +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Survival Instinct +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Survival Knife (2) c1d796.yaml b/unpacked/Bag All Player Cards 15bb07/Card Survival Knife (2) c1d796.yaml new file mode 100644 index 000000000..3ef758ea8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Survival Knife (2) c1d796.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545201 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c1d796 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Survival Knife (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Survival Knife 4d971e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Survival Knife 4d971e.yaml new file mode 100644 index 000000000..08efa7d7e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Survival Knife 4d971e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226322 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4d971e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Survival Knife +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Swift Reflexes c2d211.yaml b/unpacked/Bag All Player Cards 15bb07/Card Swift Reflexes c2d211.yaml new file mode 100644 index 000000000..ea73afe16 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Swift Reflexes c2d211.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277711 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2777': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c2d211 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Swift Reflexes +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Swift Reload (2) 2cfa4f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Swift Reload (2) 2cfa4f.yaml new file mode 100644 index 000000000..59b026ba3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Swift Reload (2) 2cfa4f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380028 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3800': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2cfa4f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Swift Reload (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) (Taboo) 842d41.yaml b/unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) (Taboo) 842d41.yaml new file mode 100644 index 000000000..aa80fe4b8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) (Taboo) 842d41.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450603 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 842d41 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Switchblade (2) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) 2fba3b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) 2fba3b.yaml new file mode 100644 index 000000000..761517451 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) 2fba3b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315243 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2fba3b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Switchblade (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Switchblade 213853.yaml b/unpacked/Bag All Player Cards 15bb07/Card Switchblade 213853.yaml new file mode 100644 index 000000000..d863f953b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Switchblade 213853.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368621 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '213853' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Switchblade +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sword Cane 9c32e2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sword Cane 9c32e2.yaml new file mode 100644 index 000000000..11cbbd7a6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Sword Cane 9c32e2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266323 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9c32e2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Sword Cane +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Take Heart cc6e4d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Take Heart cc6e4d.yaml new file mode 100644 index 000000000..a0fd08f0d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Take Heart cc6e4d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368806 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cc6e4d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Take Heart +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Take the Initiative 50fb37.yaml b/unpacked/Bag All Player Cards 15bb07/Card Take the Initiative 50fb37.yaml new file mode 100644 index 000000000..d02438908 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Take the Initiative 50fb37.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226300 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 50fb37 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Take the Initiative +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Take the Wheel ed4256.yaml b/unpacked/Bag All Player Cards 15bb07/Card Take the Wheel ed4256.yaml new file mode 100644 index 000000000..859b55d31 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Take the Wheel ed4256.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 551404 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5514': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ed4256 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Take the Wheel +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Taunt (2) 9956d5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Taunt (2) 9956d5.yaml new file mode 100644 index 000000000..0d45829b6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Taunt (2) 9956d5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226344 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9956d5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Taunt (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Taunt (3) 85fe46.yaml b/unpacked/Bag All Player Cards 15bb07/Card Taunt (3) 85fe46.yaml new file mode 100644 index 000000000..eeb0ba2ec --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Taunt (3) 85fe46.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545328 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 85fe46 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Taunt (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Taunt d5cac6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Taunt d5cac6.yaml new file mode 100644 index 000000000..28d04f302 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Taunt d5cac6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226308 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d5cac6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Taunt +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Teachings of the Order 90fdb0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Teachings of the Order 90fdb0.yaml new file mode 100644 index 000000000..b0e95bcb7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Teachings of the Order 90fdb0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266322 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 90fdb0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Teachings of the Order +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.44 + rotX: 0.23 + rotY: 270.0 + rotZ: 358.97 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Teamwork eab2ed.yaml b/unpacked/Bag All Player Cards 15bb07/Card Teamwork eab2ed.yaml new file mode 100644 index 000000000..5596215be --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Teamwork eab2ed.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226306 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: eab2ed +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Teamwork +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) db2c81.yaml b/unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) db2c81.yaml new file mode 100644 index 000000000..d327e0263 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) db2c81.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 292816 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2928': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: db2c81 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Telescopic Sight (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tempt Fate 33f906.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tempt Fate 33f906.yaml new file mode 100644 index 000000000..e361aba0d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Tempt Fate 33f906.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266331 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 33f906 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Tempt Fate +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) b5e5f1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) b5e5f1.yaml new file mode 100644 index 000000000..91ae353e5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) b5e5f1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 292912 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2929': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Rogue +DragSelectable: true +GMNotes: '' +GUID: b5e5f1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Tennessee Sour Mash (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) cbe256.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) cbe256.yaml new file mode 100644 index 000000000..f4c078d5f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) cbe256.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 293013 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2930': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Survivor +DragSelectable: true +GMNotes: '' +GUID: cbe256 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Tennessee Sour Mash (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash be33f5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash be33f5.yaml new file mode 100644 index 000000000..f1ac2659e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash be33f5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277605 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2776': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: be33f5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Tennessee Sour Mash +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Terrible Secret 06322f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Terrible Secret 06322f.yaml new file mode 100644 index 000000000..d4de9c767 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Terrible Secret 06322f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527561 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5275': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 06322f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Terrible Secret +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tetsuo Mori 08e5a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tetsuo Mori 08e5a6.yaml new file mode 100644 index 000000000..4f84591db --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Tetsuo Mori 08e5a6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379829 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3798': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Too Noble for His Own Good +DragSelectable: true +GMNotes: '' +GUID: 08e5a6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Tetsuo Mori +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The 13th Vision c1ce8e.yaml b/unpacked/Bag All Player Cards 15bb07/Card The 13th Vision c1ce8e.yaml new file mode 100644 index 000000000..6b45c4d33 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The 13th Vision c1ce8e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290321 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c1ce8e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The 13th Vision +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Bell Tolls 6cbc01.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Bell Tolls 6cbc01.yaml new file mode 100644 index 000000000..07dfcaa4f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Bell Tolls 6cbc01.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 537609 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5376': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 6cbc01 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Bell Tolls +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Black Book ae3775.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Black Book ae3775.yaml new file mode 100644 index 000000000..1a6fd511a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Black Book ae3775.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 275732 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2757': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/829135524526809828/AB799C8FFD9024655A9F179CCFF1EE30DE0D3C75/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Signed in Blood +DragSelectable: true +GMNotes: '' +GUID: ae3775 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Black Book +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Black Cat (5) 16e57b.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Black Cat (5) 16e57b.yaml new file mode 100644 index 000000000..94b85e32f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Black Cat (5) 16e57b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448613 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4486': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: A Liar, or a Prophet, or Both +DragSelectable: true +GMNotes: '' +GUID: 16e57b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Black Cat (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) 698fcc.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) 698fcc.yaml new file mode 100644 index 000000000..3b7cde9a8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) 698fcc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545207 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Stygian Waymark +DragSelectable: true +GMNotes: '' +GUID: 698fcc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Chthonian Stone (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone 6527a4.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone 6527a4.yaml new file mode 100644 index 000000000..1a6822d6f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone 6527a4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230327 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Stygian Waymark +DragSelectable: true +GMNotes: '' +GUID: 6527a4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Chthonian Stone +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages 0e4a82.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages 0e4a82.yaml new file mode 100644 index 000000000..9fce6e18b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages 0e4a82.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 377436 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3774': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0e4a82 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Codex of Ages +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Council's Coffer (2) 0e39c2.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Council's Coffer (2) 0e39c2.yaml new file mode 100644 index 000000000..94181085d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Council's Coffer (2) 0e39c2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 312109 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3121': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: "What\u2019s in the Box?" +DragSelectable: true +GMNotes: '' +GUID: 0e39c2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Council's Coffer (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Dirge of Reason fe68c6.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Dirge of Reason fe68c6.yaml new file mode 100644 index 000000000..3b2dd1e76 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Dirge of Reason fe68c6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 369945 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3699': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fe68c6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Dirge of Reason +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Eye of Truth (5) d6085d.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Eye of Truth (5) d6085d.yaml new file mode 100644 index 000000000..34d66b7d3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Eye of Truth (5) d6085d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448840 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4488': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d6085d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Eye of Truth (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Gold Pocket Watch (4) 62d930.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Gold Pocket Watch (4) 62d930.yaml new file mode 100644 index 000000000..07937bade --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Gold Pocket Watch (4) 62d930.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315257 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Stealing Time +DragSelectable: true +GMNotes: '' +GUID: 62d930 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Gold Pocket Watch (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Home Front b80459.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Home Front b80459.yaml new file mode 100644 index 000000000..bcb50632e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Home Front b80459.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374330 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3743': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b80459 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Home Front +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Hungering Blade (1) bbd11b.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Hungering Blade (1) bbd11b.yaml new file mode 100644 index 000000000..275b34f36 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Hungering Blade (1) bbd11b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440924 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4409': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: "Calamitous Blade of Celepha\xEFs" +DragSelectable: true +GMNotes: '' +GUID: bbd11b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Hungering Blade (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The King in Yellow 016b72.yaml b/unpacked/Bag All Player Cards 15bb07/Card The King in Yellow 016b72.yaml new file mode 100644 index 000000000..d3c32fa33 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The King in Yellow 016b72.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374633 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 016b72 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The King in Yellow +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Man in the Pallid Mask 6720ef.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Man in the Pallid Mask 6720ef.yaml new file mode 100644 index 000000000..4f4b5456e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Man in the Pallid Mask 6720ef.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232300 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2323': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Humanoid. Elite. +DragSelectable: true +GMNotes: '' +GUID: 6720ef +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Man in the Pallid Mask +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Moon • XVIII (1) e80bd8.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Moon • XVIII (1) e80bd8.yaml new file mode 100644 index 000000000..292ac03d0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Moon • XVIII (1) e80bd8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527605 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5276': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Message from Your Inner Self +DragSelectable: true +GMNotes: '' +GUID: e80bd8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "The Moon \u2022 XVIII (1)" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) (Taboo) 9fa2a5.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) (Taboo) 9fa2a5.yaml new file mode 100644 index 000000000..700666766 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) (Taboo) 9fa2a5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 450613 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Petrus de Dacia Translation +DragSelectable: true +GMNotes: '' +GUID: 9fa2a5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Necronomicon (5) (Taboo) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) 96ba38.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) 96ba38.yaml new file mode 100644 index 000000000..6081f9755 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) 96ba38.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538831 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Petrus de Dacia Translation +DragSelectable: true +GMNotes: '' +GUID: 96ba38 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Necronomicon (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon 6b2550.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon 6b2550.yaml new file mode 100644 index 000000000..62e48020c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon 6b2550.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 370323 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3703': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: John Dee Translation +DragSelectable: true +GMNotes: '' +GUID: 6b2550 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Necronomicon +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon d45f10.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon d45f10.yaml new file mode 100644 index 000000000..ad8b2179f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon d45f10.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232934 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2329': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Olaus Wormius Translation +DragSelectable: true +GMNotes: '' +GUID: d45f10 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Necronomicon +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Painted World 170538.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Painted World 170538.yaml new file mode 100644 index 000000000..70190b528 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Painted World 170538.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374014 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '170538' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Painted World +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Painted World dfd48b.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Painted World dfd48b.yaml new file mode 100644 index 000000000..bc8596340 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Painted World dfd48b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374014 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dfd48b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Painted World +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Price of Failure dc5b38.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Price of Failure dc5b38.yaml new file mode 100644 index 000000000..53b56d1cc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Price of Failure dc5b38.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 537612 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5376': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: dc5b38 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Price of Failure +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Red-Gloved Man (5) ad18a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Red-Gloved Man (5) ad18a6.yaml new file mode 100644 index 000000000..9ed5d2a8a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Red-Gloved Man (5) ad18a6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368526 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: He Was Never There +DragSelectable: true +GMNotes: '' +GUID: ad18a6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Red-Gloved Man (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Silver Key 61fd07.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Silver Key 61fd07.yaml new file mode 100644 index 000000000..14c75502b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Silver Key 61fd07.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 278846 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2788': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Key to the Gate of Dreams +DragSelectable: true +GMNotes: '' +GUID: 61fd07 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Silver Key +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Skeleton Key (2) f8dc01.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Skeleton Key (2) f8dc01.yaml new file mode 100644 index 000000000..40bb07cac --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Skeleton Key (2) f8dc01.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315249 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f8dc01 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Skeleton Key (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Stars Are Right 600a3c.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Stars Are Right 600a3c.yaml new file mode 100644 index 000000000..190a42471 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Stars Are Right 600a3c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 443723 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4437': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 600a3c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Stars Are Right +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Tattered Cloak 5d30a1.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Tattered Cloak 5d30a1.yaml new file mode 100644 index 000000000..154a5e854 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Tattered Cloak 5d30a1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232333 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2323': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Regalia Dementia +DragSelectable: true +GMNotes: '' +GUID: 5d30a1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Tattered Cloak +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Thing That Follows da227d.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Thing That Follows da227d.yaml new file mode 100644 index 000000000..d334c9c5c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Thing That Follows da227d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431115 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4311': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Enemy +DragSelectable: true +GMNotes: '' +GUID: da227d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Thing That Follows +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Tower • XVI d5c93d.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Tower • XVI d5c93d.yaml new file mode 100644 index 000000000..e54ae1502 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Tower • XVI d5c93d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290320 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Circumstances Beyond Your Control +DragSelectable: true +GMNotes: '' +GUID: d5c93d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "The Tower \u2022 XVI" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Truth Beckons ca1b5c.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Truth Beckons ca1b5c.yaml new file mode 100644 index 000000000..1fe92a856 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Truth Beckons ca1b5c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232102 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ca1b5c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Truth Beckons +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.99 + posY: 3.29 + posZ: -3.75 + rotX: 357.66 + rotY: 269.94 + rotZ: 2.28 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Thermos 5b14dc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Thermos 5b14dc.yaml new file mode 100644 index 000000000..6aa859814 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Thermos 5b14dc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 261102 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2611': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5b14dc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Thermos +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet (2) 3e0653.yaml b/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet (2) 3e0653.yaml new file mode 100644 index 000000000..911868e20 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet (2) 3e0653.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315303 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3153': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3e0653 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Think on Your Feet (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet 6fec31.yaml b/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet 6fec31.yaml new file mode 100644 index 000000000..d968d67d5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet 6fec31.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368709 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6fec31 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Think on Your Feet +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Thomas Dawson 1f7e6e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Thomas Dawson 1f7e6e.yaml new file mode 100644 index 000000000..cb561dd13 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Thomas Dawson 1f7e6e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 369815 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3698': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Soldier in a New War +DragSelectable: true +GMNotes: '' +GUID: 1f7e6e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Thomas Dawson +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) 30062e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) 30062e.yaml new file mode 100644 index 000000000..8795c7fcc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) 30062e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 447630 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4476': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 30062e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Three Aces (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Thrice-Damned Curiosity 3eef18.yaml b/unpacked/Bag All Player Cards 15bb07/Card Thrice-Damned Curiosity 3eef18.yaml new file mode 100644 index 000000000..c818584a9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Thrice-Damned Curiosity 3eef18.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538801 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 3eef18 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Thrice-Damned Curiosity +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Through the Gates fd9c56.yaml b/unpacked/Bag All Player Cards 15bb07/Card Through the Gates fd9c56.yaml new file mode 100644 index 000000000..e3b7584b1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Through the Gates fd9c56.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527419 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5274': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: fd9c56 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Through the Gates +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tides of Fate 823e49.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tides of Fate 823e49.yaml new file mode 100644 index 000000000..ebd3772a4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Tides of Fate 823e49.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266324 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 823e49 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Tides of Fate +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Time Warp (2) 4224db.yaml b/unpacked/Bag All Player Cards 15bb07/Card Time Warp (2) 4224db.yaml new file mode 100644 index 000000000..9678e9e5e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Time Warp (2) 4224db.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230343 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4224db +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Time Warp (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Timeworn Brand (5) d3e55b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Timeworn Brand (5) d3e55b.yaml new file mode 100644 index 000000000..7349c1516 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Timeworn Brand (5) d3e55b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 261100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2611': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d3e55b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Timeworn Brand (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card To Fight the Black Wind 00b6c3.yaml b/unpacked/Bag All Player Cards 15bb07/Card To Fight the Black Wind 00b6c3.yaml new file mode 100644 index 000000000..36cb4436b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card To Fight the Black Wind 00b6c3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230603 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2306': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 00b6c3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: To Fight the Black Wind +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Token of Faith 2ea0d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Token of Faith 2ea0d0.yaml new file mode 100644 index 000000000..31f4ee6fb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Token of Faith 2ea0d0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266327 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2ea0d0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Token of Faith +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tommy Malloy c3a014.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tommy Malloy c3a014.yaml new file mode 100644 index 000000000..e96936b1f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Tommy Malloy c3a014.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545301 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: c3a014 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Tommy Malloy +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tony's .38 Long Colt 1186a1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tony's .38 Long Colt 1186a1.yaml new file mode 100644 index 000000000..95350188a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Tony's .38 Long Colt 1186a1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274005 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1186a1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Tony's .38 Long Colt +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tony's Quarry d6f8d1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tony's Quarry d6f8d1.yaml new file mode 100644 index 000000000..939537cb3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Tony's Quarry d6f8d1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274006 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d6f8d1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Tony's Quarry +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tooth of Eztli c1a687.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tooth of Eztli c1a687.yaml new file mode 100644 index 000000000..1ca3584b8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Tooth of Eztli c1a687.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368432 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Mortal Reminder +DragSelectable: true +GMNotes: '' +GUID: c1a687 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Tooth of Eztli +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Torrent of Power 79287f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Torrent of Power 79287f.yaml new file mode 100644 index 000000000..73f5cf421 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Torrent of Power 79287f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230300 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 79287f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Torrent of Power +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Track Shoes 6fa7fa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Track Shoes 6fa7fa.yaml new file mode 100644 index 000000000..3ac57a42f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Track Shoes 6fa7fa.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274608 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6fa7fa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Track Shoes +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Treasure Hunter (1) 18927e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Treasure Hunter (1) 18927e.yaml new file mode 100644 index 000000000..7f70c063d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Treasure Hunter (1) 18927e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 315236 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3152': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 18927e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Treasure Hunter (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trench Coat ba560e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trench Coat ba560e.yaml new file mode 100644 index 000000000..a8133bb7a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Trench Coat ba560e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368518 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ba560e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Trench Coat +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trench Knife 0d4eb9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trench Knife 0d4eb9.yaml new file mode 100644 index 000000000..6d035deb1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Trench Knife 0d4eb9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226320 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0d4eb9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Trench Knife +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trial by Fire 869d4c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trial by Fire 869d4c.yaml new file mode 100644 index 000000000..ed7597260 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Trial by Fire 869d4c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 374418 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3744': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 869d4c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Trial by Fire +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card True Grit e25dc1.yaml b/unpacked/Bag All Player Cards 15bb07/Card True Grit e25dc1.yaml new file mode 100644 index 000000000..4f5510076 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card True Grit e25dc1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226329 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e25dc1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: True Grit +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card True Survivor (3) 8837ff.yaml b/unpacked/Bag All Player Cards 15bb07/Card True Survivor (3) 8837ff.yaml new file mode 100644 index 000000000..cd3f04cd3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card True Survivor (3) 8837ff.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368859 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8837ff +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: True Survivor (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card True Understanding 4167c0.yaml b/unpacked/Bag All Player Cards 15bb07/Card True Understanding 4167c0.yaml new file mode 100644 index 000000000..f1ee027e5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card True Understanding 4167c0.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368403 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4167c0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: True Understanding +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trusted 1bc300.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trusted 1bc300.yaml new file mode 100644 index 000000000..ad7b84eb7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Trusted 1bc300.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226315 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1bc300 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Trusted +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction (2) 45cd73.yaml b/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction (2) 45cd73.yaml new file mode 100644 index 000000000..beb8c4129 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction (2) 45cd73.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545202 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 45cd73 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Truth from Fiction (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction d64c99.yaml b/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction d64c99.yaml new file mode 100644 index 000000000..7a2d1de7c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction d64c99.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368412 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d64c99 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Truth from Fiction +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (1) 3dc82f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (1) 3dc82f.yaml new file mode 100644 index 000000000..f36823d26 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (1) 3dc82f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 314802 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3148': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3dc82f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Try and Try Again (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (3) f1b0f9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (3) f1b0f9.yaml new file mode 100644 index 000000000..aef21c92d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (3) f1b0f9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368857 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f1b0f9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Try and Try Again (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Twila Katherine Price (3) 9f76ec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Twila Katherine Price (3) 9f76ec.yaml new file mode 100644 index 000000000..2c3303772 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Twila Katherine Price (3) 9f76ec.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448034 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4480': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Lost in a Dream +DragSelectable: true +GMNotes: '' +GUID: 9f76ec +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Twila Katherine Price (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Twilight Blade 223ba3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Twilight Blade 223ba3.yaml new file mode 100644 index 000000000..6606d4058 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Twilight Blade 223ba3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 449359 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4493': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Sanctum's Reward +DragSelectable: true +GMNotes: '' +GUID: 223ba3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Twilight Blade +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unbound Beast 86cf9c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unbound Beast 86cf9c.yaml new file mode 100644 index 000000000..35d8f3a61 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Unbound Beast 86cf9c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527236 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5272': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Monster. Extradimensional. Tindalos. +DragSelectable: true +GMNotes: '' +GUID: 86cf9c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Unbound Beast +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul 45d2d2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul 45d2d2.yaml new file mode 100644 index 000000000..d481e4eac --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul 45d2d2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230305 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 45d2d2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Uncage the Soul +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Under Surveillance (1) cc8321.yaml b/unpacked/Bag All Player Cards 15bb07/Card Under Surveillance (1) cc8321.yaml new file mode 100644 index 000000000..36c648d4f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Under Surveillance (1) cc8321.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232105 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cc8321 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Under Surveillance (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.99 + posY: 3.28 + posZ: -3.97 + rotX: 358.17 + rotY: 269.93 + rotZ: 3.29 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients f763e8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients f763e8.yaml new file mode 100644 index 000000000..d6bddf217 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients f763e8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368410 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f763e8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Unearth the Ancients +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage (2) 2f2190.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage (2) 2f2190.yaml new file mode 100644 index 000000000..9e3808c69 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage (2) 2f2190.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550824 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2f2190 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Unexpected Courage (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage acb83a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage acb83a.yaml new file mode 100644 index 000000000..8094755ce --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage acb83a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368508 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: acb83a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Unexpected Courage +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Universal Solvent 2f1166.yaml b/unpacked/Bag All Player Cards 15bb07/Card Universal Solvent 2f1166.yaml new file mode 100644 index 000000000..ed3a1d370 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Universal Solvent 2f1166.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 233604 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2336': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2f1166 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Universal Solvent +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unsolved Case 22d886.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unsolved Case 22d886.yaml new file mode 100644 index 000000000..b94ee5745 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Unsolved Case 22d886.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 431656 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4316': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 22d886 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Unsolved Case +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml new file mode 100644 index 000000000..53468dca9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438124 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: a5be8b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Unspeakable Oath (Bloodthirst) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Cowardice) ea0fa1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Cowardice) ea0fa1.yaml new file mode 100644 index 000000000..bd758f558 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Cowardice) ea0fa1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438122 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: ea0fa1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Unspeakable Oath (Cowardice) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Curiosity) f6aba5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Curiosity) f6aba5.yaml new file mode 100644 index 000000000..19af823ff --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Curiosity) f6aba5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438123 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: f6aba5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Unspeakable Oath (Curiosity) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Until the End of Time 41a9ec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Until the End of Time 41a9ec.yaml new file mode 100644 index 000000000..ee7534aa1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Until the End of Time 41a9ec.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 376600 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3766': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 41a9ec +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Until the End of Time +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Valentino Rivas 726d1d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Valentino Rivas 726d1d.yaml new file mode 100644 index 000000000..fae55bbd1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Valentino Rivas 726d1d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 312514 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3125': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Took You Long Enough +DragSelectable: true +GMNotes: '' +GUID: 726d1d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Valentino Rivas +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vantage Point 2f9ab1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vantage Point 2f9ab1.yaml new file mode 100644 index 000000000..82031a134 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Vantage Point 2f9ab1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368411 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2f9ab1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Vantage Point +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 10.0 + posY: 0.0 + posZ: 20.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vault of Knowledge 2fdcc9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vault of Knowledge 2fdcc9.yaml new file mode 100644 index 000000000..95f6a6e09 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Vault of Knowledge 2fdcc9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538800 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2fdcc9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Vault of Knowledge +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Veda Whitsley a0c2da.yaml b/unpacked/Bag All Player Cards 15bb07/Card Veda Whitsley a0c2da.yaml new file mode 100644 index 000000000..8756cad11 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Veda Whitsley a0c2da.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231709 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537091085/26A674065298A59068E1D6BA3804D03554C234A3/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Skilled Botanist +DragSelectable: true +GMNotes: '' +GUID: a0c2da +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Veda Whitsley +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vengeful Hound ce3a1a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vengeful Hound ce3a1a.yaml new file mode 100644 index 000000000..afbde3ce3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Vengeful Hound ce3a1a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 380949 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3809': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ce3a1a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Vengeful Hound +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Venturer 0e2987.yaml b/unpacked/Bag All Player Cards 15bb07/Card Venturer 0e2987.yaml new file mode 100644 index 000000000..f3cdfe2ff --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Venturer 0e2987.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226332 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0e2987 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Venturer +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Versatile (2) eca1c8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Versatile (2) eca1c8.yaml new file mode 100644 index 000000000..4b9c4772d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Versatile (2) eca1c8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379711 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3797': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: eca1c8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Versatile (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow (2) d2e026.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow (2) d2e026.yaml new file mode 100644 index 000000000..fd5a66f77 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow (2) d2e026.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226341 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d2e026 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Vicious Blow (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow 889121.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow 889121.yaml new file mode 100644 index 000000000..d8d3d05b9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow 889121.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226302 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '889121' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Vicious Blow +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Voice of Ra 0988b2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Voice of Ra 0988b2.yaml new file mode 100644 index 000000000..8ba8f18c5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Voice of Ra 0988b2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538714 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0988b2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Voice of Ra +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Voice of the Messenger f93ea8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Voice of the Messenger f93ea8.yaml new file mode 100644 index 000000000..1a5e84b93 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Voice of the Messenger f93ea8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 376501 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3765': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f93ea8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Voice of the Messenger +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (2) 4d74f6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (2) 4d74f6.yaml new file mode 100644 index 000000000..60b718e0b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (2) 4d74f6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230341 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4d74f6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ward of Protection (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (5) 7bc995.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (5) 7bc995.yaml new file mode 100644 index 000000000..753716d0e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (5) 7bc995.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230360 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7bc995 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ward of Protection (5) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection 6656ad.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection 6656ad.yaml new file mode 100644 index 000000000..1985034ea --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection 6656ad.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 230308 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6656ad +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ward of Protection +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ward of Radiance 69116c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ward of Radiance 69116c.yaml new file mode 100644 index 000000000..176cbd988 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ward of Radiance 69116c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266325 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 69116c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ward of Radiance +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Warning Shot ec38db.yaml b/unpacked/Bag All Player Cards 15bb07/Card Warning Shot ec38db.yaml new file mode 100644 index 000000000..0be7142e5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Warning Shot ec38db.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 292814 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2928': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ec38db +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Warning Shot +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Watch this! c40cb4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Watch this! c40cb4.yaml new file mode 100644 index 000000000..c097ce5f6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Watch this! c40cb4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 261700 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2617': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c40cb4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Watch this!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Watcher from Another Dimension 6945f7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Watcher from Another Dimension 6945f7.yaml new file mode 100644 index 000000000..7efe5efdf --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Watcher from Another Dimension 6945f7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 274011 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2740': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6945f7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Watcher from Another Dimension +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Waylay da207b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Waylay da207b.yaml new file mode 100644 index 000000000..1fa8e9155 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Waylay da207b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368818 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: da207b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Waylay +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.yaml new file mode 100644 index 000000000..288e9fa1f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 527608 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5276': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 66b7d5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Well Connected +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Well Prepared (2) eea4ef.yaml b/unpacked/Bag All Player Cards 15bb07/Card Well Prepared (2) eea4ef.yaml new file mode 100644 index 000000000..28ee8f0f1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Well Prepared (2) eea4ef.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 226345 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: eea4ef +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Well Prepared (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Well-Maintained (1) e454c3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Well-Maintained (1) e454c3.yaml new file mode 100644 index 000000000..1f4a280a3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Well-Maintained (1) e454c3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 278012 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2780': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e454c3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Well-Maintained (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet a56ffe.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet a56ffe.yaml new file mode 100644 index 000000000..4c7f024da --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet a56ffe.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368928 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3689': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a56ffe +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Wendy's Amulet +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card What Have You Done 2c76d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card What Have You Done 2c76d9.yaml new file mode 100644 index 000000000..95aff89e0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card What Have You Done 2c76d9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 534901 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5349': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/778493212055041441/90F035BD69A7C5C6B6F43426DDDA3A09DFCBCBDF/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Madness. +DragSelectable: true +GMNotes: '' +GUID: 2c76d9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: What Have You Done? +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Whispers from the Deep dd4a25.yaml b/unpacked/Bag All Player Cards 15bb07/Card Whispers from the Deep dd4a25.yaml new file mode 100644 index 000000000..9d92a25e4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Whispers from the Deep dd4a25.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266303 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: dd4a25 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Whispers from the Deep +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene (2) 854c79.yaml b/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene (2) 854c79.yaml new file mode 100644 index 000000000..3f0f0f7f4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene (2) 854c79.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538821 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Hunter of Rare Books +DragSelectable: true +GMNotes: '' +GUID: 854c79 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Whitton Greene (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene 3c5099.yaml b/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene 3c5099.yaml new file mode 100644 index 000000000..57c1db595 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene 3c5099.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538811 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Hunter of Rare Books +DragSelectable: true +GMNotes: '' +GUID: 3c5099 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Whitton Greene +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 0027f2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 0027f2.yaml new file mode 100644 index 000000000..d9e915f54 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 0027f2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368860 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0027f2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Will to Survive (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Will to Survive dc4a2c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Will to Survive dc4a2c.yaml new file mode 100644 index 000000000..9c0e3935d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Will to Survive dc4a2c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550810 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dc4a2c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Will to Survive +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Winging It aa3984.yaml b/unpacked/Bag All Player Cards 15bb07/Card Winging It aa3984.yaml new file mode 100644 index 000000000..172436c27 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Winging It aa3984.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 430501 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4305': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: aa3984 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Winging It +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wish Eater 464ca1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wish Eater 464ca1.yaml new file mode 100644 index 000000000..7d2e5c26c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Wish Eater 464ca1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448937 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4489': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Jewel of the Gods +DragSelectable: true +GMNotes: '' +GUID: 464ca1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Wish Eater +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wither (4) f57a6f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wither (4) f57a6f.yaml new file mode 100644 index 000000000..c990b07e2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Wither (4) f57a6f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379619 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3796': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f57a6f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Wither (4) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wither d946d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wither d946d9.yaml new file mode 100644 index 000000000..381caa418 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Wither d946d9.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 277511 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2775': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d946d9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Wither +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Word of Command (2) 26853e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Word of Command (2) 26853e.yaml new file mode 100644 index 000000000..35d6c2ba9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Word of Command (2) 26853e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 448030 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4480': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 26853e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Word of Command (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Working a Hunch eb6165.yaml b/unpacked/Bag All Player Cards 15bb07/Card Working a Hunch eb6165.yaml new file mode 100644 index 000000000..8020a4fce --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Working a Hunch eb6165.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368413 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: eb6165 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Working a Hunch +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.0 + posY: 1.5 + posZ: 0.0 + rotX: 359.99 + rotY: 270.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wracked by Nightmares 97781f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wracked by Nightmares 97781f.yaml new file mode 100644 index 000000000..1841adf47 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Wracked by Nightmares 97781f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 371013 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3710': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 97781f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Wracked by Nightmares +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Yaotl (1) a7358f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Yaotl (1) a7358f.yaml new file mode 100644 index 000000000..0aae3da5f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Yaotl (1) a7358f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368840 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Lost Son of Earth +DragSelectable: true +GMNotes: '' +GUID: a7358f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Yaotl (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Yaztaroth 313167.yaml b/unpacked/Bag All Player Cards 15bb07/Card Yaztaroth 313167.yaml new file mode 100644 index 000000000..b14f69750 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Yaztaroth 313167.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 504613 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5046': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: '313167' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Yaztaroth +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card You handle this one! dcdcea.yaml b/unpacked/Bag All Player Cards 15bb07/Card You handle this one! dcdcea.yaml new file mode 100644 index 000000000..e035d3d36 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card You handle this one! dcdcea.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 368705 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dcdcea +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"You handle this one!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card You owe me one! d27d12.yaml b/unpacked/Bag All Player Cards 15bb07/Card You owe me one! d27d12.yaml new file mode 100644 index 000000000..21ad08e78 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card You owe me one! d27d12.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 378018 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3780': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d27d12 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"You owe me one!"' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Your Worst Nightmare 406ab2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Your Worst Nightmare 406ab2.yaml new file mode 100644 index 000000000..a3ec2b45f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Your Worst Nightmare 406ab2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438128 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 406ab2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Your Worst Nightmare +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Zeal 695bb7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Zeal 695bb7.yaml new file mode 100644 index 000000000..40ca29d80 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Zeal 695bb7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 440625 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4406': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 695bb7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Zeal +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Zebulon Whateley 6714b2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Zebulon Whateley 6714b2.yaml new file mode 100644 index 000000000..f9151c085 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Zebulon Whateley 6714b2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232949 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2329': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Recalling Ancient Things +DragSelectable: true +GMNotes: '' +GUID: 6714b2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Zebulon Whateley +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d810.yaml b/unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d810.yaml new file mode 100644 index 000000000..012ce1a18 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d810.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 371704 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3717': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 66d810 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Zoey's Cross +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Ancient Covenant (2) 436401.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Ancient Covenant (2) 436401.yaml new file mode 100644 index 000000000..8a41ae322 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Ancient Covenant (2) 436401.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 546400 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5464': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1056604690734334657/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1597044073918730334/45D2725C3553953A73DAFBEF631E78D459716EA7/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '436401' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Ancient Covenant (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Blasphemous Covenant (2) 10b087.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Blasphemous Covenant (2) 10b087.yaml new file mode 100644 index 000000000..b205d7a72 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Blasphemous Covenant (2) 10b087.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 546500 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5465': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1056604690734334657/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1597044073918730883/0E7FEB9CC85CD11EB5194774E90A73163EDACBEC/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 10b087 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Blasphemous Covenant (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Daisy's Tote Bag cf41be.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Daisy's Tote Bag cf41be.yaml new file mode 100644 index 000000000..f109fb078 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Daisy's Tote Bag cf41be.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231600 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1017195287736529784/BEB850DCAA5497CC1A96E1603C0D3AFFE8B0F2BB/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Advanced +DragSelectable: true +GMNotes: '' +GUID: cf41be +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Daisy's Tote Bag +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Sophist f6b1b6.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Sophist f6b1b6.yaml new file mode 100644 index 000000000..73105975c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Sophist f6b1b6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 549300 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5493': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/766099859120034153/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373727958826520/EE54EF6510734FC86ADD47E84DB253493A2F87B7/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f6b1b6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Eldritch Sophist +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Enchanted Armor (2) dfe1ee.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Enchanted Armor (2) dfe1ee.yaml new file mode 100644 index 000000000..38e9f63fd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Enchanted Armor (2) dfe1ee.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553500 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5535': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507632247/1E1B6D93DBC33FA7C8DC93C7D06B7964CAD98AD0/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dfe1ee +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Enchanted Armor (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.46 + rotX: 0.24 + rotY: 270.0 + rotZ: 359.03 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Eye of the Djinn (2) d3f951.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Eye of the Djinn (2) d3f951.yaml new file mode 100644 index 000000000..2386ab6de --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Eye of the Djinn (2) d3f951.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553900 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5539': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785039276137/5296150CC991C946FD11B619FD9A6B948F268B63/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Vessel of Good and Evil +DragSelectable: true +GMNotes: '' +GUID: d3f951 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Eye of the Djinn (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.75 + posY: 3.27 + posZ: -4.54 + rotX: 357.26 + rotY: 270.07 + rotZ: 358.5 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Gaze of Ouraxsh (2) f0ecd2.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Gaze of Ouraxsh (2) 34e9f8.yaml similarity index 89% rename from unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Gaze of Ouraxsh (2) f0ecd2.yaml rename to unpacked/Bag All Player Cards 15bb07/CardCustom Gaze of Ouraxsh (2) 34e9f8.yaml index 6d58c71b3..828907524 100644 --- a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Gaze of Ouraxsh (2) f0ecd2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Gaze of Ouraxsh (2) 34e9f8.yaml @@ -16,7 +16,7 @@ CustomDeck: Description: '' DragSelectable: true GMNotes: '' -GUID: f0ecd2 +GUID: 34e9f8 Grid: true GridProjection: false Hands: true @@ -33,12 +33,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 16.77 - posY: 3.49 - posZ: -25.46 - rotX: 2.85 - rotY: 269.98 - rotZ: 359.41 + posX: -51.08 + posY: 3.17 + posZ: -74.84 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Hospital Debts bd323d.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Hospital Debts bd323d.yaml new file mode 100644 index 000000000..bc0d26347 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hospital Debts bd323d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 541300 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5413': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915335843/99E638B3D735149C6624312DBAB47A3AA2D2F95D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Advanced +DragSelectable: true +GMNotes: '' +GUID: bd323d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Hospital Debts +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Liber Omnium Finium 242a11.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Liber Omnium Finium 242a11.yaml new file mode 100644 index 000000000..8d4953358 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Liber Omnium Finium 242a11.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 273000 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2730': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280920105/BBE662BDDC5F2C94A5DE10256B991D1E1DD2C50D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Weakness +DragSelectable: true +GMNotes: '' +GUID: 242a11 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Liber Omnium Finium +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.44 + rotX: 0.23 + rotY: 270.0 + rotZ: 358.97 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Lucky Penny (2) 8d45ac.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Lucky Penny (2) 8d45ac.yaml new file mode 100644 index 000000000..82b56139b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Lucky Penny (2) 8d45ac.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 554000 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5540': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785039276730/C9940B09C9D2B7D1DC288E51F8B3885F080E2E02/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Omen of Misfortune +DragSelectable: true +GMNotes: '' +GUID: 8d45ac +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: '"Lucky" Penny (2)' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.58 + posY: 3.28 + posZ: -5.23 + rotX: 357.7 + rotY: 269.93 + rotZ: 2.41 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Manipulate Destiny (2) 99e882.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Manipulate Destiny (2) bcc255.yaml similarity index 89% rename from unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Manipulate Destiny (2) 99e882.yaml rename to unpacked/Bag All Player Cards 15bb07/CardCustom Manipulate Destiny (2) bcc255.yaml index d2b176b05..fe4682f75 100644 --- a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Manipulate Destiny (2) 99e882.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Manipulate Destiny (2) bcc255.yaml @@ -16,7 +16,7 @@ CustomDeck: Description: '' DragSelectable: true GMNotes: '' -GUID: 99e882 +GUID: bcc255 Grid: true GridProjection: false Hands: true @@ -33,12 +33,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 17.99 - posY: 3.54 - posZ: -25.54 - rotX: 358.6 - rotY: 270.0 - rotZ: 359.72 + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom On the Lam 9c4900.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom On the Lam 9c4900.yaml new file mode 100644 index 000000000..edfe574f0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom On the Lam 9c4900.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 541200 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5412': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915335413/F6B6100F5713A33245CFBB6F1D7316AA2DD0F760/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Advanced +DragSelectable: true +GMNotes: '' +GUID: 9c4900 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: On the Lam +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Radiant Smite (1) 0d03bb.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Radiant Smite (1) 9103a5.yaml similarity index 89% rename from unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Radiant Smite (1) 0d03bb.yaml rename to unpacked/Bag All Player Cards 15bb07/CardCustom Radiant Smite (1) 9103a5.yaml index 230a93f50..7cbfe2ea5 100644 --- a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Radiant Smite (1) 0d03bb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Radiant Smite (1) 9103a5.yaml @@ -16,7 +16,7 @@ CustomDeck: Description: '' DragSelectable: true GMNotes: '' -GUID: 0d03bb +GUID: 9103a5 Grid: true GridProjection: false Hands: true @@ -33,12 +33,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 18.42 - posY: 3.5 - posZ: -25.61 - rotX: 357.09 - rotY: 269.99 - rotZ: 0.41 + posX: -56.72 + posY: 3.17 + posZ: -79.56 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Ruth Westmacott 782e0a.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Ruth Westmacott 782e0a.yaml new file mode 100644 index 000000000..39f93cb72 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Ruth Westmacott 782e0a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 273100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2731': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280920329/24678C1EA9F75CE15164134ACF04BD5642D9F434/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Dark Revelations +DragSelectable: true +GMNotes: '' +GUID: 782e0a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Ruth Westmacott +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.41 + rotX: 0.22 + rotY: 270.0 + rotZ: 358.87 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Ríastrad (1) d89190.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Ríastrad (1) d89190.yaml new file mode 100644 index 000000000..f35291a7f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Ríastrad (1) d89190.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553600 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5536': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507630340/07BD7D0674499D3B5B315239E1B9682B6E4D8285/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d89190 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: "R\xEDastrad (1)" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.41 + rotX: 0.22 + rotY: 270.0 + rotZ: 358.87 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Signum Crucis (2) c21c1f.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Signum Crucis (2) c21c1f.yaml new file mode 100644 index 000000000..f9034df1e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Signum Crucis (2) c21c1f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553700 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5537': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507632620/1C7C9B898C919EDAD757709C161F0DFFF3FA9238/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c21c1f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Signum Crucis (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.41 + rotX: 0.22 + rotY: 270.0 + rotZ: 358.87 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Skeptic (1) d2cd42.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Skeptic (1) d2cd42.yaml new file mode 100644 index 000000000..1760a99b9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Skeptic (1) d2cd42.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 550100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5501': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1537373966843931844/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373966843940006/71700050B0B2CD56C458047D94B9E605ED01B989/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d2cd42 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Skeptic (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom The Necronomicon 5b2e10.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom The Necronomicon 5b2e10.yaml new file mode 100644 index 000000000..b3b0b123c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom The Necronomicon 5b2e10.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 539500 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5395': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1017195287736531119/B300331BEF8B29732A2AD6123D59380B7ECB631C/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: John Dee Translation (Advanced) +DragSelectable: true +GMNotes: '' +GUID: 5b2e10 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: The Necronomicon +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Third Time's a Charm (2) 55c953.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Third Time's a Charm (2) 27ff2d.yaml similarity index 89% rename from unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Third Time's a Charm (2) 55c953.yaml rename to unpacked/Bag All Player Cards 15bb07/CardCustom Third Time's a Charm (2) 27ff2d.yaml index 59e9fd454..3fde5d429 100644 --- a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9/CardCustom Third Time's a Charm (2) 55c953.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Third Time's a Charm (2) 27ff2d.yaml @@ -16,7 +16,7 @@ CustomDeck: Description: '' DragSelectable: true GMNotes: '' -GUID: 55c953 +GUID: 27ff2d Grid: true GridProjection: false Hands: true @@ -33,12 +33,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 17.89 - posY: 3.53 - posZ: -25.85 - rotX: 359.12 - rotY: 269.97 - rotZ: 3.19 + posX: -66.06 + posY: 3.48 + posZ: -67.38 + rotX: 0.02 + rotY: 270.01 + rotZ: 180.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Tristan Botley (2) 039e47.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Tristan Botley (2) 039e47.yaml new file mode 100644 index 000000000..4abad4c54 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Tristan Botley (2) 039e47.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553800 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5538': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507632983/CC643186858EEC718B5F3FEA9CD7D0CEDE055F13/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Fixer for Hire +DragSelectable: true +GMNotes: '' +GUID: 039e47 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Tristan Botley (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -65.63 + posY: 3.69 + posZ: -65.45 + rotX: 0.24 + rotY: 270.0 + rotZ: 359.04 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e.yaml new file mode 100644 index 000000000..f60a28a89 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e.yaml @@ -0,0 +1,85 @@ +Autoraise: true +ColorDiffuse: + b: 0.2499997 + g: 0.2499997 + r: 0.2499997 +ContainedObjects: +- !include 'Bag Random Basic Weaknesses 770c4e/Card Chronophobia eeb330.yaml' +- !include "Bag Random Basic Weaknesses 770c4e/Card The Tower \u2022 XVI d5c93d.yaml" +- !include 'Bag Random Basic Weaknesses 770c4e/Card Indebted 8df93a.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Chronophobia 016e3c.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card The Thing That Follows da227d.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Day of Reckoning ffb62c.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Mob Enforcer b239d7.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Dread Curse 993595.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Paranoia c17498.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Overzealous 29766c.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Dendromorphosis 121b2d.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Bloodthirst) + a5be8b.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Nihilism fc4168.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Dark Pact dd3d09.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card The 13th Vision e42f12.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Your Worst Nightmare 406ab2.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Amnesia 8598a4.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Obsessive a2e7d7.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Drawing the Sign 3b3c0a.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Self-Centered eff3c8.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Curiosity) f6aba5.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Kleptomania 447a08.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Psychosis d83baf.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Silver Twilight Acolyte 16a89d.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Paranoia 3575a3.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Self-Destructive 2204cc.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Cowardice) ea0fa1.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Accursed Follower 6d8407.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Doomed ba2ae1.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Reckless c45e67.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card The 13th Vision cebf6a.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Accursed Follower 483f9a.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Indebted b2ef43.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Through the Gates 31f72f.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Hypochondria 88ee43.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Offer You Cannot Refuse e27c93.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Dread Curse 96eb52.yaml' +- !include "Bag Random Basic Weaknesses 770c4e/Card The Tower \u2022 XVI cc65f3.yaml" +- !include 'Bag Random Basic Weaknesses 770c4e/Card Through the Gates fd9c56.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Overzealous 88a9b3.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Haunted 249d83.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Internal Injury d28be6.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Narcolepsy 57e648.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Stubborn Detective 4ea68b.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Atychiphobia a3bc7a.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Amnesia 2210c1.yaml' +- !include 'Bag Random Basic Weaknesses 770c4e/Card Internal Injury 4fb446.yaml' +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 770c4e +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Bag +Nickname: Random Basic Weaknesses +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -54.2 + posY: 1.2 + posZ: -74.34 + rotX: 0.0 + rotY: 270.0 + rotZ: 0.0 + scaleX: 0.55 + scaleY: 0.55 + scaleZ: 0.55 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Accursed Follower 483f9a.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Accursed Follower 483f9a.yaml new file mode 100644 index 000000000..734eb4f47 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Accursed Follower 483f9a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266332 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 483f9a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Accursed Follower +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -54.64 + posY: 2.43 + posZ: -73.95 + rotX: 1.74 + rotY: 269.94 + rotZ: 177.3 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Accursed Follower 6d8407.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Accursed Follower 6d8407.yaml new file mode 100644 index 000000000..00bb9fe53 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Accursed Follower 6d8407.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266332 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 6d8407 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Accursed Follower +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.38 + posZ: -66.23 + rotX: 359.43 + rotY: 270.01 + rotZ: 180.38 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Amnesia 2210c1.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Amnesia 2210c1.yaml new file mode 100644 index 000000000..224b8c4c1 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Amnesia 2210c1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290800 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 2210c1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Amnesia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.32 + posY: 3.37 + posZ: -66.28 + rotX: 359.39 + rotY: 270.01 + rotZ: 180.63 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Amnesia 8598a4.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Amnesia 8598a4.yaml new file mode 100644 index 000000000..1bf61a6e6 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Amnesia 8598a4.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290800 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 8598a4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Amnesia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.14 + posY: 3.37 + posZ: -66.49 + rotX: 359.25 + rotY: 270.0 + rotZ: 181.17 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Atychiphobia a3bc7a.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Atychiphobia a3bc7a.yaml new file mode 100644 index 000000000..fb380cc41 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Atychiphobia a3bc7a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 552702 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5527': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: a3bc7a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Atychiphobia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.38 + posZ: -66.25 + rotX: 359.43 + rotY: 270.01 + rotZ: 180.49 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Chronophobia 016e3c.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Chronophobia 016e3c.yaml new file mode 100644 index 000000000..4bdb7902b --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Chronophobia 016e3c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290807 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 016e3c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Chronophobia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.83 + posY: 3.38 + posZ: -66.11 + rotX: 0.63 + rotY: 270.01 + rotZ: 179.8 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Chronophobia eeb330.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Chronophobia eeb330.yaml new file mode 100644 index 000000000..25336ba9e --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Chronophobia eeb330.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290807 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: eeb330 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Chronophobia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.49 + posY: 3.38 + posZ: -66.3 + rotX: 359.78 + rotY: 270.01 + rotZ: 180.75 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dark Pact dd3d09.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dark Pact dd3d09.yaml new file mode 100644 index 000000000..024ed6570 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dark Pact dd3d09.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290813 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: dd3d09 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dark Pact +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.38 + posZ: -66.25 + rotX: 359.43 + rotY: 270.01 + rotZ: 180.49 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Day of Reckoning ffb62c.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Day of Reckoning ffb62c.yaml new file mode 100644 index 000000000..b2574fe57 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Day of Reckoning ffb62c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266334 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: ffb62c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Day of Reckoning +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.24 + posY: 3.38 + posZ: -66.2 + rotX: 359.5 + rotY: 270.0 + rotZ: 180.15 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dendromorphosis 121b2d.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dendromorphosis 121b2d.yaml new file mode 100644 index 000000000..50ee1bc5a --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dendromorphosis 121b2d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545211 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 121b2d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dendromorphosis +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.25 + posY: 3.37 + posZ: -66.23 + rotX: 359.24 + rotY: 270.01 + rotZ: 180.37 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Doomed ba2ae1.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Doomed ba2ae1.yaml new file mode 100644 index 000000000..21b6c192f --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Doomed ba2ae1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290814 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: ba2ae1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Doomed +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.25 + posY: 3.37 + posZ: -66.23 + rotX: 359.24 + rotY: 270.01 + rotZ: 180.38 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Drawing the Sign 3b3c0a.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Drawing the Sign 3b3c0a.yaml new file mode 100644 index 000000000..5fc5ce76f --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Drawing the Sign 3b3c0a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290811 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 3b3c0a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Drawing the Sign +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.38 + posZ: -66.23 + rotX: 359.43 + rotY: 270.01 + rotZ: 180.38 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dread Curse 96eb52.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dread Curse 96eb52.yaml new file mode 100644 index 000000000..52127300f --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dread Curse 96eb52.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266333 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 96eb52 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dread Curse +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.25 + posY: 3.37 + posZ: -66.18 + rotX: 359.23 + rotY: 270.01 + rotZ: 180.16 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dread Curse 993595.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dread Curse 993595.yaml new file mode 100644 index 000000000..85674a69d --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Dread Curse 993595.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266333 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: '993595' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dread Curse +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.38 + posZ: -66.25 + rotX: 359.43 + rotY: 270.01 + rotZ: 180.49 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Haunted 249d83.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Haunted 249d83.yaml new file mode 100644 index 000000000..06b421539 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Haunted 249d83.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290802 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 249d83 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Haunted +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.38 + posZ: -66.23 + rotX: 359.43 + rotY: 270.01 + rotZ: 180.38 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Hypochondria 88ee43.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Hypochondria 88ee43.yaml new file mode 100644 index 000000000..014ddc592 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Hypochondria 88ee43.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290804 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 88ee43 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hypochondria +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.38 + posZ: -66.23 + rotX: 359.43 + rotY: 270.01 + rotZ: 180.38 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Indebted 8df93a.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Indebted 8df93a.yaml new file mode 100644 index 000000000..ad9ebc996 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Indebted 8df93a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290805 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 8df93a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Indebted +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.37 + posZ: -66.31 + rotX: 359.45 + rotY: 270.01 + rotZ: 180.74 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Indebted b2ef43.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Indebted b2ef43.yaml new file mode 100644 index 000000000..1c521042c --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Indebted b2ef43.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290805 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: b2ef43 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Indebted +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.38 + posZ: -66.23 + rotX: 359.43 + rotY: 270.01 + rotZ: 180.38 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Internal Injury 4fb446.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Internal Injury 4fb446.yaml new file mode 100644 index 000000000..0bba35401 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Internal Injury 4fb446.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290806 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 4fb446 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Internal Injury +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -54.7 + posY: 2.4 + posZ: -73.67 + rotX: 1.42 + rotY: 269.94 + rotZ: 176.39 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Internal Injury d28be6.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Internal Injury d28be6.yaml new file mode 100644 index 000000000..70a99b9c6 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Internal Injury d28be6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290806 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: d28be6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Internal Injury +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.25 + posY: 3.37 + posZ: -66.18 + rotX: 359.23 + rotY: 270.01 + rotZ: 180.16 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Kleptomania 447a08.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Kleptomania 447a08.yaml new file mode 100644 index 000000000..6b0ba0630 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Kleptomania 447a08.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438126 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 447a08 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Kleptomania +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -56.57 + posY: 3.31 + posZ: -62.57 + rotX: 0.6 + rotY: 270.03 + rotZ: 183.35 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Mob Enforcer b239d7.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Mob Enforcer b239d7.yaml new file mode 100644 index 000000000..1a82aa34c --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Mob Enforcer b239d7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290816 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Enemy +DragSelectable: true +GMNotes: '' +GUID: b239d7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mob Enforcer +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.37 + posZ: -66.31 + rotX: 359.45 + rotY: 270.01 + rotZ: 180.74 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Narcolepsy 57e648.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Narcolepsy 57e648.yaml new file mode 100644 index 000000000..56138ad16 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Narcolepsy 57e648.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438127 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 57e648 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Narcolepsy +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.25 + posY: 3.37 + posZ: -66.18 + rotX: 359.23 + rotY: 270.01 + rotZ: 180.16 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Nihilism fc4168.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Nihilism fc4168.yaml new file mode 100644 index 000000000..1216f61a2 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Nihilism fc4168.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538702 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: fc4168 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Nihilism +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -55.59 + posY: 3.32 + posZ: -62.15 + rotX: 358.35 + rotY: 269.93 + rotZ: 183.43 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Obsessive a2e7d7.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Obsessive a2e7d7.yaml new file mode 100644 index 000000000..e6679fc70 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Obsessive a2e7d7.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 552602 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5526': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: a2e7d7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Obsessive +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.27 + posY: 3.37 + posZ: -66.21 + rotX: 359.28 + rotY: 270.01 + rotZ: 180.27 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Offer You Cannot Refuse e27c93.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Offer You Cannot Refuse e27c93.yaml new file mode 100644 index 000000000..ed5ae5cf5 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Offer You Cannot Refuse e27c93.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 545212 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: e27c93 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Offer You Cannot Refuse +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.38 + posZ: -66.25 + rotX: 359.43 + rotY: 270.01 + rotZ: 180.49 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Overzealous 29766c.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Overzealous 29766c.yaml new file mode 100644 index 000000000..d1e71d0f4 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Overzealous 29766c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290810 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 29766c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Overzealous +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -55.89 + posY: 3.33 + posZ: -60.92 + rotX: 359.1 + rotY: 270.04 + rotZ: 176.05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Overzealous 88a9b3.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Overzealous 88a9b3.yaml new file mode 100644 index 000000000..c5719a325 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Overzealous 88a9b3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290810 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 88a9b3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Overzealous +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.52 + posY: 3.38 + posZ: -66.3 + rotX: 359.85 + rotY: 270.01 + rotZ: 180.75 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Paranoia 3575a3.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Paranoia 3575a3.yaml new file mode 100644 index 000000000..ddab43a80 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Paranoia 3575a3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290801 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 3575a3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Paranoia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.24 + posY: 3.37 + posZ: -66.29 + rotX: 359.26 + rotY: 270.01 + rotZ: 180.62 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Paranoia c17498.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Paranoia c17498.yaml new file mode 100644 index 000000000..e2ebc6a42 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Paranoia c17498.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290801 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: c17498 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Paranoia +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.38 + posZ: -66.23 + rotX: 359.43 + rotY: 270.01 + rotZ: 180.38 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Psychosis d83baf.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Psychosis d83baf.yaml new file mode 100644 index 000000000..a237ac6a2 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Psychosis d83baf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290803 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: d83baf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Psychosis +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.61 + posY: 3.38 + posZ: -66.27 + rotX: 0.09 + rotY: 270.01 + rotZ: 180.62 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Reckless c45e67.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Reckless c45e67.yaml new file mode 100644 index 000000000..3341ef05d --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Reckless c45e67.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 538602 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: c45e67 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Reckless +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.44 + posY: 3.37 + posZ: -66.33 + rotX: 359.67 + rotY: 270.01 + rotZ: 180.85 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Self-Centered eff3c8.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Self-Centered eff3c8.yaml new file mode 100644 index 000000000..020bed72b --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Self-Centered eff3c8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438125 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: eff3c8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Self-Centered +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.25 + posY: 3.37 + posZ: -66.23 + rotX: 359.24 + rotY: 270.01 + rotZ: 180.38 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Self-Destructive 2204cc.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Self-Destructive 2204cc.yaml new file mode 100644 index 000000000..3757dbff2 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Self-Destructive 2204cc.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 547902 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5479': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 2204cc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Self-Destructive +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.37 + posZ: -66.31 + rotX: 359.45 + rotY: 270.01 + rotZ: 180.74 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Silver Twilight Acolyte 16a89d.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Silver Twilight Acolyte 16a89d.yaml new file mode 100644 index 000000000..837048f6d --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Silver Twilight Acolyte 16a89d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290817 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Enemy +DragSelectable: true +GMNotes: '' +GUID: 16a89d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Silver Twilight Acolyte +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.34 + posY: 3.38 + posZ: -66.25 + rotX: 359.43 + rotY: 270.01 + rotZ: 180.49 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Stubborn Detective 4ea68b.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Stubborn Detective 4ea68b.yaml new file mode 100644 index 000000000..0114ff3c7 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Stubborn Detective 4ea68b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290818 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Enemy +DragSelectable: true +GMNotes: '' +GUID: 4ea68b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stubborn Detective +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.47 + posY: 3.38 + posZ: -66.33 + rotX: 359.73 + rotY: 270.01 + rotZ: 180.85 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card The 13th Vision cebf6a.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card The 13th Vision cebf6a.yaml new file mode 100644 index 000000000..c987b3cba --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card The 13th Vision cebf6a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290321 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cebf6a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The 13th Vision +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -55.52 + posY: 3.34 + posZ: -61.48 + rotX: 357.19 + rotY: 270.01 + rotZ: 179.58 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card The 13th Vision e42f12.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card The 13th Vision e42f12.yaml new file mode 100644 index 000000000..c44750ffa --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card The 13th Vision e42f12.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290321 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e42f12 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The 13th Vision +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.29 + posY: 3.37 + posZ: -66.23 + rotX: 359.33 + rotY: 270.01 + rotZ: 180.38 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card The Thing That Follows da227d.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card The Thing That Follows da227d.yaml new file mode 100644 index 000000000..7d5a56fc7 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card The Thing That Follows da227d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290815 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Enemy +DragSelectable: true +GMNotes: '' +GUID: da227d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Thing That Follows +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.25 + posY: 3.37 + posZ: -66.23 + rotX: 359.24 + rotY: 270.01 + rotZ: 180.38 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card The Tower • XVI cc65f3.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card The Tower • XVI cc65f3.yaml new file mode 100644 index 000000000..79721606c --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card The Tower • XVI cc65f3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290320 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Circumstances Beyond Your Control +DragSelectable: true +GMNotes: '' +GUID: cc65f3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "The Tower \u2022 XVI" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.32 + posY: 3.37 + posZ: -66.28 + rotX: 359.39 + rotY: 270.01 + rotZ: 180.63 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card The Tower • XVI d5c93d.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card The Tower • XVI d5c93d.yaml new file mode 100644 index 000000000..136dc0b19 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card The Tower • XVI d5c93d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 290320 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Circumstances Beyond Your Control +DragSelectable: true +GMNotes: '' +GUID: d5c93d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "The Tower \u2022 XVI" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -56.86 + posY: 3.33 + posZ: -61.1 + rotX: 2.25 + rotY: 269.93 + rotZ: 177.24 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Through the Gates 31f72f.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Through the Gates 31f72f.yaml new file mode 100644 index 000000000..76ac847d9 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Through the Gates 31f72f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 291019 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2910': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 31f72f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Through the Gates +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.32 + posY: 3.37 + posZ: -66.28 + rotX: 359.39 + rotY: 270.01 + rotZ: 180.63 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Through the Gates fd9c56.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Through the Gates fd9c56.yaml new file mode 100644 index 000000000..13e112ebd --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Through the Gates fd9c56.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 291019 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2910': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: fd9c56 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Through the Gates +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.32 + posY: 3.37 + posZ: -66.28 + rotX: 359.39 + rotY: 270.01 + rotZ: 180.63 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml new file mode 100644 index 000000000..5193ac150 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438124 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: a5be8b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Unspeakable Oath (Bloodthirst) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.32 + posY: 3.37 + posZ: -66.28 + rotX: 359.39 + rotY: 270.01 + rotZ: 180.63 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Cowardice) ea0fa1.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Cowardice) ea0fa1.yaml new file mode 100644 index 000000000..5db594c3f --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Cowardice) ea0fa1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438122 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: ea0fa1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Unspeakable Oath (Cowardice) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.32 + posY: 3.37 + posZ: -66.28 + rotX: 359.39 + rotY: 270.01 + rotZ: 180.63 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Curiosity) f6aba5.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Curiosity) f6aba5.yaml new file mode 100644 index 000000000..e0bbe384e --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Unspeakable Oath (Curiosity) f6aba5.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438123 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: f6aba5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Unspeakable Oath (Curiosity) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.49 + posY: 3.38 + posZ: -66.28 + rotX: 359.78 + rotY: 270.01 + rotZ: 180.64 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Bag Random Basic Weaknesses 770c4e/Card Your Worst Nightmare 406ab2.yaml b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Your Worst Nightmare 406ab2.yaml new file mode 100644 index 000000000..09c2afe13 --- /dev/null +++ b/unpacked/Bag Random Basic Weaknesses 770c4e/Card Your Worst Nightmare 406ab2.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 438128 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Basic Weakness +DragSelectable: true +GMNotes: '' +GUID: 406ab2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Your Worst Nightmare +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -66.71 + posY: 3.38 + posZ: -66.09 + rotX: 0.34 + rotY: 270.01 + rotZ: 179.7 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model 032300.ttslua b/unpacked/Custom_Model 032300.ttslua index e92143ce9..3308d2100 100644 --- a/unpacked/Custom_Model 032300.ttslua +++ b/unpacked/Custom_Model 032300.ttslua @@ -1,113 +1,113 @@ ---Counting Bowl by MrStump - ---Table of items which can be counted in this Bowl ---Each entry has 2 things to enter - --a name (what is in the name field of that object) - --a value (how much it is worth) ---A number in the items description will override the number entry in this table -validCountItemList = { - ["Clue"] = 1, - [""] = 1, - --["Name3"] = 2, - --["Name4"] = 31, - --Add more entries as needed - --Remove the -- from before a line for the script to use it -} - ---END OF CODE TO EDIT - -function onLoad() - timerID = self.getGUID()..math.random(9999999999999) - --Sets position/color for the button, spawns it - self.createButton({ - label="", click_function="removeAllClues", function_owner=self, - position={0,0,0}, rotation={0,8,0}, height=0, width=0, - font_color={0,0,0}, font_size=2000 - }) - --Start timer which repeats forever, running countItems() every second - Timer.create({ - identifier=timerID, - function_name="countItems", function_owner=self, - repetitions=0, delay=1 - }) - exposedValue = 0 - trashCan = getObjectFromGUID("147e80") -end - -function findValidItemsInSphere() - return filterByValidity(findItemsInSphere()) -end - ---Activated once per second, counts items in bowls -function countItems() - local totalValue = -1 - local countableItems = findValidItemsInSphere() - for ind, entry in ipairs(countableItems) do - local descValue = tonumber(entry.hit_object.getDescription()) - local stackMult = math.abs(entry.hit_object.getQuantity()) - --Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - --Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult - end - end - exposedValue = totalValue - --Updates the number display - self.editButton({index=0, label=totalValue}) -end - -function filterByValidity(items) - retval = {} - for _, entry in ipairs(items) do - --Ignore the bowl - if entry.hit_object ~= self then - --Ignore if not in validCountItemList - local tableEntry = validCountItemList[entry.hit_object.getName()] - if tableEntry ~= nil then - table.insert(retval, entry) - end - end - end - return retval -end - - ---Gets the items in the bowl for countItems to count -function findItemsInSphere() - --Find scaling factor - local scale = self.getScale() - --Set position for the sphere - local pos = self.getPosition() - pos.y=pos.y+(1.25*scale.y) - --Ray trace to get all objects - return Physics.cast({ - origin=pos, direction={0,1,0}, type=2, max_distance=0, - size={6*scale.x,6*scale.y,6*scale.z}, --debug=true - }) -end - -function removeAllClues() - startLuaCoroutine(self, "clueRemovalCoroutine") -end - -function clueRemovalCoroutine() - for _, entry in ipairs(findValidItemsInSphere()) do - -- Do not put the table in the garbage - if entry.hit_object.getGUID() ~= "4ee1f2" then - --delay for animation purposes - for k=1,10 do - coroutine.yield(0) - end - trashCan.putObject(entry.hit_object) - end - end - --coroutines must return a value - return 1 -end - - -function onDestroy() - Timer.destroy(timerID) +--Counting Bowl by MrStump + +--Table of items which can be counted in this Bowl +--Each entry has 2 things to enter + --a name (what is in the name field of that object) + --a value (how much it is worth) +--A number in the items description will override the number entry in this table +validCountItemList = { + ["Clue"] = 1, + [""] = 1, + --["Name3"] = 2, + --["Name4"] = 31, + --Add more entries as needed + --Remove the -- from before a line for the script to use it +} + +--END OF CODE TO EDIT + +function onLoad() + timerID = self.getGUID()..math.random(9999999999999) + --Sets position/color for the button, spawns it + self.createButton({ + label="", click_function="removeAllClues", function_owner=self, + position={0,0,0}, rotation={0,8,0}, height=0, width=0, + font_color={0,0,0}, font_size=2000 + }) + --Start timer which repeats forever, running countItems() every second + Timer.create({ + identifier=timerID, + function_name="countItems", function_owner=self, + repetitions=0, delay=1 + }) + exposedValue = 0 + trashCan = getObjectFromGUID("147e80") +end + +function findValidItemsInSphere() + return filterByValidity(findItemsInSphere()) +end + +--Activated once per second, counts items in bowls +function countItems() + local totalValue = -1 + local countableItems = findValidItemsInSphere() + for ind, entry in ipairs(countableItems) do + local descValue = tonumber(entry.hit_object.getDescription()) + local stackMult = math.abs(entry.hit_object.getQuantity()) + --Use value in description if available + if descValue ~= nil then + totalValue = totalValue + descValue * stackMult + else + --Otherwise use the value in validCountItemList + totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult + end + end + exposedValue = totalValue + --Updates the number display + self.editButton({index=0, label=totalValue}) +end + +function filterByValidity(items) + retval = {} + for _, entry in ipairs(items) do + --Ignore the bowl + if entry.hit_object ~= self then + --Ignore if not in validCountItemList + local tableEntry = validCountItemList[entry.hit_object.getName()] + if tableEntry ~= nil then + table.insert(retval, entry) + end + end + end + return retval +end + + +--Gets the items in the bowl for countItems to count +function findItemsInSphere() + --Find scaling factor + local scale = self.getScale() + --Set position for the sphere + local pos = self.getPosition() + pos.y=pos.y+(1.25*scale.y) + --Ray trace to get all objects + return Physics.cast({ + origin=pos, direction={0,1,0}, type=2, max_distance=0, + size={6*scale.x,6*scale.y,6*scale.z}, --debug=true + }) +end + +function removeAllClues() + startLuaCoroutine(self, "clueRemovalCoroutine") +end + +function clueRemovalCoroutine() + for _, entry in ipairs(findValidItemsInSphere()) do + -- Do not put the table in the garbage + if entry.hit_object.getGUID() ~= "4ee1f2" then + --delay for animation purposes + for k=1,10 do + coroutine.yield(0) + end + trashCan.putObject(entry.hit_object) + end + end + --coroutines must return a value + return 1 +end + + +function onDestroy() + Timer.destroy(timerID) end \ No newline at end of file diff --git a/unpacked/Custom_Model 0a3b03.yaml b/unpacked/Custom_Model 0a3b03.yaml index 8cccd2979..aab4df873 100644 --- a/unpacked/Custom_Model 0a3b03.yaml +++ b/unpacked/Custom_Model 0a3b03.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.141085863 - g: 0.141085863 - r: 0.141085863 + b: 0.141084313 + g: 0.141084313 + r: 0.141084313 CustomMesh: CastShadows: true ColliderURL: '' diff --git a/unpacked/Custom_Model 0c05e4.yaml b/unpacked/Custom_Model 0c05e4.yaml index 6667a0ca5..954c97998 100644 --- a/unpacked/Custom_Model 0c05e4.yaml +++ b/unpacked/Custom_Model 0c05e4.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.141085863 - g: 0.141085863 - r: 0.141085863 + b: 0.141084313 + g: 0.141084313 + r: 0.141084313 CustomMesh: CastShadows: true ColliderURL: '' diff --git a/unpacked/Custom_Model 1769ed.ttslua b/unpacked/Custom_Model 1769ed.ttslua index e92143ce9..3308d2100 100644 --- a/unpacked/Custom_Model 1769ed.ttslua +++ b/unpacked/Custom_Model 1769ed.ttslua @@ -1,113 +1,113 @@ ---Counting Bowl by MrStump - ---Table of items which can be counted in this Bowl ---Each entry has 2 things to enter - --a name (what is in the name field of that object) - --a value (how much it is worth) ---A number in the items description will override the number entry in this table -validCountItemList = { - ["Clue"] = 1, - [""] = 1, - --["Name3"] = 2, - --["Name4"] = 31, - --Add more entries as needed - --Remove the -- from before a line for the script to use it -} - ---END OF CODE TO EDIT - -function onLoad() - timerID = self.getGUID()..math.random(9999999999999) - --Sets position/color for the button, spawns it - self.createButton({ - label="", click_function="removeAllClues", function_owner=self, - position={0,0,0}, rotation={0,8,0}, height=0, width=0, - font_color={0,0,0}, font_size=2000 - }) - --Start timer which repeats forever, running countItems() every second - Timer.create({ - identifier=timerID, - function_name="countItems", function_owner=self, - repetitions=0, delay=1 - }) - exposedValue = 0 - trashCan = getObjectFromGUID("147e80") -end - -function findValidItemsInSphere() - return filterByValidity(findItemsInSphere()) -end - ---Activated once per second, counts items in bowls -function countItems() - local totalValue = -1 - local countableItems = findValidItemsInSphere() - for ind, entry in ipairs(countableItems) do - local descValue = tonumber(entry.hit_object.getDescription()) - local stackMult = math.abs(entry.hit_object.getQuantity()) - --Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - --Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult - end - end - exposedValue = totalValue - --Updates the number display - self.editButton({index=0, label=totalValue}) -end - -function filterByValidity(items) - retval = {} - for _, entry in ipairs(items) do - --Ignore the bowl - if entry.hit_object ~= self then - --Ignore if not in validCountItemList - local tableEntry = validCountItemList[entry.hit_object.getName()] - if tableEntry ~= nil then - table.insert(retval, entry) - end - end - end - return retval -end - - ---Gets the items in the bowl for countItems to count -function findItemsInSphere() - --Find scaling factor - local scale = self.getScale() - --Set position for the sphere - local pos = self.getPosition() - pos.y=pos.y+(1.25*scale.y) - --Ray trace to get all objects - return Physics.cast({ - origin=pos, direction={0,1,0}, type=2, max_distance=0, - size={6*scale.x,6*scale.y,6*scale.z}, --debug=true - }) -end - -function removeAllClues() - startLuaCoroutine(self, "clueRemovalCoroutine") -end - -function clueRemovalCoroutine() - for _, entry in ipairs(findValidItemsInSphere()) do - -- Do not put the table in the garbage - if entry.hit_object.getGUID() ~= "4ee1f2" then - --delay for animation purposes - for k=1,10 do - coroutine.yield(0) - end - trashCan.putObject(entry.hit_object) - end - end - --coroutines must return a value - return 1 -end - - -function onDestroy() - Timer.destroy(timerID) +--Counting Bowl by MrStump + +--Table of items which can be counted in this Bowl +--Each entry has 2 things to enter + --a name (what is in the name field of that object) + --a value (how much it is worth) +--A number in the items description will override the number entry in this table +validCountItemList = { + ["Clue"] = 1, + [""] = 1, + --["Name3"] = 2, + --["Name4"] = 31, + --Add more entries as needed + --Remove the -- from before a line for the script to use it +} + +--END OF CODE TO EDIT + +function onLoad() + timerID = self.getGUID()..math.random(9999999999999) + --Sets position/color for the button, spawns it + self.createButton({ + label="", click_function="removeAllClues", function_owner=self, + position={0,0,0}, rotation={0,8,0}, height=0, width=0, + font_color={0,0,0}, font_size=2000 + }) + --Start timer which repeats forever, running countItems() every second + Timer.create({ + identifier=timerID, + function_name="countItems", function_owner=self, + repetitions=0, delay=1 + }) + exposedValue = 0 + trashCan = getObjectFromGUID("147e80") +end + +function findValidItemsInSphere() + return filterByValidity(findItemsInSphere()) +end + +--Activated once per second, counts items in bowls +function countItems() + local totalValue = -1 + local countableItems = findValidItemsInSphere() + for ind, entry in ipairs(countableItems) do + local descValue = tonumber(entry.hit_object.getDescription()) + local stackMult = math.abs(entry.hit_object.getQuantity()) + --Use value in description if available + if descValue ~= nil then + totalValue = totalValue + descValue * stackMult + else + --Otherwise use the value in validCountItemList + totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult + end + end + exposedValue = totalValue + --Updates the number display + self.editButton({index=0, label=totalValue}) +end + +function filterByValidity(items) + retval = {} + for _, entry in ipairs(items) do + --Ignore the bowl + if entry.hit_object ~= self then + --Ignore if not in validCountItemList + local tableEntry = validCountItemList[entry.hit_object.getName()] + if tableEntry ~= nil then + table.insert(retval, entry) + end + end + end + return retval +end + + +--Gets the items in the bowl for countItems to count +function findItemsInSphere() + --Find scaling factor + local scale = self.getScale() + --Set position for the sphere + local pos = self.getPosition() + pos.y=pos.y+(1.25*scale.y) + --Ray trace to get all objects + return Physics.cast({ + origin=pos, direction={0,1,0}, type=2, max_distance=0, + size={6*scale.x,6*scale.y,6*scale.z}, --debug=true + }) +end + +function removeAllClues() + startLuaCoroutine(self, "clueRemovalCoroutine") +end + +function clueRemovalCoroutine() + for _, entry in ipairs(findValidItemsInSphere()) do + -- Do not put the table in the garbage + if entry.hit_object.getGUID() ~= "4ee1f2" then + --delay for animation purposes + for k=1,10 do + coroutine.yield(0) + end + trashCan.putObject(entry.hit_object) + end + end + --coroutines must return a value + return 1 +end + + +function onDestroy() + Timer.destroy(timerID) end \ No newline at end of file diff --git a/unpacked/Custom_Model 37be78.ttslua b/unpacked/Custom_Model 37be78.ttslua index e92143ce9..3308d2100 100644 --- a/unpacked/Custom_Model 37be78.ttslua +++ b/unpacked/Custom_Model 37be78.ttslua @@ -1,113 +1,113 @@ ---Counting Bowl by MrStump - ---Table of items which can be counted in this Bowl ---Each entry has 2 things to enter - --a name (what is in the name field of that object) - --a value (how much it is worth) ---A number in the items description will override the number entry in this table -validCountItemList = { - ["Clue"] = 1, - [""] = 1, - --["Name3"] = 2, - --["Name4"] = 31, - --Add more entries as needed - --Remove the -- from before a line for the script to use it -} - ---END OF CODE TO EDIT - -function onLoad() - timerID = self.getGUID()..math.random(9999999999999) - --Sets position/color for the button, spawns it - self.createButton({ - label="", click_function="removeAllClues", function_owner=self, - position={0,0,0}, rotation={0,8,0}, height=0, width=0, - font_color={0,0,0}, font_size=2000 - }) - --Start timer which repeats forever, running countItems() every second - Timer.create({ - identifier=timerID, - function_name="countItems", function_owner=self, - repetitions=0, delay=1 - }) - exposedValue = 0 - trashCan = getObjectFromGUID("147e80") -end - -function findValidItemsInSphere() - return filterByValidity(findItemsInSphere()) -end - ---Activated once per second, counts items in bowls -function countItems() - local totalValue = -1 - local countableItems = findValidItemsInSphere() - for ind, entry in ipairs(countableItems) do - local descValue = tonumber(entry.hit_object.getDescription()) - local stackMult = math.abs(entry.hit_object.getQuantity()) - --Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - --Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult - end - end - exposedValue = totalValue - --Updates the number display - self.editButton({index=0, label=totalValue}) -end - -function filterByValidity(items) - retval = {} - for _, entry in ipairs(items) do - --Ignore the bowl - if entry.hit_object ~= self then - --Ignore if not in validCountItemList - local tableEntry = validCountItemList[entry.hit_object.getName()] - if tableEntry ~= nil then - table.insert(retval, entry) - end - end - end - return retval -end - - ---Gets the items in the bowl for countItems to count -function findItemsInSphere() - --Find scaling factor - local scale = self.getScale() - --Set position for the sphere - local pos = self.getPosition() - pos.y=pos.y+(1.25*scale.y) - --Ray trace to get all objects - return Physics.cast({ - origin=pos, direction={0,1,0}, type=2, max_distance=0, - size={6*scale.x,6*scale.y,6*scale.z}, --debug=true - }) -end - -function removeAllClues() - startLuaCoroutine(self, "clueRemovalCoroutine") -end - -function clueRemovalCoroutine() - for _, entry in ipairs(findValidItemsInSphere()) do - -- Do not put the table in the garbage - if entry.hit_object.getGUID() ~= "4ee1f2" then - --delay for animation purposes - for k=1,10 do - coroutine.yield(0) - end - trashCan.putObject(entry.hit_object) - end - end - --coroutines must return a value - return 1 -end - - -function onDestroy() - Timer.destroy(timerID) +--Counting Bowl by MrStump + +--Table of items which can be counted in this Bowl +--Each entry has 2 things to enter + --a name (what is in the name field of that object) + --a value (how much it is worth) +--A number in the items description will override the number entry in this table +validCountItemList = { + ["Clue"] = 1, + [""] = 1, + --["Name3"] = 2, + --["Name4"] = 31, + --Add more entries as needed + --Remove the -- from before a line for the script to use it +} + +--END OF CODE TO EDIT + +function onLoad() + timerID = self.getGUID()..math.random(9999999999999) + --Sets position/color for the button, spawns it + self.createButton({ + label="", click_function="removeAllClues", function_owner=self, + position={0,0,0}, rotation={0,8,0}, height=0, width=0, + font_color={0,0,0}, font_size=2000 + }) + --Start timer which repeats forever, running countItems() every second + Timer.create({ + identifier=timerID, + function_name="countItems", function_owner=self, + repetitions=0, delay=1 + }) + exposedValue = 0 + trashCan = getObjectFromGUID("147e80") +end + +function findValidItemsInSphere() + return filterByValidity(findItemsInSphere()) +end + +--Activated once per second, counts items in bowls +function countItems() + local totalValue = -1 + local countableItems = findValidItemsInSphere() + for ind, entry in ipairs(countableItems) do + local descValue = tonumber(entry.hit_object.getDescription()) + local stackMult = math.abs(entry.hit_object.getQuantity()) + --Use value in description if available + if descValue ~= nil then + totalValue = totalValue + descValue * stackMult + else + --Otherwise use the value in validCountItemList + totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult + end + end + exposedValue = totalValue + --Updates the number display + self.editButton({index=0, label=totalValue}) +end + +function filterByValidity(items) + retval = {} + for _, entry in ipairs(items) do + --Ignore the bowl + if entry.hit_object ~= self then + --Ignore if not in validCountItemList + local tableEntry = validCountItemList[entry.hit_object.getName()] + if tableEntry ~= nil then + table.insert(retval, entry) + end + end + end + return retval +end + + +--Gets the items in the bowl for countItems to count +function findItemsInSphere() + --Find scaling factor + local scale = self.getScale() + --Set position for the sphere + local pos = self.getPosition() + pos.y=pos.y+(1.25*scale.y) + --Ray trace to get all objects + return Physics.cast({ + origin=pos, direction={0,1,0}, type=2, max_distance=0, + size={6*scale.x,6*scale.y,6*scale.z}, --debug=true + }) +end + +function removeAllClues() + startLuaCoroutine(self, "clueRemovalCoroutine") +end + +function clueRemovalCoroutine() + for _, entry in ipairs(findValidItemsInSphere()) do + -- Do not put the table in the garbage + if entry.hit_object.getGUID() ~= "4ee1f2" then + --delay for animation purposes + for k=1,10 do + coroutine.yield(0) + end + trashCan.putObject(entry.hit_object) + end + end + --coroutines must return a value + return 1 +end + + +function onDestroy() + Timer.destroy(timerID) end \ No newline at end of file diff --git a/unpacked/Custom_Model b486bd.yaml b/unpacked/Custom_Model b486bd.yaml index cbe138d95..8a79d00d7 100644 --- a/unpacked/Custom_Model b486bd.yaml +++ b/unpacked/Custom_Model b486bd.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.141085863 - g: 0.141085863 - r: 0.141085863 + b: 0.141084313 + g: 0.141084313 + r: 0.141084313 CustomMesh: CastShadows: true ColliderURL: '' diff --git a/unpacked/Custom_Model d86b7c.ttslua b/unpacked/Custom_Model d86b7c.ttslua index e92143ce9..3308d2100 100644 --- a/unpacked/Custom_Model d86b7c.ttslua +++ b/unpacked/Custom_Model d86b7c.ttslua @@ -1,113 +1,113 @@ ---Counting Bowl by MrStump - ---Table of items which can be counted in this Bowl ---Each entry has 2 things to enter - --a name (what is in the name field of that object) - --a value (how much it is worth) ---A number in the items description will override the number entry in this table -validCountItemList = { - ["Clue"] = 1, - [""] = 1, - --["Name3"] = 2, - --["Name4"] = 31, - --Add more entries as needed - --Remove the -- from before a line for the script to use it -} - ---END OF CODE TO EDIT - -function onLoad() - timerID = self.getGUID()..math.random(9999999999999) - --Sets position/color for the button, spawns it - self.createButton({ - label="", click_function="removeAllClues", function_owner=self, - position={0,0,0}, rotation={0,8,0}, height=0, width=0, - font_color={0,0,0}, font_size=2000 - }) - --Start timer which repeats forever, running countItems() every second - Timer.create({ - identifier=timerID, - function_name="countItems", function_owner=self, - repetitions=0, delay=1 - }) - exposedValue = 0 - trashCan = getObjectFromGUID("147e80") -end - -function findValidItemsInSphere() - return filterByValidity(findItemsInSphere()) -end - ---Activated once per second, counts items in bowls -function countItems() - local totalValue = -1 - local countableItems = findValidItemsInSphere() - for ind, entry in ipairs(countableItems) do - local descValue = tonumber(entry.hit_object.getDescription()) - local stackMult = math.abs(entry.hit_object.getQuantity()) - --Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - --Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult - end - end - exposedValue = totalValue - --Updates the number display - self.editButton({index=0, label=totalValue}) -end - -function filterByValidity(items) - retval = {} - for _, entry in ipairs(items) do - --Ignore the bowl - if entry.hit_object ~= self then - --Ignore if not in validCountItemList - local tableEntry = validCountItemList[entry.hit_object.getName()] - if tableEntry ~= nil then - table.insert(retval, entry) - end - end - end - return retval -end - - ---Gets the items in the bowl for countItems to count -function findItemsInSphere() - --Find scaling factor - local scale = self.getScale() - --Set position for the sphere - local pos = self.getPosition() - pos.y=pos.y+(1.25*scale.y) - --Ray trace to get all objects - return Physics.cast({ - origin=pos, direction={0,1,0}, type=2, max_distance=0, - size={6*scale.x,6*scale.y,6*scale.z}, --debug=true - }) -end - -function removeAllClues() - startLuaCoroutine(self, "clueRemovalCoroutine") -end - -function clueRemovalCoroutine() - for _, entry in ipairs(findValidItemsInSphere()) do - -- Do not put the table in the garbage - if entry.hit_object.getGUID() ~= "4ee1f2" then - --delay for animation purposes - for k=1,10 do - coroutine.yield(0) - end - trashCan.putObject(entry.hit_object) - end - end - --coroutines must return a value - return 1 -end - - -function onDestroy() - Timer.destroy(timerID) +--Counting Bowl by MrStump + +--Table of items which can be counted in this Bowl +--Each entry has 2 things to enter + --a name (what is in the name field of that object) + --a value (how much it is worth) +--A number in the items description will override the number entry in this table +validCountItemList = { + ["Clue"] = 1, + [""] = 1, + --["Name3"] = 2, + --["Name4"] = 31, + --Add more entries as needed + --Remove the -- from before a line for the script to use it +} + +--END OF CODE TO EDIT + +function onLoad() + timerID = self.getGUID()..math.random(9999999999999) + --Sets position/color for the button, spawns it + self.createButton({ + label="", click_function="removeAllClues", function_owner=self, + position={0,0,0}, rotation={0,8,0}, height=0, width=0, + font_color={0,0,0}, font_size=2000 + }) + --Start timer which repeats forever, running countItems() every second + Timer.create({ + identifier=timerID, + function_name="countItems", function_owner=self, + repetitions=0, delay=1 + }) + exposedValue = 0 + trashCan = getObjectFromGUID("147e80") +end + +function findValidItemsInSphere() + return filterByValidity(findItemsInSphere()) +end + +--Activated once per second, counts items in bowls +function countItems() + local totalValue = -1 + local countableItems = findValidItemsInSphere() + for ind, entry in ipairs(countableItems) do + local descValue = tonumber(entry.hit_object.getDescription()) + local stackMult = math.abs(entry.hit_object.getQuantity()) + --Use value in description if available + if descValue ~= nil then + totalValue = totalValue + descValue * stackMult + else + --Otherwise use the value in validCountItemList + totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult + end + end + exposedValue = totalValue + --Updates the number display + self.editButton({index=0, label=totalValue}) +end + +function filterByValidity(items) + retval = {} + for _, entry in ipairs(items) do + --Ignore the bowl + if entry.hit_object ~= self then + --Ignore if not in validCountItemList + local tableEntry = validCountItemList[entry.hit_object.getName()] + if tableEntry ~= nil then + table.insert(retval, entry) + end + end + end + return retval +end + + +--Gets the items in the bowl for countItems to count +function findItemsInSphere() + --Find scaling factor + local scale = self.getScale() + --Set position for the sphere + local pos = self.getPosition() + pos.y=pos.y+(1.25*scale.y) + --Ray trace to get all objects + return Physics.cast({ + origin=pos, direction={0,1,0}, type=2, max_distance=0, + size={6*scale.x,6*scale.y,6*scale.z}, --debug=true + }) +end + +function removeAllClues() + startLuaCoroutine(self, "clueRemovalCoroutine") +end + +function clueRemovalCoroutine() + for _, entry in ipairs(findValidItemsInSphere()) do + -- Do not put the table in the garbage + if entry.hit_object.getGUID() ~= "4ee1f2" then + --delay for animation purposes + for k=1,10 do + coroutine.yield(0) + end + trashCan.putObject(entry.hit_object) + end + end + --coroutines must return a value + return 1 +end + + +function onDestroy() + Timer.destroy(timerID) end \ No newline at end of file diff --git a/unpacked/Custom_Model Custom Data Helper c0b834.ttslua b/unpacked/Custom_Model Custom Data Helper c0b834.ttslua index 3dbaffb65..fa8727391 100644 --- a/unpacked/Custom_Model Custom Data Helper c0b834.ttslua +++ b/unpacked/Custom_Model Custom Data Helper c0b834.ttslua @@ -1,37 +1,37 @@ --- set true to enable debug logging -DEBUG = false - -function log(message) - if DEBUG then - print(message) - end -end - ---[[ -Known locations and clues. We check this to determine if we should -atttempt to spawn clues, first we look for _ and if -we find nothing we look for -format is [location_guid -> clueCount] -]] -LOCATIONS_DATA_JSON = [[ -{ - "San Francisco": {"type": "fixed", "value": 1, "clueSide": "back"}, - " Arkham": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Buenos Aires": {"type": "fixed", "value": 2, "clueSide": "back"}, - " London": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Rome": {"type": "perPlayer", "value": 3, "clueSide": "front"}, - "Istanbul": {"type": "perPlayer", "value": 4, "clueSide": "front"}, - "Tokyo_123abc": {"type": "perPlayer", "value": 0, "clueSide": "back"}, +-- set true to enable debug logging +DEBUG = false + +function log(message) + if DEBUG then + print(message) + end +end + +--[[ +Known locations and clues. We check this to determine if we should +atttempt to spawn clues, first we look for _ and if +we find nothing we look for +format is [location_guid -> clueCount] +]] +LOCATIONS_DATA_JSON = [[ +{ + "San Francisco": {"type": "fixed", "value": 1, "clueSide": "back"}, + " Arkham": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Buenos Aires": {"type": "fixed", "value": 2, "clueSide": "back"}, + " London": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Rome": {"type": "perPlayer", "value": 3, "clueSide": "front"}, + "Istanbul": {"type": "perPlayer", "value": 4, "clueSide": "front"}, + "Tokyo_123abc": {"type": "perPlayer", "value": 0, "clueSide": "back"}, "Tokyo_456efg": {"type": "perPlayer", "value": 4, "clueSide": "back"}, "Tokyo": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Shanghai_123": {"type": "fixed", "value": 12, "clueSide": "front"}, - "Sydney": {"type": "fixed", "value": 0, "clueSide": "front"} -} -]] - -LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) - -function onload(save_state) - local playArea = getObjectFromGUID('721ba2') - playArea.call("updateLocations", {self.getGUID()}) -end + "Shanghai_123": {"type": "fixed", "value": 12, "clueSide": "front"}, + "Sydney": {"type": "fixed", "value": 0, "clueSide": "front"} +} +]] + +LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) + +function onload(save_state) + local playArea = getObjectFromGUID('721ba2') + playArea.call("updateLocations", {self.getGUID()}) +end diff --git a/unpacked/Custom_Model Neutral 5954d0.yaml b/unpacked/Custom_Model Neutral 5954d0.yaml index fb77501fc..a34d47f42 100644 --- a/unpacked/Custom_Model Neutral 5954d0.yaml +++ b/unpacked/Custom_Model Neutral 5954d0.yaml @@ -256,7 +256,7 @@ Transform: posY: 1.6 posZ: -21.1 rotX: 359.92 - rotY: 269.96 + rotY: 269.95 rotZ: 0.02 scaleX: 0.45 scaleY: 0.6 diff --git a/unpacked/Custom_Model Neutral b79001.yaml b/unpacked/Custom_Model Neutral b79001.yaml index e786296fc..6321829d8 100644 --- a/unpacked/Custom_Model Neutral b79001.yaml +++ b/unpacked/Custom_Model Neutral b79001.yaml @@ -256,7 +256,7 @@ Transform: posY: 1.57 posZ: 19.26 rotX: 359.98 - rotY: 359.95 + rotY: 359.94 rotZ: 359.92 scaleX: 0.45 scaleY: 0.6 diff --git a/unpacked/Custom_Model Neutral eec4ca.yaml b/unpacked/Custom_Model Neutral eec4ca.yaml index 6efe76238..ba682b0ef 100644 --- a/unpacked/Custom_Model Neutral eec4ca.yaml +++ b/unpacked/Custom_Model Neutral eec4ca.yaml @@ -256,7 +256,7 @@ Transform: posY: 1.62 posZ: 23.5 rotX: 359.92 - rotY: 269.97 + rotY: 269.96 rotZ: 0.02 scaleX: 0.45 scaleY: 0.6 diff --git a/unpacked/Custom_Model_Bag Arkhamdb bag b85d6d.ttslua b/unpacked/Custom_Model_Bag Arkhamdb bag b85d6d.ttslua deleted file mode 100644 index edbcb88e7..000000000 --- a/unpacked/Custom_Model_Bag Arkhamdb bag b85d6d.ttslua +++ /dev/null @@ -1,36 +0,0 @@ -function onLoad() - - - - - ---self.interactable = false -self.createButton({ - click_function= "onButtonClick", - function_owner= self, - position= {0, 1.84, 0}, - width = 1500, - height = 1000, - color = {0,0,0,0}, - tooltip= "click here to load cards first", -})end - -function onButtonClick(obj, playerColor) -if Player[playerColor].admin and self.getQuantity() > 0 then - - - - --AllCard Deck - self.takeObject ({ - position= {-63.36, 5, -65.69}, - rotation = {180,90,0}, - smooth= true,}) - - --AllCard Deck - self.takeObject ({ - position= {-63.34, 1.43, -77.75}, - rotation = {180,90,0}, - smooth= true,}) - -end -end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Arkhamdb bag b85d6d/Deck 4141fb.yaml b/unpacked/Custom_Model_Bag Arkhamdb bag b85d6d/Deck 4141fb.yaml deleted file mode 100644 index 1fe4c091a..000000000 --- a/unpacked/Custom_Model_Bag Arkhamdb bag b85d6d/Deck 4141fb.yaml +++ /dev/null @@ -1,46700 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 -ContainedObjects: -- Autoraise: true - CardID: 266322 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 90fdb0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Teachings of the Order - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -45.7781334 - posY: 1.30384433 - posZ: -64.75425 - rotX: 0.0167709477 - rotY: 180.0 - rotZ: 359.9792 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 273000 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2730': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280920105/BBE662BDDC5F2C94A5DE10256B991D1E1DD2C50D/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 242a11 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Liber Omnium Finium - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -45.88552 - posY: 1.30724609 - posZ: -52.9994659 - rotX: 0.02080839 - rotY: 269.9999 - rotZ: 0.0167707652 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 273100 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2731': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280920329/24678C1EA9F75CE15164134ACF04BD5642D9F434/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: Dark Revelations - DragSelectable: true - GMNotes: '' - GUID: 782e0a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Ruth Westmacott - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.3682747 - posY: 1.30957115 - posZ: -49.4203262 - rotX: 0.020808151 - rotY: 270.000031 - rotZ: 0.0167707819 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538719 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6b2e97 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Grotesque Statue (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.40162 - posY: 3.28469515 - posZ: -73.7900848 - rotX: 0.0208099112 - rotY: 270.001343 - rotZ: 0.0167665463 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230502 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2305': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fa777f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Foolishness - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.8825455 - posY: 3.39966679 - posZ: -65.17031 - rotX: 0.0208071936 - rotY: 270.010773 - rotZ: 0.0167639218 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430655 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Acidic Ichor - DragSelectable: true - GMNotes: '' - GUID: fa61ba - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Strange Solution (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05001 - posY: 1.41577017 - posZ: -22.40999 - rotX: 359.987427 - rotY: 270.000061 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430647 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 19ab7c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Otherworldly Compass (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.4095664 - posZ: 0.590019166 - rotX: 359.987427 - rotY: 270.000122 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538811 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Hunter of Rare Books - DragSelectable: true - GMNotes: '' - GUID: 3c5099 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Whitton Greene - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.12978 - posY: 3.28261662 - posZ: -79.15238 - rotX: 0.0208093058 - rotY: 269.997253 - rotZ: 0.0167690311 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 294203 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2942': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Ally. Sorcerer. - DragSelectable: true - GMNotes: '' - GUID: 37a76b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lady Esprit - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -62.02124 - posY: 1.761565 - posZ: 6.88063335 - rotX: 359.381683 - rotY: 269.978363 - rotZ: 359.9881 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230321 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Will Try Anything Once - DragSelectable: true - GMNotes: '' - GUID: 9683d0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Olive McBride - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0000019 - posY: 1.33406186 - posZ: 73.65 - rotX: 0.0207990929 - rotY: 270.0313 - rotZ: 0.0167859346 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368423 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Working on Something Big - DragSelectable: true - GMNotes: '' - GUID: 234ff6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dr. William T. Maleson - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.63999271 - posY: 1.34207618 - posZ: 78.25001 - rotX: 0.02081484 - rotY: 269.978821 - rotZ: 0.016766822 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230337 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b2e27e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fearless (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.40682483 - posZ: 16.6900234 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553232 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: ef91a9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Accursed Follower - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.6153374 - posY: 1.30231833 - posZ: -55.28093 - rotX: 0.0208085831 - rotY: 269.999939 - rotZ: 0.0167706572 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315249 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f8dc01 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Skeleton Key (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.41075873 - posZ: -15.8000069 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 441024 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4410': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Markings of Isis - DragSelectable: true - GMNotes: '' - GUID: 66d5a3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Archaic Glyphs (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.97676 - posY: 1.36161959 - posZ: -63.2690926 - rotX: 0.0208061747 - rotY: 270.0178 - rotZ: 0.0167769343 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379827 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3798': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 91e53c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Daring - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.1511784 - posY: 1.67444432 - posZ: 7.094112 - rotX: 359.921478 - rotY: 270.000641 - rotZ: 0.0153285637 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430637 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 378e84 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Magnifying Glass (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.40274215 - posZ: 25.8900242 - rotX: 359.987427 - rotY: 269.999939 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368528 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2acced - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ornate Bow (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.40143847 - posZ: 7.19999933 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368522 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 324e49 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Elder Sign Amulet (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.39833653 - posZ: 18.7000027 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 369945 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3699': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fe68c6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Dirge of Reason - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 85.22855 - posY: 1.54189241 - posZ: -58.0838356 - rotX: 6.124808 - rotY: 269.9939 - rotZ: 0.005484572 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368519 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8948c4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Emergency Cache (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.39523458 - posZ: 30.2000065 - rotX: 359.987427 - rotY: 269.9999 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230327 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Stygian Waymark - DragSelectable: true - GMNotes: '' - GUID: 6527a4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Chthonian Stone - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0 - posY: 1.33002234 - posZ: 59.85 - rotX: 0.0207988359 - rotY: 270.0313 - rotZ: 0.0167858377 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226309 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2db518 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Evidence! - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300049 - posY: 1.34907448 - posZ: 78.25 - rotX: 0.0207955912 - rotY: 270.027039 - rotZ: 0.0167759154 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368837 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4cfcc7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: A Test of Will (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.39796674 - posZ: 25.6000061 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430646 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f5bcec - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Encyclopedia (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.408946 - posZ: 2.89002 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450604 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '833501' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Higher Education (3) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.6853371 - posY: 1.3050797 - posZ: -50.7233467 - rotX: 0.02080844 - rotY: 269.999664 - rotZ: 0.0167704634 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430503 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2758': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9591ac - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Impromptu Barrier - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.97 - posY: 1.362529 - posZ: 82.85 - rotX: 0.0208036583 - rotY: 270.012939 - rotZ: 0.01677902 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368842 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: be4abe - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Survival Instinct (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40230942 - posZ: 9.500001 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450617 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e5d5f0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ace in the Hole (3) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.0393143 - posY: 1.410598 - posZ: -51.1383972 - rotX: 0.0208083466 - rotY: 269.999664 - rotZ: 0.0167561844 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226325 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 82775a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bandolier - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230005 - posY: 1.34716654 - posZ: 75.9500046 - rotX: 0.0208153687 - rotY: 269.9694 - rotZ: 0.01676186 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 370926 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3709': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 576d70 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Heirloom of Hyperborea - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -46.5228539 - posY: 2.19076967 - posZ: -89.842 - rotX: 359.9792 - rotY: 270.0 - rotZ: 180.005737 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 262203 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2622': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 77f92c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Expose Weakness (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.412048 - posZ: -8.60998249 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368422 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Unidentified - DragSelectable: true - GMNotes: '' - GUID: 565b6b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Strange Solution - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.639993 - posY: 1.34274948 - posZ: 80.55001 - rotX: 0.0208139587 - rotY: 269.978821 - rotZ: 0.0167658776 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545300 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Concerned Brother - DragSelectable: true - GMNotes: '' - GUID: 1bfb78 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Randall Cho - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -39.92781 - posY: 3.174865 - posZ: -71.04248 - rotX: 0.0208086073 - rotY: 270.0 - rotZ: 0.0167711042 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553600 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5536': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507630340/07BD7D0674499D3B5B315239E1B9682B6E4D8285/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d89190 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: "R\xEDastrad (1)" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 11.4375868 - posY: 1.32786059 - posZ: -53.6961937 - rotX: 0.0208083875 - rotY: 270.0 - rotZ: 0.016771039 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538626 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e503ce - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Pilfer (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.7308273 - posY: 3.28553247 - posZ: -71.91625 - rotX: 0.0208110027 - rotY: 269.9931 - rotZ: 0.0167684164 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226360 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f7a9ab - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Armor of Ardennes (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.419059 - posZ: -40.9699936 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315258 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4eb231 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hot Streak (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.749992 - posY: 1.41634226 - posZ: -36.50001 - rotX: 359.987427 - rotY: 269.9999 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553500 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5535': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507632247/1E1B6D93DBC33FA7C8DC93C7D06B7964CAD98AD0/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: dfe1ee - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Enchanted Armor (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 11.2345552 - posY: 1.32858825 - posZ: -50.958168 - rotX: 0.020808626 - rotY: 270.0001 - rotZ: 0.0167713985 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226330 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 12660b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .45 Automatic - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230007 - posY: 1.34312713 - posZ: 62.15 - rotX: 0.0208157543 - rotY: 269.969421 - rotZ: 0.016761912 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226322 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4d971e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Survival Knife - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230005 - posY: 1.3491863 - posZ: 82.85 - rotX: 0.0208167434 - rotY: 269.9694 - rotZ: 0.0167635381 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368505 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0f32e8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Run For Your Life - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 64.07 - posY: 1.36573625 - posZ: 71.35 - rotX: 0.0208081417 - rotY: 269.997284 - rotZ: 0.01677328 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553203 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: dd4a25 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Whispers from the Deep - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.5333481 - posY: 3.16565585 - posZ: -93.58446 - rotX: 0.020808652 - rotY: 269.999329 - rotZ: 0.0167703945 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553231 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 33f906 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Tempt Fate - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.5000648 - posY: 1.33136272 - posZ: -57.75174 - rotX: 0.0208095517 - rotY: 269.999939 - rotZ: 0.0167844351 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 449034 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4490': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b45c82 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Garrote Wire (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.2366447 - posY: 1.30114961 - posZ: -71.01385 - rotX: 0.0208082478 - rotY: 270.000031 - rotZ: 0.0167703424 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 377537 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3775': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 14c396 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Serpents of Yig - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 27.3039474 - posY: 1.45803213 - posZ: -82.09155 - rotX: 0.02075481 - rotY: 270.056458 - rotZ: 5.80825233 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230330 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Speaker to the Dead - DragSelectable: true - GMNotes: '' - GUID: 53867b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Alyssa Graham - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -28.4000015 - posY: 1.3361932 - posZ: 85.15 - rotX: 0.0208057817 - rotY: 270.006378 - rotZ: 0.01677696 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226310 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 831b6b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Prepared for the Worst - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300049 - posY: 1.34840119 - posZ: 75.9500046 - rotX: 0.02079622 - rotY: 270.027039 - rotZ: 0.0167754125 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 376739 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3767': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 848d9c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Finn's Trusty .38 - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 26.2706032 - posY: 1.6863116 - posZ: -50.91697 - rotX: 0.0885372162 - rotY: 269.817535 - rotZ: 4.42904139 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 371209 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3712': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cd94e3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Searching for Izzie - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 76.87588 - posY: 1.533313 - posZ: -49.37355 - rotX: 0.0206230525 - rotY: 270.0019 - rotZ: 0.0398144238 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378619 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3786': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 76147b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "\"I've had worse\u2026\" (2)" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.3595657 - posY: 3.52341747 - posZ: -65.6875458 - rotX: 0.01074947 - rotY: 270.0 - rotZ: 180.018921 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368708 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f6ff32 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Narrow Escape - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500042 - posY: 1.35478342 - posZ: 78.25 - rotX: 0.0208150763 - rotY: 269.9749 - rotZ: 0.0167657565 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545329 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ab51ce - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Physical Training (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.10324 - posY: 3.1667304 - posZ: -77.90403 - rotX: 0.0208082441 - rotY: 270.0 - rotZ: 0.0167709123 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431008 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2737': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c70ad8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Interrogate - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300068 - posY: 1.342342 - posZ: 55.2500038 - rotX: 0.02079588 - rotY: 270.027039 - rotZ: 0.0167742781 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232332 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2323': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: A Gift Unlooked For - DragSelectable: true - GMNotes: '' - GUID: f295d9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Clasp of Black Onyx - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -32.1468964 - posY: 2.3714323 - posZ: -85.77982 - rotX: 0.0208088849 - rotY: 270.0 - rotZ: 0.01677082 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538604 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f32343 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mauser C96 - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.9064865 - posY: 3.28509641 - posZ: -69.0869446 - rotX: 0.0208140537 - rotY: 269.9931 - rotZ: 0.0167599563 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277910 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2779': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6d9881 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Drawing Thin - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -27.6383247 - posY: 1.33034 - posZ: 64.20871 - rotX: 0.0208067931 - rotY: 269.999878 - rotZ: 0.01677723 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550805 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5888da - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Old Keyring - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.5689125 - posY: 3.28526974 - posZ: -69.90754 - rotX: 0.0144240744 - rotY: 270.0191 - rotZ: 0.0116343489 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230318 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7307c4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Arcane Initiate - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -27.6670818 - posY: 2.845372 - posZ: -145.168243 - rotX: 0.0208097361 - rotY: 269.99588 - rotZ: 0.0167698245 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274000 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Custom Marlin Model 1894 - DragSelectable: true - GMNotes: '' - GUID: '587589' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Becky - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -38.1976166 - posY: 1.36526275 - posZ: -62.9559174 - rotX: 0.02080465 - rotY: 270.015869 - rotZ: 0.01677605 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 376840 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3768': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ecd087 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Caught Red-Handed - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.359684 - posY: 3.53130126 - posZ: -65.6879654 - rotX: 0.0167008284 - rotY: 269.999939 - rotZ: 180.0173 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315251 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d7dbac - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Streetwise (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.41199958 - posZ: -20.4000072 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226328 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b0f851 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .32 Colt - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230006 - posY: 1.3444736 - posZ: 66.75001 - rotX: 0.0208173022 - rotY: 269.9694 - rotZ: 0.0167636052 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368407 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f69e10 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Seeking Answers - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.23999381 - posY: 1.34398425 - posZ: 80.55001 - rotX: 0.0208114088 - rotY: 269.986359 - rotZ: 0.0167681742 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538718 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e84eff - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Eldritch Inspiration (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.8112869 - posY: 3.284758 - posZ: -69.80476 - rotX: 0.0208098479 - rotY: 270.001343 - rotZ: 0.01676624 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450621 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 19b705 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scroll of Secrets (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.74354 - posY: 1.37190509 - posZ: -50.9488258 - rotX: 0.0166471563 - rotY: 270.0 - rotZ: 0.0134154055 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368403 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4167c0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: True Understanding - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 0.160006255 - posY: 1.34454572 - posZ: 78.25001 - rotX: 0.02081884 - rotY: 269.9646 - rotZ: 0.0167625323 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550809 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c8505c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scrapper - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.41421 - posY: 3.284829 - posZ: -71.58872 - rotX: 0.0144232074 - rotY: 270.0191 - rotZ: 0.0116329072 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440922 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4409': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c026c9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .32 Colt (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.7927551 - posY: 1.36278141 - posZ: -59.5280762 - rotX: 0.020805249 - rotY: 270.017761 - rotZ: 0.0167758446 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374014 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2098': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '170538' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Painted World - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 7.05049372 - posY: 0.475667953 - posZ: -49.01768 - rotX: -4.56944e-06 - rotY: 269.999939 - rotZ: 359.991943 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 444260 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3799': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f08934 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dark Insight - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 4.14029932 - posY: 1.58196938 - posZ: -77.8714752 - rotX: 7.61785269 - rotY: 269.935059 - rotZ: 0.0212708171 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315239 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2fe723 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cat Burglar (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.40269375 - posZ: 14.1000032 - rotX: 359.987427 - rotY: 269.999939 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230302 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 59b24f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Defiance - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -18.2000027 - posY: 1.33855116 - posZ: 80.55 - rotX: 0.0208174158 - rotY: 269.971 - rotZ: 0.016762618 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538706 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b67371 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Clairvoyance - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.44816 - posY: 3.28275824 - posZ: -70.06975 - rotX: 0.0208116267 - rotY: 270.001343 - rotZ: 0.0167635847 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230338 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bf3dd1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Defiance (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.40744519 - posZ: 14.3900223 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527418 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2666': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: 4ea68b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stubborn Detective - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 74.16702 - posY: 1.55374384 - posZ: 82.14298 - rotX: 0.0201055184 - rotY: 269.999329 - rotZ: 0.0164802913 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 276300 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2763': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e470cd - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Premonition - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6000023 - posY: 1.33798957 - posZ: 82.85 - rotX: 0.02081856 - rotY: 269.96698 - rotZ: 0.0167606138 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448030 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4480': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 26853e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Word of Command (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.18796 - posY: 1.29924214 - posZ: -71.38749 - rotX: 0.020774316 - rotY: 270.000275 - rotZ: 0.0167474784 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447734 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4477': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ea8324 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Expeditious Retreat (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.8898125 - posY: 1.29929137 - posZ: -71.58855 - rotX: 0.0208090525 - rotY: 269.999939 - rotZ: 0.0167720746 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538821 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Hunter of Rare Books - DragSelectable: true - GMNotes: '' - GUID: 854c79 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Whitton Greene (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.42091 - posY: 3.16698813 - posZ: -83.21507 - rotX: 0.02080918 - rotY: 269.997253 - rotZ: 0.0167694315 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 318703 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3187': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Fateful Step - DragSelectable: true - GMNotes: '' - GUID: 52a677 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ace of Rods (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.39461422 - posZ: 32.5000076 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 235840 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2358': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777501236/D145C8B748FB42258EB442B9DF36797851CEECC3/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Repossess the Past - DragSelectable: true - GMNotes: '' - GUID: 87718c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Relic of Ages - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -44.5658951 - posY: 2.845377 - posZ: -108.118523 - rotX: 0.0208081175 - rotY: 270.000061 - rotZ: 0.0167709235 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274008 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d12359 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Detached from Reality - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -41.690937 - posY: 1.366647 - posZ: -53.89291 - rotX: 0.0208033863 - rotY: 270.0197 - rotZ: 0.0167779326 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226352 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cd7b97 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stand Together (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.92969 - posY: 3.39739347 - posZ: -58.047348 - rotX: 0.0208225716 - rotY: 269.9766 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553111 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a565d5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shroud of Shadows - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.45764 - posY: 3.51918173 - posZ: -65.76698 - rotX: 0.0166519955 - rotY: 270.0 - rotZ: 180.007111 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450618 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5a51d1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sleight of Hand (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.8116264 - posY: 1.40067625 - posZ: -51.3083763 - rotX: 0.0208088011 - rotY: 269.999756 - rotZ: 0.0167914126 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230317 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0a4db3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ritual Candles - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0000019 - posY: 1.3367548 - posZ: 82.85 - rotX: 0.0207984913 - rotY: 270.0313 - rotZ: 0.01678511 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226318 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ab37af - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scene of the Crime - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6299963 - posY: 1.34166884 - posZ: 52.9499969 - rotX: 0.0207941569 - rotY: 270.027039 - rotZ: 0.0167764034 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430642 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 95272b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Deduction (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.40646446 - posZ: 12.090023 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 265502 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2655': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7d3a27 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: All In (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.41820335 - posZ: -43.400013 - rotX: 359.987427 - rotY: 269.999847 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538628 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: de40c8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Copycat (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.63346 - posY: 3.282604 - posZ: -69.29911 - rotX: 0.0208113231 - rotY: 269.9931 - rotZ: 0.0167662259 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550829 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 719a45 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "D\xE9j\xE0 Vu (5)" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.63066 - posY: 3.28594518 - posZ: -70.2820053 - rotX: 0.0208004341 - rotY: 270.027527 - rotZ: 0.01678116 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545209 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Permanent - DragSelectable: true - GMNotes: '' - GUID: 2ebdf1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: On Your Own (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.24509 - posY: 3.16501665 - posZ: -90.3928757 - rotX: 0.0208078139 - rotY: 270.0092 - rotZ: 0.0167691819 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368800 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 078efb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Survival Instinct - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -40.4491959 - posY: 1.36816967 - posZ: -59.8729668 - rotX: 0.02079764 - rotY: 270.040222 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430644 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 23c3e5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hyperawareness (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.40770531 - posZ: 7.49002075 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230361 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7a33b2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shrivelling (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.75998 - posY: 1.37819648 - posZ: -45.41002 - rotX: 0.0208078716 - rotY: 269.999878 - rotZ: 0.0167721286 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545302 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 2204cc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Self-Destructive - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -37.36467 - posY: 3.17273164 - posZ: -82.1646347 - rotX: 0.0208081584 - rotY: 270.000977 - rotZ: 0.0167709664 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277709 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2777': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Aspiring Actor - DragSelectable: true - GMNotes: '' - GUID: 9df9df - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Henry Wan - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -30.642086 - posY: 1.33200514 - posZ: 73.6239853 - rotX: 0.020809764 - rotY: 269.999359 - rotZ: 0.0167665128 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368623 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 68744b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hard Knocks - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500046 - posY: 1.35220218 - posZ: 73.65 - rotX: 0.02081169 - rotY: 269.98877 - rotZ: 0.0167679638 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315247 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ce1b89 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: High Roller (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.40827727 - posZ: -6.60000229 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527552 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3800': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 16ad5d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Baron Samedi - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 6.214624 - posY: 1.37499976 - posZ: -84.58808 - rotX: 0.0183348916 - rotY: 269.969818 - rotZ: 0.016028095 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368818 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: da207b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Waylay - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.970005 - posY: 1.35445011 - posZ: 55.2500038 - rotX: 0.02080474 - rotY: 270.012939 - rotZ: 0.0167768449 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538728 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0ee874 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Azure Flame (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -62.0980644 - posY: 3.284184 - posZ: -70.91383 - rotX: 0.020808937 - rotY: 270.001343 - rotZ: 0.0167690348 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545213 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 39452d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fine Print - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.3330345 - posY: 3.16976333 - posZ: -76.16513 - rotX: 0.02080835 - rotY: 269.999878 - rotZ: 0.0167706367 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 293016 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2930': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Survivor - DragSelectable: true - GMNotes: '' - GUID: 5fae20 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Grisly Totem (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -37.07575 - posY: 1.36818731 - posZ: -54.3571167 - rotX: 0.0208107289 - rotY: 270.0 - rotZ: 0.0167712681 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315253 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0db666 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Borrowed Time (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.41324031 - posZ: -25.0000019 - rotX: 359.987427 - rotY: 269.999847 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368429 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d6771f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fieldwork - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.64000225 - posY: 1.33803678 - posZ: 64.45 - rotX: 0.02081346 - rotY: 269.978821 - rotZ: 0.0167630222 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431009 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2737': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Let Your Arrow Fly True - DragSelectable: true - GMNotes: '' - GUID: c4d436 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ace of Swords (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.40354943 - posZ: 16.5300255 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538808 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Untranslated - DragSelectable: true - GMNotes: '' - GUID: 0a4d22 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Forbidden Tome - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.8815346 - posY: 3.28267622 - posZ: -78.03018 - rotX: 0.0208091978 - rotY: 269.997253 - rotZ: 0.0167690925 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374418 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3744': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 869d4c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Trial by Fire - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 67.71913 - posY: 1.365251 - posZ: 65.1638641 - rotX: 0.0208075251 - rotY: 269.9998 - rotZ: 0.01677034 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230326 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5558f1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mists of R'lyeh - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0 - posY: 1.33069563 - posZ: 62.15 - rotX: 0.020798916 - rotY: 270.0313 - rotZ: 0.01678454 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368808 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: dd130e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hiding Spot - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -46.7834854 - posY: 1.36334467 - posZ: -68.49766 - rotX: 0.0207973365 - rotY: 270.040466 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374834 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2098': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9ef062 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Improvisation - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 2.76934 - posY: 0.6104428 - posZ: -82.43481 - rotX: 358.873474 - rotY: 269.987366 - rotZ: 359.992035 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230343 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4224db - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Time Warp (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.41054726 - posZ: 2.89002085 - rotX: 359.987427 - rotY: 270.000244 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538727 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '591789' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Recharge (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -62.2989578 - posY: 3.28354979 - posZ: -72.02704 - rotX: 0.02080917 - rotY: 270.001343 - rotZ: 0.0167687181 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274002 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3586e6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Occult Evidence - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -38.41361 - posY: 1.363961 - posZ: -67.13534 - rotX: 0.0208034515 - rotY: 270.0197 - rotZ: 0.01677786 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368421 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8cc0a6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Magnifying Glass - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.639993 - posY: 1.34342265 - posZ: 82.8500061 - rotX: 0.0208148547 - rotY: 269.978821 - rotZ: 0.0167631079 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450622 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Seeker - DragSelectable: true - GMNotes: '' - GUID: a2136a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scroll of Secrets (3) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.10896 - posY: 1.30628693 - posZ: -47.3140564 - rotX: 0.0208085272 - rotY: 269.999664 - rotZ: 0.016770415 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538609 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a973aa - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Streetwise - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.8479958 - posY: 3.283511 - posZ: -70.64353 - rotX: 0.0208132938 - rotY: 269.9931 - rotZ: 0.01676096 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527607 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2742': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '276477' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Money Talks - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500023 - posY: 1.35747635 - posZ: 87.45 - rotX: 0.02081571 - rotY: 269.9749 - rotZ: 0.016764652 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368629 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: 'Lookin'' Out For #1' - DragSelectable: true - GMNotes: '' - GUID: b51688 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Joey "The Rat" Vigil - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500065 - posY: 1.34748948 - posZ: 57.5500031 - rotX: 0.0208110325 - rotY: 269.9888 - rotZ: 0.0167695936 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368513 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0c859f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Painkillers - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 57.27 - posY: 1.36663294 - posZ: 82.85 - rotX: 0.0208111759 - rotY: 269.99408 - rotZ: 0.01677131 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368400 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ffa4f9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Eureka! - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 0.160005555 - posY: 1.34656549 - posZ: 85.15001 - rotX: 0.0208201762 - rotY: 269.9646 - rotZ: 0.0167591684 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368408 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8cf335 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mind over Matter - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.23999333 - posY: 1.343311 - posZ: 78.25001 - rotX: 0.02081162 - rotY: 269.986359 - rotZ: 0.016769629 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448031 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4480': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Stamina - DragSelectable: true - GMNotes: '' - GUID: ffe4dd - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Empower Self (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -13.621273 - posY: 1.57495975 - posZ: 9.329683 - rotX: 359.9201 - rotY: 270.008545 - rotZ: 0.0168651175 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450616 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '308967' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Quick Thinking (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.8120155 - posY: 1.43324757 - posZ: -51.2351761 - rotX: 0.328339547 - rotY: 270.0354 - rotZ: 0.2912413 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315242 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 15643b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hard Knocks (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.40579569 - posZ: 2.59999871 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368526 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: He Was Never There - DragSelectable: true - GMNotes: '' - GUID: ad18a6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Red-Gloved Man (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.40019763 - posZ: 11.8000021 - rotX: 359.987427 - rotY: 269.999847 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368500 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8f7289 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Guts - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 64.07001 - posY: 1.370449 - posZ: 87.4500046 - rotX: 0.02080942 - rotY: 269.9973 - rotZ: 0.016771527 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368854 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c803ba - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Infighting (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.41099477 - posZ: -22.7000084 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315245 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5f19e0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sneak Attack (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.40703642 - posZ: -2.00000238 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430635 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2e93fd - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Expose Weakness (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.40150142 - posZ: 30.4900246 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 449037 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4490': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4f5f0f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sawed-Off Shotgun (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -49.9328461 - posY: 1.299728 - posZ: -73.765686 - rotX: 0.02080911 - rotY: 270.0 - rotZ: 0.0167716872 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368426 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8f91ce - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Research Librarian - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.640003 - posY: 1.34005642 - posZ: 71.35 - rotX: 0.0208149925 - rotY: 269.978821 - rotZ: 0.0167664737 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448936 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4489': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Abandoned by the Gods - DragSelectable: true - GMNotes: '' - GUID: c0d236 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Empty Vessel (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -23.6764164 - posY: 1.68283987 - posZ: -11.5100527 - rotX: 359.9201 - rotY: 269.999969 - rotZ: 0.0168763418 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277912 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2779': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a57f19 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Meat Cleaver - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -30.6913071 - posY: 1.33000863 - posZ: 66.8643341 - rotX: 0.020810809 - rotY: 269.9992 - rotZ: 0.0167672466 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553101 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 491c09 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Righteous Hunt (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.45762 - posY: 3.52424741 - posZ: -65.76757 - rotX: 0.0166513 - rotY: 270.0 - rotZ: 180.192642 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553223 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9c32e2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sword Cane - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -66.9723053 - posY: 3.28151178 - posZ: -76.17098 - rotX: 0.0208084118 - rotY: 269.999878 - rotZ: 0.0167712439 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538601 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: b2e5b0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Arrogance - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.2983665 - posY: 3.28459358 - posZ: -71.865715 - rotX: 0.0208144076 - rotY: 269.9931 - rotZ: 0.01675927 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538720 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ef43db - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Robes of Endless Night (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.73192 - posY: 3.28469062 - posZ: -74.45363 - rotX: 0.0208100285 - rotY: 270.001343 - rotZ: 0.0167669561 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 546917 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/NSozoRe.jpg - FaceURL: https://i.imgur.com/HLQOkvy.jpg - NumHeight: 5 - NumWidth: 10 - Type: 0 - UniqueBack: true - Description: Monster. Nightgaunt. Power. - DragSelectable: true - GMNotes: '' - GUID: cf96b9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Summoned Nightgaunt - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -46.42212 - posY: 2.36338925 - posZ: -96.24052 - rotX: 0.02081042 - rotY: 270.000031 - rotZ: 0.0167689342 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232907 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2329': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Professor of Archaeology - DragSelectable: true - GMNotes: '' - GUID: f03306 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dr. Francis Morgan - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -41.4931259 - posY: 2.37332487 - posZ: -69.13057 - rotX: 0.02081106 - rotY: 269.998016 - rotZ: 0.0167686362 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368823 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f34090 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Rabbit's Foot - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.3146324 - posY: 1.3624531 - posZ: -65.92177 - rotX: 0.020795932 - rotY: 270.040283 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378863 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3788': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 785f68 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hoods - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 7.60880375 - posY: 1.4786005 - posZ: -49.8665657 - rotX: 0.0228390861 - rotY: 269.882355 - rotZ: 4.91904736 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545308 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8d6ae6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Safeguard - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.90727 - posY: 3.285945 - posZ: -71.23404 - rotX: 0.02081431 - rotY: 269.979553 - rotZ: 0.0167632084 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290321 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c1ce8e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The 13th Vision - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -68.38262 - posY: 2.36265874 - posZ: -70.43153 - rotX: 0.0208098218 - rotY: 270.0 - rotZ: 359.983521 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368802 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 334f03 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Resourceful - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 49.37 - posY: 1.36376393 - posZ: 82.85 - rotX: 0.0208198037 - rotY: 269.9588 - rotZ: 0.01675873 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553215 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4f3142 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cryptographic Cipher - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.14944 - posY: 3.16606 - posZ: -83.30329 - rotX: 0.0208085272 - rotY: 270.0 - rotZ: 0.0167710166 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379931 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3799': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 98c5af - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dream-Enhancing Serum - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.3515034 - posY: 1.525713 - posZ: 3.167102 - rotX: 359.920624 - rotY: 269.986816 - rotZ: 0.0123827262 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277606 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2776': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a20887 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Grisly Totem - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -31.1001987 - posY: 1.32403064 - posZ: 46.94928 - rotX: 0.0208084043 - rotY: 269.998535 - rotZ: 0.0167739969 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545303 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: db4a43 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Boxing Gloves - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.2505722 - posY: 3.170734 - posZ: -68.2703 - rotX: 0.020815758 - rotY: 269.979553 - rotZ: 0.01676286 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450625 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f98f6f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Double or Nothing (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.68891 - posY: 1.30677831 - posZ: -51.11917 - rotX: 0.0208085719 - rotY: 269.999664 - rotZ: 0.01677095 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379022 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3790': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 090fcf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Glimpse the Unthinkable (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 112.20668 - posY: 1.49268472 - posZ: 46.0736732 - rotX: 359.987427 - rotY: 269.9999 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 292914 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2929': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2ee50e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Decoy - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.5756035 - posY: 1.54699683 - posZ: -53.2420578 - rotX: 0.0201706048 - rotY: 270.0111 - rotZ: 0.00609406969 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368621 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '213853' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Switchblade - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500027 - posY: 1.35422194 - posZ: 80.55 - rotX: 0.0208109 - rotY: 269.988831 - rotZ: 0.0167680886 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545324 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 017e1f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Overpower (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.30965 - posY: 3.16701269 - posZ: -73.01712 - rotX: 0.0208083242 - rotY: 270.0 - rotZ: 0.0167706329 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440622 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4406': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 96a440 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Gravedigger's Shovel (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.45989 - posY: 1.56187952 - posZ: 37.3573074 - rotX: 359.9887 - rotY: 269.9923 - rotZ: 359.98288 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230347 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ba1460 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bind Monster (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.41364908 - posZ: -8.609983 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368434 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3684': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Professor of Entomology - DragSelectable: true - GMNotes: '' - GUID: 9934d2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dr. Milan Christopher - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.3597 - posY: 3.53139567 - posZ: -65.68798 - rotX: 0.0124389669 - rotY: 270.0 - rotZ: 180.0142 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368804 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1fe462 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Last Chance - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 49.37 - posY: 1.36241734 - posZ: 78.25 - rotX: 0.02081953 - rotY: 269.9588 - rotZ: 0.0167597178 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230304 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a8298f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Drawn to the Flame - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6000023 - posY: 1.33731639 - posZ: 80.55 - rotX: 0.020818064 - rotY: 269.96698 - rotZ: 0.01676225 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368706 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cc6b14 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Daring Maneuver - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500023 - posY: 1.35612988 - posZ: 82.85 - rotX: 0.0208152272 - rotY: 269.974884 - rotZ: 0.01676414 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379619 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3796': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f57a6f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Wither (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 94.3716354 - posY: 1.53616381 - posZ: -13.6336412 - rotX: 359.988 - rotY: 270.833679 - rotZ: 353.443756 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 292813 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2928': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Guardian - DragSelectable: true - GMNotes: '' - GUID: b492cb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .45 Thompson (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -46.9860268 - posY: 1.36414373 - posZ: -55.87514 - rotX: 0.02081064 - rotY: 270.0 - rotZ: 0.01677142 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552421 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3697': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ca25bc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cover Up - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 86.76924 - posY: 1.37650609 - posZ: -58.61718 - rotX: 0.0202569962 - rotY: 270.007629 - rotZ: 0.0163947754 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230307 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: edd34a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Quantum Flux - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6000023 - posY: 1.33529663 - posZ: 73.65 - rotX: 0.02081925 - rotY: 269.967 - rotZ: 0.016761573 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230306 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1cd2bd - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Moonlight Ritual - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6000023 - posY: 1.33596981 - posZ: 75.95 - rotX: 0.0208188351 - rotY: 269.96698 - rotZ: 0.0167611167 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368852 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Big Man on Campus - DragSelectable: true - GMNotes: '' - GUID: e1e098 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Peter Sylvestre (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40913355 - posZ: -15.8000059 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431111 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2698': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 3b3c0a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Drawing the Sign - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 79.6330948 - posY: 1.51341081 - posZ: 71.33267 - rotX: 0.020565819 - rotY: 270.0009 - rotZ: 0.01678212 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 466112 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4661': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Exotic Morgana - DragSelectable: true - GMNotes: '' - GUID: 692ced - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Molly Maxwell - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -41.0150757 - posY: 1.30660939 - posZ: 55.5211258 - rotX: 0.01782124 - rotY: 269.9919 - rotZ: 0.016412884 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538700 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4fbdb2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Arbiter of Fates - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.617424 - posY: 3.278408 - posZ: -72.10753 - rotX: 0.0208098311 - rotY: 270.001343 - rotZ: 0.01677073 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553201 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 8b68f4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Crisis of Faith - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.67489 - posY: 3.16815019 - posZ: -79.05465 - rotX: 0.0208086632 - rotY: 269.999329 - rotZ: 0.0167705454 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438128 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 406ab2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Your Worst Nightmare - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.45674 - posY: 1.52149308 - posZ: 51.4070473 - rotX: 0.019881621 - rotY: 269.999634 - rotZ: 180.018326 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 313604 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3136': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4f2668 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Rite of Seeking (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.4130286 - posZ: -6.3099823 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438124 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a5be8b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Bloodthirst) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.77216 - posY: 1.37203252 - posZ: 51.6075249 - rotX: 0.0207682457 - rotY: 269.999329 - rotZ: 180.022034 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538812 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0d29be - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Burning the Midnight Oil - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.2948837 - posY: 3.284804 - posZ: -75.21793 - rotX: 0.0208093766 - rotY: 269.997253 - rotZ: 0.01676911 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277813 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2778': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5ada0a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hawk-Eye Folding Camera - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -30.4610023 - posY: 1.32776082 - posZ: 58.8984222 - rotX: 0.0208074246 - rotY: 269.998047 - rotZ: 0.0167737659 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368813 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 00af4f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fight or Flight - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.97 - posY: 1.35848963 - posZ: 69.05 - rotX: 0.02080343 - rotY: 270.012878 - rotZ: 0.0167783517 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440814 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2699': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: ba2ae1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Doomed - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 78.9933 - posY: 1.51519966 - posZ: 71.2607346 - rotX: 0.0213949829 - rotY: 269.999878 - rotZ: 0.0158619713 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550828 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3bbc0b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Quick Learner (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.58581 - posY: 3.28476167 - posZ: -70.34595 - rotX: 0.0144211575 - rotY: 270.0191 - rotZ: 0.0116325384 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538805 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Protective Amulet - DragSelectable: true - GMNotes: '' - GUID: d6c44a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Disc of Itzamna - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.8098221 - posY: 3.28402638 - posZ: -74.3353043 - rotX: 0.0208097566 - rotY: 269.997223 - rotZ: 0.01676909 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545322 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 037b2e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lesson Learned (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.48458 - posY: 3.169242 - posZ: -72.9249 - rotX: 0.02080837 - rotY: 270.0 - rotZ: 0.0167705752 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 449035 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4490': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Syndicate Assassin - DragSelectable: true - GMNotes: '' - GUID: 97a795 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Delilah O'Rourke (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -30.2241936 - posY: 1.69983244 - posZ: 15.1899557 - rotX: 359.9201 - rotY: 269.9999 - rotZ: 0.0168750733 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368418 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: acd0da - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"I''ve got a plan!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.24000216 - posY: 1.33657849 - posZ: 55.25 - rotX: 0.0208124332 - rotY: 269.9864 - rotZ: 0.0167701915 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447935 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4479': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 80fafa - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Leadership (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.4562149 - posY: 1.30115438 - posZ: -68.24378 - rotX: 0.02080835 - rotY: 270.000061 - rotZ: 0.0167708285 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368524 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bca49e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Charisma (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.39647543 - posZ: 25.6000023 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430908 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2728': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8aa0c3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Deny Existence - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6000042 - posY: 1.339336 - posZ: 87.45 - rotX: 0.0208175164 - rotY: 269.96698 - rotZ: 0.0167635437 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374834 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2098': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9aee7f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Improvisation - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 2.28952074 - posY: 0.4800682 - posZ: -82.19826 - rotX: 358.634 - rotY: 270.0588 - rotZ: 359.989777 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430640 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7b42b6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: In the Know (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.40522373 - posZ: 16.6900253 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226341 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d2e026 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Vicious Blow (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.40541053 - posZ: 9.630022 - rotX: 359.987427 - rotY: 270.000061 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538613 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cc9563 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Pilfer - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.16951 - posY: 3.28556275 - posZ: -70.02059 - rotX: 0.020811623 - rotY: 269.9931 - rotZ: 0.0167679768 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553114 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 840ba5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ancient Covenant (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.2758179 - posY: 1.31858635 - posZ: -54.7640839 - rotX: 0.0207295977 - rotY: 269.9976 - rotZ: 359.274384 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553214 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1ad931 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hand of Fate - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.4219437 - posY: 3.16233158 - posZ: -88.09052 - rotX: 0.02080869 - rotY: 269.999 - rotZ: 0.0167701226 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551303 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: bc4a74 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Foul Odor - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 15.7847195 - posY: 1.475488 - posZ: 8.0802145 - rotX: 359.920135 - rotY: 270.0 - rotZ: 0.01687402 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430645 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 092e92 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Quick Study (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.40832567 - posZ: 5.19001961 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 312109 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3121': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: "What\u2019s in the Box?" - DragSelectable: true - GMNotes: '' - GUID: 0e39c2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Council's Coffer (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.4600334 - posY: 1.52728856 - posZ: -53.46696 - rotX: 0.0193714 - rotY: 270.016724 - rotZ: 0.0191046689 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274010 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: My Muse - DragSelectable: true - GMNotes: '' - GUID: ea0007 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Patrice's Violin - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.38859 - posY: 1.48937368 - posZ: -50.0725479 - rotX: 0.0202874634 - rotY: 270.019684 - rotZ: 0.0154213235 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538621 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0b963c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cheap Shot (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.01796 - posY: 3.28449917 - posZ: -73.74907 - rotX: 0.0208121 - rotY: 269.9931 - rotZ: 0.0167641789 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232333 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2323': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Regalia Dementia - DragSelectable: true - GMNotes: '' - GUID: 5d30a1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Tattered Cloak - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -23.11173 - posY: 2.37783718 - posZ: -74.3121262 - rotX: 0.0208091661 - rotY: 270.000061 - rotZ: 0.0167705119 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 292815 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2928': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Guardian - DragSelectable: true - GMNotes: '' - GUID: 84b918 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Enchanted Blade (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.7760849 - posY: 1.51176524 - posZ: -49.1228828 - rotX: 0.0195764955 - rotY: 269.98288 - rotZ: 0.009112052 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315304 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3153': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 620b6e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Contraband (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -36.5215378 - posY: 2.36745119 - posZ: -94.6365662 - rotX: 0.0208076537 - rotY: 270.000671 - rotZ: 0.0167719889 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274005 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1186a1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Tony's .38 Long Colt - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -33.5642548 - posY: 1.37087488 - posZ: -49.5318451 - rotX: 0.02080342 - rotY: 270.019775 - rotZ: 0.0167778078 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 261704 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2617': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '857238' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hatchet Man - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 31.7500019 - posY: 1.35534489 - posZ: 75.95 - rotX: 0.020807296 - rotY: 270.0001 - rotZ: 0.016773833 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378617 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3786': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0ab574 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mk 1 Grenades (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.6650848 - posY: 1.29916561 - posZ: -73.53806 - rotX: 0.0208087023 - rotY: 270.000061 - rotZ: 0.01677142 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226355 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3b6834 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "\"I've had worse\u2026\" (4)" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.3595657 - posY: 3.52342 - posZ: -65.6875458 - rotX: 0.0109348232 - rotY: 270.0 - rotZ: 180.018341 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 292913 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2929': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b65011 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Investments - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.4359 - posY: 1.56717479 - posZ: -53.5249176 - rotX: 0.0196301043 - rotY: 270.007874 - rotZ: 0.00258995965 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315248 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f57af7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .41 Derringer (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.409518 - posZ: -11.2000046 - rotX: 359.987427 - rotY: 269.999847 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368405 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d4fd4a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shortcut - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.23999429 - posY: 1.34533072 - posZ: 85.15001 - rotX: 0.0208120123 - rotY: 269.986359 - rotZ: 0.0167688522 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538818 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fab3a9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Library Docent (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.804512 - posY: 3.16686463 - posZ: -83.314 - rotX: 0.0208091158 - rotY: 269.997253 - rotZ: 0.0167693384 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 262200 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2622': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bc4788 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Feed the Mind (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.41452944 - posZ: -17.8099861 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368710 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 819aee - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sleight of Hand - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500042 - posY: 1.353437 - posZ: 73.65 - rotX: 0.0208148733 - rotY: 269.974884 - rotZ: 0.0167639721 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430658 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1f3f16 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: No Stone Unturned (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.420113 - posZ: -38.50999 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 278846 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2788': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Key to the Gate of Dreams - DragSelectable: true - GMNotes: '' - GUID: 61fd07 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Silver Key - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.46796 - posY: 3.47810078 - posZ: -50.62324 - rotX: 0.0125573976 - rotY: 270.0 - rotZ: 180.024521 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374633 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3746': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 016b72 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The King in Yellow - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.2623863 - posY: 2.183923 - posZ: -93.89774 - rotX: 0.02080724 - rotY: 270.004761 - rotZ: 0.016775541 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 314802 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3148': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3dc82f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Try and Try Again (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.39982784 - posZ: 18.7000046 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 314904 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3149': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bb501b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Rise to the Occasion (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40975392 - posZ: -18.1000061 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448034 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4480': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Lost in a Dream - DragSelectable: true - GMNotes: '' - GUID: 9f76ec - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Twila Katherine Price (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -13.4830484 - posY: 1.57222378 - posZ: 0.6929285 - rotX: 359.920135 - rotY: 270.005066 - rotZ: 0.0168688241 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 452300 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4523': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Expert Dreamer - DragSelectable: true - GMNotes: '' - GUID: b04c8e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Randolph Carter - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -27.3781948 - posY: 2.37428141 - posZ: -83.49261 - rotX: 0.02080912 - rotY: 270.000031 - rotZ: 0.0167708285 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553210 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: b9fbff - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Siren Call - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.31337 - posY: 3.167749 - posZ: -78.3915558 - rotX: 0.0208085366 - rotY: 269.999329 - rotZ: 0.0167706981 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527237 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5272': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ad58aa - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mind's Eye (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.7199135 - posY: 1.29997373 - posZ: -68.2275848 - rotX: 0.0208084621 - rotY: 270.000061 - rotZ: 0.0167708471 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447633 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4476': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b3cad4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Daredevil (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.17774 - posY: 1.29656863 - posZ: -83.01471 - rotX: 0.0208081063 - rotY: 270.0001 - rotZ: 0.0167712811 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 262202 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2622': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Knowledge of the Elders - DragSelectable: true - GMNotes: '' - GUID: 863f91 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ancient Stone (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.41887212 - posZ: -33.9099922 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430809 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2732': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 13413d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Connect the Dots - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.24000168 - posY: 1.33590531 - posZ: 52.95 - rotX: 0.02081261 - rotY: 269.9864 - rotZ: 0.0167691931 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230319 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8a927c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scrying - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0000019 - posY: 1.33540833 - posZ: 78.25 - rotX: 0.0207991749 - rotY: 270.031281 - rotZ: 0.0167850573 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538823 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 344e90 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"I''ve got a plan!" (2)' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.7697029 - posY: 3.16668463 - posZ: -83.9721756 - rotX: 0.0208092015 - rotY: 269.997253 - rotZ: 0.0167694557 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553103 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 53d103 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Eldritch Sophist - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.68433 - posY: 1.30284011 - posZ: -54.6536446 - rotX: 0.0208088122 - rotY: 269.999451 - rotZ: 0.01677146 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545318 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3df5fb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Evidence! (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.7155762 - posY: 3.17010212 - posZ: -72.3316956 - rotX: 0.02080834 - rotY: 270.0 - rotZ: 0.0167695936 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230325 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Esteemed Eschatologist - DragSelectable: true - GMNotes: '' - GUID: 1f8539 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: David Renfield - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0 - posY: 1.33136892 - posZ: 64.45 - rotX: 0.0207990743 - rotY: 270.0313 - rotZ: 0.016784329 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368711 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 256da2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Eavesdrop - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500042 - posY: 1.35276365 - posZ: 71.35 - rotX: 0.0208145473 - rotY: 269.974884 - rotZ: 0.0167638231 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374935 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3749': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 367aac - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Crisis of Identity - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 27.4951439 - posY: 3.299623 - posZ: -50.0249023 - rotX: 359.920135 - rotY: 270.0012 - rotZ: 0.8290588 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226324 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5cd622 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: First Aid - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230006 - posY: 1.34783983 - posZ: 78.25 - rotX: 0.02081828 - rotY: 269.9694 - rotZ: 0.016761452 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538825 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c1365d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Seeking Answers (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.3109856 - posY: 3.16338754 - posZ: -84.2678757 - rotX: 0.0208092984 - rotY: 269.997253 - rotZ: 0.0167696457 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 377244 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3772': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 86feae - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Call of the Unknown - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -19.6113453 - posY: 3.17495871 - posZ: -96.34451 - rotX: 0.0208080951 - rotY: 270.0 - rotZ: 0.0167711359 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368628 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fe2db3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .41 Derringer - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500065 - posY: 1.34816265 - posZ: 59.8500023 - rotX: 0.0208115634 - rotY: 269.9888 - rotZ: 0.0167687647 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379929 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3799': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6ad46b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Essence of the Dream - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.46684 - posY: 1.68849742 - posZ: 2.97275424 - rotX: 359.9218 - rotY: 269.9981 - rotZ: 0.0143287377 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230354 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 296dc8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Book of Shadows (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.41923249 - posZ: -29.3099937 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368847 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9bcdee - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Newspaper (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40541124 - posZ: -2.00000286 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448937 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4489': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Jewel of the Gods - DragSelectable: true - GMNotes: '' - GUID: 464ca1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Wish Eater - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.4576378 - posY: 3.521088 - posZ: -65.76698 - rotX: 0.0166528169 - rotY: 270.000031 - rotZ: 180.070023 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230311 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 30f860 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Blinding Light - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6 - posY: 1.33260369 - posZ: 64.45 - rotX: 0.0208177511 - rotY: 269.96698 - rotZ: 0.0167625658 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226323 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1165db - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Physical Training - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230006 - posY: 1.34851313 - posZ: 80.55 - rotX: 0.0208176617 - rotY: 269.9694 - rotZ: 0.0167605784 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368626 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ddee79 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stealth - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500046 - posY: 1.35018241 - posZ: 66.75 - rotX: 0.0208121948 - rotY: 269.988831 - rotZ: 0.0167690367 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379831 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3798': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5e808d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Self-Sacrifice - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.0898914 - posY: 1.5271982 - posZ: 6.91475 - rotX: 359.920441 - rotY: 270.003418 - rotZ: 0.0135479523 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226317 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9c46da - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Emergency Aid - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300068 - posY: 1.34301531 - posZ: 57.5500031 - rotX: 0.0207952857 - rotY: 270.027039 - rotZ: 0.0167731363 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550827 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d40f4e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Chainsaw (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.24956 - posY: 3.28480458 - posZ: -68.9724 - rotX: 0.0144211613 - rotY: 270.0191 - rotZ: 0.0116326967 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448519 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4485': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/780749631103449151/FFAADF06C9BF9D1F4F3FE22D45CEBBB15D9B58CF/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 3bf831 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: False Awakening - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.374157 - posY: 3.52493143 - posZ: -65.7005 - rotX: 0.0124949375 - rotY: 270.0 - rotZ: 180.220673 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 235644 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2356': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Poision. - DragSelectable: true - GMNotes: '' - GUID: 819f52 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Poisoned - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.88728 - posY: 3.174081 - posZ: -64.36427 - rotX: 0.0208086278 - rotY: 270.0 - rotZ: 0.0167710856 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545312 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5b0f86 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"Get over here!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.1554565 - posY: 3.28587174 - posZ: -70.16612 - rotX: 0.0208143238 - rotY: 269.979553 - rotZ: 0.016763214 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230334 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5d6e57 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mind Wipe (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.40434325 - posZ: 25.8900242 - rotX: 359.987427 - rotY: 270.000122 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368415 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3684': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 44cf4a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: No Stone Unturned - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.3596878 - posY: 3.53277922 - posZ: -65.68791 - rotX: 0.0166730285 - rotY: 269.999664 - rotZ: 180.035721 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230342 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8254d4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Blinding Light (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.40992677 - posZ: 5.190022 - rotX: 359.987427 - rotY: 270.000244 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538729 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e21200 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Clairvoyance (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.8509979 - posY: 3.276063 - posZ: -70.98741 - rotX: 0.0208088625 - rotY: 270.001343 - rotZ: 0.0167694334 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368860 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0027f2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Will to Survive (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.41533744 - posZ: -38.8000031 - rotX: 359.987427 - rotY: 269.999939 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527403 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2666': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: d83baf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Psychosis - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 74.05512 - posY: 1.54381335 - posZ: 81.50433 - rotX: 0.0185714755 - rotY: 269.999481 - rotZ: 0.0229028482 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 370323 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3703': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: John Dee Translation - DragSelectable: true - GMNotes: '' - GUID: 6b2550 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Necronomicon - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.3595619 - posY: 3.5423758 - posZ: -65.68753 - rotX: 0.0124493325 - rotY: 270.0 - rotZ: 180.014145 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447632 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4476': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1bd139 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Haste (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.716 - posY: 1.30109835 - posZ: -65.63145 - rotX: 0.0208085626 - rotY: 269.999969 - rotZ: 0.0167710073 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450615 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d4a68a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Delve Too Deep (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.3972664 - posY: 1.42967761 - posZ: -51.38582 - rotX: 0.0208060946 - rotY: 269.999664 - rotZ: 0.0167728066 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553230 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b4666d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Beloved - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.3841057 - posY: 1.37133741 - posZ: -57.74359 - rotX: 0.0208085 - rotY: 270.000061 - rotZ: 0.0167711731 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380949 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3809': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ce3a1a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Vengeful Hound - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -1.62743974 - posY: 1.87950075 - posZ: -44.0202332 - rotX: 0.0293578617 - rotY: 269.9289 - rotZ: 338.761932 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553700 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5537': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507632620/1C7C9B898C919EDAD757709C161F0DFFF3FA9238/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c21c1f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Signum Crucis (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 11.7455063 - posY: 1.32700038 - posZ: -57.0168457 - rotX: 0.02080867 - rotY: 270.000061 - rotZ: 0.01677112 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 261101 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2611': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d2663c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hemispheric Map (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.39895689 - posZ: 16.4000015 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 454100 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4541': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Trap. - DragSelectable: true - GMNotes: '' - GUID: 74840a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bear Trap - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -38.3778458 - posY: 2.36909652 - posZ: -86.7653351 - rotX: 0.0208093915 - rotY: 270.0 - rotZ: 0.01677069 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232941 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2329': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Madness. - DragSelectable: true - GMNotes: '' - GUID: fb943f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Across Space and Time - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.3010674 - posY: 1.36172926 - posZ: -55.04807 - rotX: 0.02080917 - rotY: 270.0 - rotZ: 0.0167706218 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550802 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a3bc7a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Atychiphobia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.50702 - posY: 3.28463626 - posZ: -72.20162 - rotX: 0.0147334673 - rotY: 270.0195 - rotZ: 0.0118836816 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379018 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3790': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b7c503 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ghastly Revelation - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 13.8512068 - posY: 1.34525955 - posZ: 63.70211 - rotX: 0.0208136924 - rotY: 269.981 - rotZ: 0.01676558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553108 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3442f5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: False Covenant (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.45762 - posY: 3.52372 - posZ: -65.76752 - rotX: 0.0166536365 - rotY: 270.0 - rotZ: 180.169678 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274609 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2746': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: From the Brink - DragSelectable: true - GMNotes: '' - GUID: 46187b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Five of Pentacles (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.4004482 - posZ: 16.4 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 233605 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2336': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 26398a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Pet Oozeling - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.6435547 - posY: 1.3010807 - posZ: -68.26276 - rotX: 0.02080807 - rotY: 270.0001 - rotZ: 0.0167711359 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368514 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 603e29 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Smoking Pipe - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 57.27 - posY: 1.36595976 - posZ: 80.55 - rotX: 0.02080983 - rotY: 269.99408 - rotZ: 0.0167723168 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 452504 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4525': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Chained to the Waking World - DragSelectable: true - GMNotes: '' - GUID: d253a6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Randolph Carter - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -30.5121937 - posY: 2.37383485 - posZ: -80.5855255 - rotX: 0.0208091475 - rotY: 270.0 - rotZ: 0.0167707652 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 375016 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3750': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a33470 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Spirit-Speaker - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 52.6619034 - posY: 1.68719435 - posZ: -45.7441521 - rotX: 0.158040836 - rotY: 270.026367 - rotZ: 0.0115280962 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440623 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4406': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Cat General of Ulthar - DragSelectable: true - GMNotes: '' - GUID: e1aedf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Miss Doyle (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.43 - posY: 1.54419959 - posZ: 37.4258842 - rotX: 359.974884 - rotY: 269.9931 - rotZ: 359.982422 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553100 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 55fc3d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Riot Whistle - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.45762 - posY: 3.52957821 - posZ: -65.76726 - rotX: 0.01633934 - rotY: 270.0 - rotZ: 180.205978 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438122 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: ea0fa1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Cowardice) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.3509445 - posY: 1.51659238 - posZ: 51.50479 - rotX: 0.0444448479 - rotY: 269.9969 - rotZ: 180.044754 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551405 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 99800f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dogcatchers - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 15.937418 - posY: 1.4728533 - posZ: -0.14389053 - rotX: 359.920135 - rotY: 270.000153 - rotZ: 0.01687217 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368515 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bb1cce - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Flashlight - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 57.27 - posY: 1.36528647 - posZ: 78.25 - rotX: 0.0208097659 - rotY: 269.99408 - rotZ: 0.0167725012 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538717 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7e7873 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Prescient - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.1686325 - posY: 3.2845335 - posZ: -71.113884 - rotX: 0.02081002 - rotY: 270.001343 - rotZ: 0.0167657565 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545330 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8ffa44 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: One-Two Punch (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.994278 - posY: 3.16984415 - posZ: -72.63637 - rotX: 0.0208082423 - rotY: 270.0 - rotZ: 0.016771188 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430654 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Freezing Variant - DragSelectable: true - GMNotes: '' - GUID: 9afe23 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Strange Solution (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.0500259 - posY: 1.41514981 - posZ: -20.11004 - rotX: 359.987427 - rotY: 270.0011 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538708 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 971d52 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Familiar Spirit - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.0962448 - posY: 3.284114 - posZ: -71.60461 - rotX: 0.0208114013 - rotY: 270.001343 - rotZ: 0.0167635661 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379828 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3798': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0bb3da - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: First Watch - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.2650452 - posY: 1.67629635 - posZ: 7.016553 - rotX: 359.922668 - rotY: 270.003845 - rotZ: 0.0136328405 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448029 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4480': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8e8a14 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Spectral Razor - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -41.78683 - posY: 2.84537172 - posZ: -122.14035 - rotX: 0.0208078939 - rotY: 270.002258 - rotZ: 0.0167717487 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 375129 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 79b4af - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Abandoned and Alone - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 87.96376 - posY: 1.37863719 - posZ: -52.84543 - rotX: 0.0208916031 - rotY: 270.023865 - rotZ: 0.0165571664 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368501 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5c3dd0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Say Your Prayers - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 64.07001 - posY: 1.36977577 - posZ: 85.15001 - rotX: 0.0208101626 - rotY: 269.9973 - rotZ: 0.0167729165 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538619 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '725690' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mauser C96 (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.11079 - posY: 3.285394 - posZ: -71.70106 - rotX: 0.0208120719 - rotY: 269.9931 - rotZ: 0.0167635214 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550813 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a92a90 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Grit Your Teeth - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.812542 - posY: 3.43617344 - posZ: -72.99728 - rotX: 0.0215979125 - rotY: 270.004822 - rotZ: 7.9804945 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553202 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c5d8a9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Obscure Studies - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.8592148 - posY: 3.16668487 - posZ: -81.36013 - rotX: 0.02081001 - rotY: 269.999329 - rotZ: 0.0167705044 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447932 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4479': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ebdd78 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .35 Winchester - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.4082336 - posY: 1.300362 - posZ: -71.00999 - rotX: 0.0208086018 - rotY: 270.000061 - rotZ: 0.01677047 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315303 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3153': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3e0653 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Think on Your Feet (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.404555 - posZ: 7.20000029 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538721 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e2bc49 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hypnotic Gaze (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.14337 - posY: 3.28516364 - posZ: -73.03294 - rotX: 0.020809602 - rotY: 270.001343 - rotZ: 0.01676751 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379154 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3791': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1c7a00 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Rational Thought - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 7.87244558 - posY: 1.3814404 - posZ: -64.38252 - rotX: 0.014240846 - rotY: 269.998383 - rotZ: 0.0146841351 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379618 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3796': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 060943 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sixth Sense (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 92.56764 - posY: 1.41171122 - posZ: -11.039938 - rotX: 359.987427 - rotY: 269.999329 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368430 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Acquisitions and Solicitation - DragSelectable: true - GMNotes: '' - GUID: 4a2a36 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Charles Ross, Esq. - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.64000225 - posY: 1.33736348 - posZ: 62.1499977 - rotX: 0.02081471 - rotY: 269.978821 - rotZ: 0.0167644937 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550820 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f8a977 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .18 Derringer (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.5310936 - posY: 3.28489327 - posZ: -71.11179 - rotX: 0.0144211408 - rotY: 270.0191 - rotZ: 0.0116323065 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230349 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 65b30d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Arcane Initiate (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76 - posY: 1.41488981 - posZ: -13.210041 - rotX: 359.987427 - rotY: 270.0008 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440721 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4407': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0ec9bf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Suggestion (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.5417442 - posY: 1.3655479 - posZ: -50.38864 - rotX: 0.0208050758 - rotY: 270.017761 - rotZ: 0.0167755261 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550500 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5505': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1537373966843931844/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373966843945794/C608E9B39B1E0B4267BCCC9A5B308495278702C0/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 27ff2d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Third Time's a Charm (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.545 - posY: 3.28549743 - posZ: -71.2842255 - rotX: 0.02080856 - rotY: 269.999969 - rotZ: 0.0167710539 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538806 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: dbb0e0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Encyclopedia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.7133255 - posY: 3.72821236 - posZ: -77.05741 - rotX: 0.02080956 - rotY: 269.997284 - rotZ: 0.0167706888 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545313 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '273584' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Glory - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.24709 - posY: 3.28623486 - posZ: -70.02708 - rotX: 0.0208144039 - rotY: 269.979553 - rotZ: 0.0167632941 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538815 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 010509 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Occult Invocation - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.44707 - posY: 3.167505 - posZ: -75.83863 - rotX: 0.0208092984 - rotY: 269.997253 - rotZ: 0.016769344 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379930 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3799': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: df0e22 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Otherworld Codex (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.1328487 - posY: 1.67128038 - posZ: 3.202552 - rotX: 359.937866 - rotY: 269.99765 - rotZ: -0.00335079338 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230358 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 194adb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Rite of Seeking (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.42171407 - posZ: -38.50999 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 373819 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3738': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 80b7c6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Graveyard Ghouls - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 53.86731 - posY: 1.36824882 - posZ: -45.67506 - rotX: 0.0158746652 - rotY: 269.99646 - rotZ: 0.0151343858 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538710 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d9292f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Robes of Endless Night - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.59802 - posY: 3.28473163 - posZ: -70.11515 - rotX: 0.0208108351 - rotY: 270.001343 - rotZ: 0.0167642124 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378958 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3789': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: acce72 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lodge "Debts" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 7.70438576 - posY: 1.38385892 - posZ: -56.5958862 - rotX: 0.0223048571 - rotY: 270.0155 - rotZ: 0.00638814643 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368857 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f1b0f9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Try and Try Again (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.41285586 - posZ: -29.6000061 - rotX: 359.987427 - rotY: 269.999939 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 297101 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2971': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Curse. - DragSelectable: true - GMNotes: '' - GUID: 569b06 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Curse of the Rougarou - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -62.49299 - posY: 1.78174841 - posZ: 6.4157424 - rotX: 2.12603521 - rotY: 269.862244 - rotZ: 4.248013 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274100 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2741': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/778493212055041441/90F035BD69A7C5C6B6F43426DDDA3A09DFCBCBDF/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Murder Weapon - DragSelectable: true - GMNotes: '' - GUID: d71f11 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bloodstained Dagger - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.4621468 - posY: 2.36952639 - posZ: -73.6884155 - rotX: 0.0211172719 - rotY: 270.0 - rotZ: 0.0169384666 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527404 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2666': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 88ee43 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hypochondria - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 75.0673 - posY: 1.53452182 - posZ: 81.82477 - rotX: 0.0157311484 - rotY: 269.999634 - rotZ: 0.018423602 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 370422 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3704': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 321cb7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Daisy's Tote Bag - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.1865 - posY: 1.29897082 - posZ: -74.796936 - rotX: 0.0208084341 - rotY: 270.0 - rotZ: 0.0167711563 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431207 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2667': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: eeb330 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Chronophobia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 79.0520859 - posY: 1.485057 - posZ: 71.99658 - rotX: 0.0327025428 - rotY: 270.0003 - rotZ: 0.000334777724 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230603 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2306': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 00b6c3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: To Fight the Black Wind - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -49.0920258 - posY: 3.39960217 - posZ: -65.15591 - rotX: 0.0208092 - rotY: 270.006958 - rotZ: 0.01676712 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380126 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3801': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 75eca5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Read the Signs - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.2260036 - posY: 1.688674 - posZ: -4.15322065 - rotX: 359.919952 - rotY: 269.999664 - rotZ: 0.0162679963 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 549600 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5496': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1537373966843931844/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373966843934735/BFCEAE686380A770B52AAFB4710A0AB3043E02EE/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9103a5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Radiant Smite (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.5725822 - posY: 3.27131367 - posZ: -71.1542358 - rotX: 0.0208085589 - rotY: 270.000031 - rotZ: 0.0167722 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380025 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3800': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0cc3e7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Followed - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.0233421 - posY: 1.672191 - posZ: -1.01813757 - rotX: 359.923248 - rotY: 269.9999 - rotZ: 0.01653332 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368414 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1b0235 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Persuasion - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.240003 - posY: 1.33927155 - posZ: 64.45 - rotX: 0.02081119 - rotY: 269.986359 - rotZ: 0.0167691447 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315241 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 63f145 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Opportunist (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.4039346 - posZ: 9.5 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 314905 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3149': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 70772b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Oops! (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40665209 - posZ: -6.60000372 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226303 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 83d8d7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Leadership - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.0300045 - posY: 1.35098243 - posZ: 80.55 - rotX: 0.0208123475 - rotY: 269.987427 - rotZ: 0.0167667661 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230353 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8f871b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Crystalline Elder Sign (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76001 - posY: 1.41861212 - posZ: -27.0099945 - rotX: 359.987427 - rotY: 270.000366 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431007 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2737': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '683937' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Delay the Inevitable - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300068 - posY: 1.34368849 - posZ: 59.8500023 - rotX: 0.0207936484 - rotY: 270.027039 - rotZ: 0.0167745743 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431557 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3790': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '394603' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Family Inheritance - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 7.289977 - posY: 1.47384119 - posZ: -58.3566551 - rotX: 0.02373747 - rotY: 269.918823 - rotZ: 4.809997 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 376938 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3769': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1f3880 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Smuggled Goods - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.3596954 - posY: 3.53167915 - posZ: -65.68801 - rotX: 0.0124424817 - rotY: 270.0001 - rotZ: 180.005081 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274607 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2746': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0bea17 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Act of Desperation - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.97 - posY: 1.36387551 - posZ: 87.45 - rotX: 0.02080351 - rotY: 270.012939 - rotZ: 0.01677897 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277710 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2777': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5115d9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Intel Report - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -27.1022224 - posY: 1.332592 - posZ: 71.23809 - rotX: 0.0208069868 - rotY: 269.998962 - rotZ: 0.01677785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368523 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3c959c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Relic Hunter (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.3970958 - posZ: 23.3000031 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450611 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: eccb8a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Knowledge is Power (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.9288673 - posY: 1.46812129 - posZ: -50.9870834 - rotX: 0.0208068173 - rotY: 269.999664 - rotZ: 0.016770646 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226335 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bd3ecc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Combat Training (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.40044749 - posZ: 28.0300274 - rotX: 359.987427 - rotY: 269.9999 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527402 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2666': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 249d83 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Haunted - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 74.82835 - posY: 1.524788 - posZ: 81.67362 - rotX: 0.0176790953 - rotY: 269.9997 - rotZ: 0.0187719874 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450600 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6411d5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Machete (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.21384 - posY: 1.30519938 - posZ: -50.8994 - rotX: 0.0208084155 - rotY: 269.999664 - rotZ: 0.016770497 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553229 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ec7702 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Predestined - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.19639 - posY: 1.42133653 - posZ: -57.25017 - rotX: 0.0208085 - rotY: 270.000061 - rotZ: 0.016771175 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368844 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0edef1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: A Chance Encounter (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40355015 - posZ: 4.899999 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550824 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2f2190 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unexpected Courage (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.0424232 - posY: 3.285307 - posZ: -69.20315 - rotX: 0.0147311278 - rotY: 270.0195 - rotZ: 0.011882782 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538804 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Book of Books - DragSelectable: true - GMNotes: '' - GUID: d287bc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Celaeno Fragments - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.0273056 - posY: 3.28247786 - posZ: -74.3872757 - rotX: 0.0208099969 - rotY: 269.997284 - rotZ: 0.0167706665 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447732 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4477': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4d9a97 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sharp Vision (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -49.5191231 - posY: 1.29761434 - posZ: -81.5001 - rotX: 0.0208087079 - rotY: 269.999939 - rotZ: 0.01677183 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226349 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e35bc2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dynamite Blast (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.41161442 - posZ: -13.3699875 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448840 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4488': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d6085d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Eye of Truth (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.90797 - posY: 1.296707 - posZ: -82.87657 - rotX: 0.0208083577 - rotY: 270.0 - rotZ: 0.01677057 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277911 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2779': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: dffa9d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Belly of the Beast - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -31.2078037 - posY: 1.32907391 - posZ: 64.31217 - rotX: 0.0208104178 - rotY: 269.9969 - rotZ: 0.0167667456 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368824 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f474b1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stray Cat - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.8579521 - posY: 1.36627233 - posZ: -63.36624 - rotX: 0.0207980759 - rotY: 270.040222 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 541200 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5412': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915335413/F6B6100F5713A33245CFBB6F1D7316AA2DD0F760/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: Advanced - DragSelectable: true - GMNotes: '' - GUID: 9c4900 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: On the Lam - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -49.8911133 - posY: 1.29766488 - posZ: -80.86572 - rotX: 0.0208081119 - rotY: 270.000061 - rotZ: 0.01677094 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374330 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3743': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b80459 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Home Front - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 52.7368431 - posY: 1.64680672 - posZ: -44.52075 - rotX: 0.15098621 - rotY: 269.994263 - rotZ: 359.33197 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274006 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d6f8d1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Tony's Quarry - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -41.39597 - posY: 1.36798072 - posZ: -49.70266 - rotX: 0.0208089426 - rotY: 269.999939 - rotZ: 0.016770659 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368510 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9b9e8b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Calling in Favors - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 60.6699944 - posY: 1.368541 - posZ: 85.15 - rotX: 0.0208100677 - rotY: 270.000732 - rotZ: 0.0167711955 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447934 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4479': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 93381d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Heroic Rescue (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.9259224 - posY: 1.29796028 - posZ: -78.57276 - rotX: 0.0208088644 - rotY: 270.000061 - rotZ: 0.0167711973 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368810 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ce0dd5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lucky! - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -41.5178833 - posY: 1.36590815 - posZ: -66.2731552 - rotX: 0.0207964685 - rotY: 270.040344 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538705 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 17319c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Azure Flame - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -64.417305 - posY: 3.28208518 - posZ: -69.3757858 - rotX: 0.020811379 - rotY: 270.001343 - rotZ: 0.01676319 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230362 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f2877e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sacrifice (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.40248215 - posZ: 32.7900238 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230310 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 14e212 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Delve Too Deep - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -49.08289 - posY: 1.86691129 - posZ: -105.318573 - rotX: 0.0208076313 - rotY: 270.000061 - rotZ: 0.0167738479 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232900 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2329': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Head Librarian - DragSelectable: true - GMNotes: '' - GUID: 66197b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dr. Henry Armitage - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -43.2092628 - posY: 2.37336755 - posZ: -67.14607 - rotX: 0.020810511 - rotY: 270.000031 - rotZ: 0.0167691223 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 293013 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2930': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Survivor - DragSelectable: true - GMNotes: '' - GUID: cbe256 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Tennessee Sour Mash (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.6885529 - posY: 1.65134215 - posZ: -48.9234848 - rotX: 359.90155 - rotY: 269.982483 - rotZ: 359.886169 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552220 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3698': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 49a91e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Roland's .38 Special - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 86.96031 - posY: 1.51700377 - posZ: -58.5377922 - rotX: 0.00607056357 - rotY: 269.999817 - rotZ: 0.0136969965 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315259 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e7f37b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Suggestion (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.749992 - posY: 1.41696262 - posZ: -38.80001 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226351 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2f9de4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Keen Eye (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.41285515 - posZ: -17.969986 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450612 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 922d4c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Segment of Onyx (1) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.5141525 - posY: 1.45858431 - posZ: -51.151886 - rotX: 0.0208085477 - rotY: 269.999664 - rotZ: 0.0167702287 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 444021 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4408': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1e9213 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Storm of Spirits (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 92.9545746 - posY: 1.56445456 - posZ: 24.95834 - rotX: 359.985535 - rotY: 270.028625 - rotZ: 359.981476 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450620 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ff1dfe - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: All In (5) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.35118 - posY: 1.38161 - posZ: -51.1732025 - rotX: 0.0208080132 - rotY: 269.999664 - rotZ: 0.0167661514 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447933 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4479': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7dc42a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Safeguard (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.1557045 - posY: 1.29952526 - posZ: -70.459816 - rotX: 0.0208098479 - rotY: 269.9981 - rotZ: 0.016770659 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538803 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e69708 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Arcane Enlightenment - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.78602 - posY: 3.28266287 - posZ: -75.9813461 - rotX: 0.0208097789 - rotY: 269.997223 - rotZ: 0.0167707633 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379928 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3799': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Untranslated - DragSelectable: true - GMNotes: '' - GUID: b81dcf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dream Diary - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.2744427 - posY: 1.67508531 - posZ: 2.87569213 - rotX: 359.9198 - rotY: 269.9968 - rotZ: 0.01500414 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527400 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2666': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 2210c1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Amnesia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 74.09517 - posY: 1.505425 - posZ: 82.26855 - rotX: 0.02296656 - rotY: 270.017578 - rotZ: 0.002943524 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538829 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b4121c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Farsight (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.5906525 - posY: 3.16649461 - posZ: -81.15508 - rotX: 0.0208091084 - rotY: 269.997253 - rotZ: 0.0167697426 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379711 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3797': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: eca1c8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Versatile (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.7186317 - posY: 1.52759826 - posZ: 11.0690155 - rotX: 359.920135 - rotY: 269.999359 - rotZ: 0.0168778952 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368705 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: dcdcea - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"You handle this one!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500023 - posY: 1.35680318 - posZ: 85.15 - rotX: 0.0208152775 - rotY: 269.9749 - rotZ: 0.0167649742 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440624 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4406': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 45c582 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hope - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.2787247 - posY: 1.399232 - posZ: 37.56264 - rotX: 359.988373 - rotY: 269.993164 - rotZ: 359.9784 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 275733 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2757': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/829135524526809828/AB799C8FFD9024655A9F179CCFF1EE30DE0D3C75/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Spell. - DragSelectable: true - GMNotes: '' - GUID: 863f1a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Spectral Web - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.35961 - posY: 3.6559422 - posZ: -65.68756 - rotX: 0.0124424249 - rotY: 269.999939 - rotZ: 180.020645 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380127 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3801': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bba97a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Healing Words - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.3107014 - posY: 1.67212927 - posZ: -4.16523552 - rotX: 359.9424 - rotY: 269.991333 - rotZ: -0.005215286 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368838 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8a4673 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fire Extinguisher (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.37135 - posY: 3.51983881 - posZ: -65.69757 - rotX: 0.0124902874 - rotY: 270.0 - rotZ: 180.027863 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 534902 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2317': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/778493212055041441/90F035BD69A7C5C6B6F43426DDDA3A09DFCBCBDF/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Two Days Until Retirement - DragSelectable: true - GMNotes: '' - GUID: 5630c2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sergeant Monroe - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -41.17111 - posY: 2.37525 - posZ: -70.6252747 - rotX: 0.0211165547 - rotY: 270.0 - rotZ: 0.0169378966 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538607 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Feisty Mechanic - DragSelectable: true - GMNotes: '' - GUID: ad0ef0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lonnie Ritter - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.9314423 - posY: 3.28531146 - posZ: -69.8925552 - rotX: 0.0208135452 - rotY: 269.9931 - rotZ: 0.0167604648 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551200 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: deea7a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Catling Gun - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.15583 - posY: 1.50774717 - posZ: 12.3576326 - rotX: 359.920135 - rotY: 270.000122 - rotZ: 0.0168947745 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440724 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4407': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cdbb37 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Easy Mark (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 93.19893 - posY: 1.56512642 - posZ: 29.48283 - rotX: 359.987854 - rotY: 269.9784 - rotZ: 359.9843 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 441026 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4410': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ff9f23 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Segment of Onyx (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.24019 - posY: 1.40603662 - posZ: 12.822814 - rotX: 359.987183 - rotY: 270.0061 - rotZ: 359.986481 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368858 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b0c61c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: On Your Own (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.41347623 - posZ: -31.9000053 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226302 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '889121' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Vicious Blow - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.0300045 - posY: 1.3516556 - posZ: 82.85 - rotX: 0.0208114255 - rotY: 269.987427 - rotZ: 0.0167701989 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430648 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Protective Amulet - DragSelectable: true - GMNotes: '' - GUID: b00b76 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Disc of Itzamna (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.41018677 - posZ: -1.7099812 - rotX: 359.987427 - rotY: 270.000122 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226319 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 97986a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dynamite Blast - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6299963 - posY: 1.34099555 - posZ: 50.6499977 - rotX: 0.0207956564 - rotY: 270.027039 - rotZ: 0.0167747736 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368620 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c33a10 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Liquid Courage - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500027 - posY: 1.35489511 - posZ: 82.85 - rotX: 0.0208108556 - rotY: 269.98877 - rotZ: 0.0167696662 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 313501 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3135': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Over the Threshold and Beyond - DragSelectable: true - GMNotes: '' - GUID: 05da68 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Seal of the Seventh Sign (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.75998 - posY: 1.3775233 - posZ: -47.71002 - rotX: 0.02080785 - rotY: 269.999878 - rotZ: 0.0167682189 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368425 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ba16cb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Medical Texts - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.640003 - posY: 1.34072971 - posZ: 73.65 - rotX: 0.0208145548 - rotY: 269.978821 - rotZ: 0.0167659223 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551201 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 29bafb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: More Bark Than Bite - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.11447 - posY: 1.47629988 - posZ: 12.3989725 - rotX: 359.920135 - rotY: 269.999939 - rotZ: 0.0168736614 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368819 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e8ea95 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cunning Distraction - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.970005 - posY: 1.35377693 - posZ: 52.9500046 - rotX: 0.0208033528 - rotY: 270.012939 - rotZ: 0.01677898 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 293014 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2930': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f91e14 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Guiding Spirit (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.3563347 - posY: 1.51768577 - posZ: -53.4520569 - rotX: 0.0219245274 - rotY: 270.0133 - rotZ: 0.016176559 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226344 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9956d5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Taunt (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.40727174 - posZ: 2.73001885 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538615 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b8843c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Nimble - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.6080437 - posY: 3.28531933 - posZ: -73.05481 - rotX: 0.0208127331 - rotY: 269.9931 - rotZ: 0.0167625137 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368517 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f59085 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Backpack - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 57.27 - posY: 1.36394 - posZ: 73.65 - rotX: 0.0208096988 - rotY: 269.99408 - rotZ: 0.0167709384 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368502 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5ab9f4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Overpower - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 64.07 - posY: 1.367756 - posZ: 78.25 - rotX: 0.0208083075 - rotY: 269.997284 - rotZ: 0.0167704355 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368820 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 593deb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Leather Coat - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -46.69558 - posY: 1.366081 - posZ: -59.2587624 - rotX: 0.020795757 - rotY: 270.0401 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551302 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: It Discombobulates Felines - DragSelectable: true - GMNotes: '' - GUID: 7031aa - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Feline Discombobulator - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 15.8887768 - posY: 1.50694323 - posZ: 8.303365 - rotX: 359.920135 - rotY: 270.000061 - rotZ: 0.0168491043 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368412 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d64c99 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Truth from Fiction - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.24000382 - posY: 1.340618 - posZ: 69.05 - rotX: 0.02081118 - rotY: 269.986359 - rotZ: 0.0167688 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379019 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3790': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4ea716 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Studious (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 112.560387 - posY: 1.51067376 - posZ: 48.3394127 - rotX: 0.01354435 - rotY: 270.000061 - rotZ: 0.0102723185 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 373910 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3739': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Mysterious Soothsayer - DragSelectable: true - GMNotes: '' - GUID: 03a4de - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Anna Kaslow (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.3030281 - posY: 1.72431636 - posZ: 5.39502954 - rotX: 359.9199 - rotY: 270.0 - rotZ: 0.0164847765 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 314105 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3141': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 37a2b5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Blackjack (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.40913284 - posZ: -4.169983 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550818 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5a2b49 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cherished Keepsake (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.4778328 - posY: 3.28506732 - posZ: -71.9391556 - rotX: 0.01442241 - rotY: 270.0191 - rotZ: 0.0116333654 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368836 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d88407 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lure (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.39734626 - posZ: 27.9000111 - rotX: 359.987427 - rotY: 270.000061 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379021 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3790': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: eafd12 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Blood-Rite - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -20.5311451 - posY: 1.33218 - posZ: 61.67714 - rotX: 0.02081183 - rotY: 269.995056 - rotZ: 0.0167690534 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230333 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '599209' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Protective Incantation (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.40372288 - posZ: 28.1900234 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230329 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 29b842 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Rite of Seeking - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -28.4000015 - posY: 1.33686638 - posZ: 87.45 - rotX: 0.0208066311 - rotY: 270.0064 - rotZ: 0.01677684 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368816 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 88d3c0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"Look what I found!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.58142 - posY: 1.364494 - posZ: -63.58151 - rotX: 0.0207989458 - rotY: 270.040161 - rotZ: 180.0168 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 295504 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2955': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f3b3a9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Gilded Volto - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.8639259 - posY: 3.18059015 - posZ: -97.1056061 - rotX: 359.503632 - rotY: 269.998138 - rotZ: 0.0167150069 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 377343 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3773': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7c958e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Jake Williams - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.09009 - posY: 2.18708086 - posZ: -86.02005 - rotX: 0.0208045971 - rotY: 270.0133 - rotZ: 0.0167789925 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226308 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d5cac6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Taunt - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300049 - posY: 1.34974778 - posZ: 80.55 - rotX: 0.0207943153 - rotY: 270.027039 - rotZ: 0.0167732947 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438125 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: eff3c8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Self-Centered - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.28279 - posY: 1.52067816 - posZ: 50.95579 - rotX: 0.02054261 - rotY: 270.00177 - rotZ: 180.013779 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 295502 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2955': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0f54e7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Medico Della Peste - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.5321274 - posY: 1.29888833 - posZ: -75.8911 - rotX: 0.0208082646 - rotY: 270.0001 - rotZ: 0.0167710669 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 293313 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2933': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Signs of the Black Stars - DragSelectable: true - GMNotes: '' - GUID: b40b98 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: De Vermis Mysteriis (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.93073 - posY: 1.58519077 - posZ: -53.4560623 - rotX: 0.0240930859 - rotY: 270.008118 - rotZ: 0.00300934631 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545203 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Transient Thoughts - DragSelectable: true - GMNotes: '' - GUID: 3289b0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ancient Stone (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.2151833 - posY: 3.174882 - posZ: -77.24949 - rotX: 0.0208067745 - rotY: 270.0092 - rotZ: 0.0167708267 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553104 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e99f0d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stirring Up Trouble (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.45762 - posY: 3.524239 - posZ: -65.76757 - rotX: 0.0166529622 - rotY: 270.0 - rotZ: 180.192642 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430652 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Guiding Stones - DragSelectable: true - GMNotes: '' - GUID: a14a11 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Archaic Glyphs (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.41328871 - posZ: -13.2099848 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 371565 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3715': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Hour of the Huntress - DragSelectable: true - GMNotes: '' - GUID: c729ab - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Green Man Medallion - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 76.55286 - posY: 1.52031779 - posZ: -49.5625725 - rotX: 0.0170907769 - rotY: 270.023438 - rotZ: 0.0156170158 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 275732 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2757': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/829135524526809828/AB799C8FFD9024655A9F179CCFF1EE30DE0D3C75/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Signed in Blood - DragSelectable: true - GMNotes: '' - GUID: ae3775 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Black Book - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.35961 - posY: 3.65594316 - posZ: -65.68756 - rotX: 0.0124454033 - rotY: 269.999939 - rotZ: 180.02034 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 313301 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3133': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5f33be - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Handcuffs - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230006 - posY: 1.34649336 - posZ: 73.65001 - rotX: 0.0208175331 - rotY: 269.969421 - rotZ: 0.0167613383 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226312 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: acf2b0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"If it bleeds..."' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300058 - posY: 1.34705472 - posZ: 71.3500061 - rotX: 0.0207952652 - rotY: 270.027039 - rotZ: 0.01677259 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368809 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2c2d9a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bait and Switch - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.97 - posY: 1.36118257 - posZ: 78.25 - rotX: 0.0208049417 - rotY: 270.012939 - rotZ: 0.0167780388 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 293216 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2932': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0ce005 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Esoteric Atlas (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.42852 - posY: 1.51032472 - posZ: -53.8481 - rotX: 0.0210976042 - rotY: 270.016876 - rotZ: 0.0175880175 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545207 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Stygian Waymark - DragSelectable: true - GMNotes: '' - GUID: 698fcc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Chthonian Stone (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.721096 - posY: 3.28535 - posZ: -72.75358 - rotX: 0.0208072979 - rotY: 270.0092 - rotZ: 0.0167705286 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315254 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 308be1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sure Gamble (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.41386068 - posZ: -27.300005 - rotX: 359.987427 - rotY: 269.999725 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368420 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Untranslated - DragSelectable: true - GMNotes: '' - GUID: cbfc12 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Archaic Glyphs - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.63999367 - posY: 1.344096 - posZ: 85.15001 - rotX: 0.0208136719 - rotY: 269.978821 - rotZ: 0.0167661384 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450602 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ecbea8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Pathfinder (1) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.1718178 - posY: 1.30479944 - posZ: -51.0767 - rotX: 0.0208092015 - rotY: 269.999664 - rotZ: 0.0167714041 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545206 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3d57b4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mists of R'lyeh (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.62183 - posY: 3.284762 - posZ: -72.6944351 - rotX: 0.0208067857 - rotY: 270.0092 - rotZ: 0.0167715121 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450605 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 88a481 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Streetwise (3) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.9213829 - posY: 1.30494022 - posZ: -50.9067345 - rotX: 0.0208083633 - rotY: 269.999664 - rotZ: 0.0167705156 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368402 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b265c4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Deduction - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 0.16000621 - posY: 1.345219 - posZ: 80.55001 - rotX: 0.02081996 - rotY: 269.9646 - rotZ: 0.016761994 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 312512 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3125': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: In Way Over His Head - DragSelectable: true - GMNotes: '' - GUID: d99735 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Jerome Davids - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 39.5597267 - posY: 1.354802 - posZ: 64.40544 - rotX: 0.0208125934 - rotY: 269.988464 - rotZ: 0.0167639647 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553227 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2ea0d0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Token of Faith - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.658844 - posY: 1.2999934 - posZ: -58.2065773 - rotX: 0.0208082758 - rotY: 270.0 - rotZ: 0.0167708118 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368627 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5690d1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Knuckleduster - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500046 - posY: 1.34950924 - posZ: 64.45 - rotX: 0.0208122581 - rotY: 269.98877 - rotZ: 0.0167700984 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550821 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 71a760 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: A Test of Will (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.65601 - posY: 3.28511643 - posZ: -70.35067 - rotX: 0.0147328787 - rotY: 270.0195 - rotZ: 0.0118839992 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545214 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 180b5b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sell Your Soul - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.9590836 - posY: 3.16908 - posZ: -74.77038 - rotX: 0.0208086688 - rotY: 269.999756 - rotZ: 0.0167709328 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368433 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Assistant Curator - DragSelectable: true - GMNotes: '' - GUID: 27e7b3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dr. Elli Horowitz - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -10.0399933 - posY: 1.34353435 - posZ: 87.4500046 - rotX: 0.0208115932 - rotY: 269.984833 - rotZ: 0.0167669188 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430650 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 814ce2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Eidetic Memory (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.4114275 - posZ: -6.30998325 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315243 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2fba3b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Switchblade (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.406416 - posZ: 0.299998581 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450610 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Dealer in Secrets - DragSelectable: true - GMNotes: '' - GUID: a8afba - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mr. "Rook" (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.8497238 - posY: 1.47770345 - posZ: -51.25452 - rotX: 0.0208078567 - rotY: 269.999756 - rotZ: 0.0167897772 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226304 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 99d061 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Intrepid - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.0300045 - posY: 1.35030913 - posZ: 78.25 - rotX: 0.020811582 - rotY: 269.987427 - rotZ: 0.0167669915 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230313 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8f3c8e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hypnotic Gaze - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6 - posY: 1.3312571 - posZ: 59.85 - rotX: 0.0208162144 - rotY: 269.96698 - rotZ: 0.0167607628 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 441023 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4410': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1258c6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Logical Reasoning (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.24739 - posY: 1.45532513 - posZ: 13.47808 - rotX: 359.984955 - rotY: 270.006531 - rotZ: 359.941345 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230344 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a06aa7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Recall the Future (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76001 - posY: 1.4111675 - posZ: 0.590019047 - rotX: 359.987427 - rotY: 269.999939 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380229 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3802': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7651f3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scrounge for Supplies - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 19.9572716 - posY: 1.6682297 - posZ: -8.20728 - rotX: 359.891022 - rotY: 269.976044 - rotZ: 0.0115493527 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368503 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3ff641 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Reckless Assault - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 64.07 - posY: 1.36708272 - posZ: 75.95 - rotX: 0.020807568 - rotY: 269.997284 - rotZ: 0.0167717114 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315260 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ecfa42 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Chicago Typewriter (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.749992 - posY: 1.417583 - posZ: -41.1000137 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226306 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: eab2ed - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Teamwork - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300039 - posY: 1.35109425 - posZ: 85.15 - rotX: 0.0207958911 - rotY: 270.027039 - rotZ: 0.01677621 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368839 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 017821 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Flare (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.39920747 - posZ: 21.0000057 - rotX: 359.987427 - rotY: 270.000061 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 539500 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2317': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1017195287736531119/B300331BEF8B29732A2AD6123D59380B7ECB631C/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: John Dee Translation (Advanced) - DragSelectable: true - GMNotes: '' - GUID: 5b2e10 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: The Necronomicon - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -45.11229 - posY: 2.84077334 - posZ: -98.24499 - rotX: 0.02080472 - rotY: 270.0131 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553205 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 9be144 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shadow Agents - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.39515 - posY: 3.1665554 - posZ: -82.36551 - rotX: 0.0208085366 - rotY: 269.999329 - rotZ: 0.0167704988 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440722 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4407': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e3bd71 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Crystallizer of Dreams - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 92.95309 - posY: 1.40061021 - posZ: 29.4435387 - rotX: 359.9884 - rotY: 269.9784 - rotZ: 359.978058 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551506 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Nightmares, I Tell You - DragSelectable: true - GMNotes: '' - GUID: bbf1af - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Chew Toy of Nightmares - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 15.7711954 - posY: 1.50236475 - posZ: -7.66155148 - rotX: 359.920135 - rotY: 269.9999 - rotZ: 0.0168895219 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527236 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4491': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Monster. Extradimensional. Tindalos. - DragSelectable: true - GMNotes: '' - GUID: 86cf9c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unbound Beast - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -17.1196747 - posY: 1.67481875 - posZ: -7.70004559 - rotX: 359.9201 - rotY: 269.999939 - rotZ: 0.0168745462 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538714 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0988b2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Voice of Ra - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -65.57103 - posY: 3.28240466 - posZ: -68.8954 - rotX: 0.0208105743 - rotY: 270.001343 - rotZ: 0.0167652871 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553221 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5ec6d0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Obfuscation - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.55016 - posY: 3.28365779 - posZ: -73.90558 - rotX: 0.0208092388 - rotY: 269.999756 - rotZ: 0.0167683419 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274007 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Worlds within Worlds - DragSelectable: true - GMNotes: '' - GUID: b8c891 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Gate Box - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.39115 - posY: 1.52415013 - posZ: -50.30054 - rotX: 0.0206940472 - rotY: 270.019836 - rotZ: 0.0163330827 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447834 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4478': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Dreams of an Explorer - DragSelectable: true - GMNotes: '' - GUID: 5f9a10 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dream Diary (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.4953213 - posY: 1.59229374 - posZ: 11.9794865 - rotX: 359.920135 - rotY: 269.992523 - rotZ: 0.01688575 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230345 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2ae3ce - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Song of the Dead (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.41178787 - posZ: -1.70998144 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230339 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e27b3c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Recharge (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -49.213913 - posY: 3.16716123 - posZ: -86.69394 - rotX: 0.020808775 - rotY: 270.0 - rotZ: 0.0167716146 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 444348 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3806': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9d6e9a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Nautical Prowess - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -2.30395651 - posY: 2.05984831 - posZ: -45.23866 - rotX: 0.869807959 - rotY: 269.5711 - rotZ: 359.8488 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380029 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3800': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Muckraker - DragSelectable: true - GMNotes: '' - GUID: 90bf93 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Gregory Gry - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.0830517 - posY: 1.524828 - posZ: -0.8738573 - rotX: 359.919342 - rotY: 270.000336 - rotZ: 0.0119857425 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 377141 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3771': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 275dc3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bought in Blood - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 27.31953 - posY: 1.35254145 - posZ: -66.75125 - rotX: 0.0208099447 - rotY: 269.994476 - rotZ: 0.0167683 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545201 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c1d796 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Survival Knife (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.05881 - posY: 3.16396856 - posZ: -94.18238 - rotX: 0.020808924 - rotY: 269.999939 - rotZ: 0.01677181 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374264 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3742': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/960860341956230050/FB390FF37A182334B982AA19488275BB5C6E2219/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f8c873 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sophie - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 52.49042 - posY: 1.64879036 - posZ: -45.3774376 - rotX: 0.213860989 - rotY: 269.996277 - rotZ: 359.8976 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545319 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9e7f6a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Galvanize (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.24345 - posY: 3.16879225 - posZ: -73.3449 - rotX: 0.0208083782 - rotY: 270.0 - rotZ: 0.01676988 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 441027 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4410': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Of Nothing at All - DragSelectable: true - GMNotes: '' - GUID: 9b0dcf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Pendant of the Queen - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.96671 - posY: 1.36040926 - posZ: -67.41669 - rotX: 0.0207998231 - rotY: 270.027985 - rotZ: 0.01677813 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378762 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3787': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d8a324 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"I''m done runnin''!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 8.340292 - posY: 1.3865602 - posZ: -48.14536 - rotX: 0.02273901 - rotY: 270.006256 - rotZ: 0.008764074 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447731 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4477': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0d006f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Moonstone - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.3372574 - posY: 2.84537172 - posZ: -101.660507 - rotX: 0.0208083633 - rotY: 270.0 - rotZ: 0.0167707354 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226357 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c92ea3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shotgun (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87001 - posY: 1.41719782 - posZ: -34.0699921 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226332 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0e2987 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Venturer - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230007 - posY: 1.34178066 - posZ: 57.55 - rotX: 0.0208174214 - rotY: 269.9694 - rotZ: 0.0167613029 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230341 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4d74f6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ward of Protection (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.40930641 - posZ: 7.490021 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368504 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 679b13 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Manual Dexterity - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 64.07 - posY: 1.36640954 - posZ: 73.65 - rotX: 0.0208091382 - rotY: 269.997284 - rotZ: 0.0167735945 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 7502 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '75': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Trap. - DragSelectable: true - GMNotes: '' - GUID: c7b748 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fishing Net - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -39.2526932 - posY: 2.35122013 - posZ: -85.8765945 - rotX: 0.0208091941 - rotY: 270.0 - rotZ: 0.0167707223 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551609 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: '197242' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Out of Doggie Treats - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 15.9446363 - posY: 1.46845531 - posZ: -15.0453625 - rotX: 359.920135 - rotY: 270.000336 - rotZ: 0.0168739613 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450607 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a7da13 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Springfield M1903 (4) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.4735565 - posY: 1.50676835 - posZ: -51.0385246 - rotX: 0.0208019074 - rotY: 269.9996 - rotZ: 0.0167924613 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553200 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3c0249 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Guardian Angel - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.198864 - posY: 3.166678 - posZ: -88.62286 - rotX: 0.020808557 - rotY: 269.999329 - rotZ: 0.01677081 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 262204 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2622': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Mind-Expanding Ideas - DragSelectable: true - GMNotes: '' - GUID: 344d98 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Pnakotic Manuscripts (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.4213537 - posZ: -43.109993 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368618 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Doom Begets Doom - DragSelectable: true - GMNotes: '' - GUID: 07350b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Decorated Skull - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500027 - posY: 1.35624158 - posZ: 87.45 - rotX: 0.0208102781 - rotY: 269.9888 - rotZ: 0.01676938 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 313603 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3136': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a53344 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Clarity of Mind (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76001 - posY: 1.41675091 - posZ: -20.109993 - rotX: 359.987427 - rotY: 270.000183 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545320 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 92436b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Counterpunch (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.06254 - posY: 3.284856 - posZ: -75.18636 - rotX: 0.0208083186 - rotY: 270.0 - rotZ: 0.01677029 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230324 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9e4505 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Arcane Studies - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0 - posY: 1.3320421 - posZ: 66.75 - rotX: 0.020799553 - rotY: 270.0313 - rotZ: 0.0167842377 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440923 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4409': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a2c7ef - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"Eat lead!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 96.52021 - posY: 1.40248728 - posZ: 19.8564625 - rotX: 359.987671 - rotY: 270.0178 - rotZ: 359.984 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447631 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4476': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2aeb8a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Burglary (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.607933 - posY: 1.30007148 - posZ: -68.03267 - rotX: 0.0208079722 - rotY: 270.000061 - rotZ: 0.0167707112 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552110 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5521': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6012db - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Spiked Collar - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -43.5202332 - posY: 1.47732294 - posZ: -59.0333748 - rotX: 0.0208220333 - rotY: 269.985535 - rotZ: 0.0168014336 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230308 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6656ad - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ward of Protection - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6000023 - posY: 1.33462334 - posZ: 71.35 - rotX: 0.0208182335 - rotY: 269.966949 - rotZ: 0.01676331 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 261102 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2611': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5b14dc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Thermos - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 57.27 - posY: 1.36259353 - posZ: 69.05 - rotX: 0.0208096933 - rotY: 269.99408 - rotZ: 0.01677326 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 369815 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3698': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Soldier in a New War - DragSelectable: true - GMNotes: '' - GUID: 1f7e6e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Thomas Dawson - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.4537773 - posY: 3.51925826 - posZ: -65.76391 - rotX: 0.010968118 - rotY: 270.644318 - rotZ: 180.0133 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379830 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3798': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b6506d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"Fool me once..." (1)' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 19.9733334 - posY: 1.6903677 - posZ: 7.17354536 - rotX: 359.9186 - rotY: 270.001282 - rotZ: 0.0155457929 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553800 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5538': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507632983/CC643186858EEC718B5F3FEA9CD7D0CEDE055F13/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: Fixer for Hire - DragSelectable: true - GMNotes: '' - GUID: 039e47 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Tristan Botley (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.18437 - posY: 1.29117286 - posZ: -60.4084244 - rotX: 0.0208082758 - rotY: 270.000061 - rotZ: 0.0167711321 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545323 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 14424c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mano a Mano (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.46355 - posY: 3.16915441 - posZ: -71.3471756 - rotX: 0.0208082441 - rotY: 270.0 - rotZ: 0.0167706981 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277605 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2776': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: be33f5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Tennessee Sour Mash - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -34.6968155 - posY: 1.32354212 - posZ: 49.7424278 - rotX: 0.02080729 - rotY: 269.998566 - rotZ: 0.0167727023 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368833 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1b4434 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dark Horse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 42.5700035 - posY: 1.35388863 - posZ: 57.5500031 - rotX: 0.0208167 - rotY: 269.9702 - rotZ: 0.0167615525 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368850 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c077bf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Against All Odds (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40789282 - posZ: -11.2000046 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538608 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: dfbc13 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Leather Jacket - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.20998 - posY: 3.28602529 - posZ: -69.89087 - rotX: 0.0208133571 - rotY: 269.9931 - rotZ: 0.01676065 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368856 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 83c86b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Alter Fate (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.4122355 - posZ: -27.3000031 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277512 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2775': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6eceef - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sixth Sense - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -26.6880589 - posY: 1.4528209 - posZ: 43.8413734 - rotX: 0.0197454374 - rotY: 269.9732 - rotZ: 353.253143 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 235857 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2358': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777501236/D145C8B748FB42258EB442B9DF36797851CEECC3/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Unleash the Timestream - DragSelectable: true - GMNotes: '' - GUID: 35bc58 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Relic of Ages - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -45.62158 - posY: 1.30171525 - posZ: -72.31322 - rotX: 0.0208297186 - rotY: 269.999664 - rotZ: 0.0166090112 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553204 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2561b9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: In the Shadows - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.32988 - posY: 3.167284 - posZ: -82.43804 - rotX: 0.020808626 - rotY: 269.999329 - rotZ: 0.0167706925 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553106 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 31cfbf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Breaking and Entering - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.45762 - posY: 3.52574182 - posZ: -65.76769 - rotX: 0.0166542158 - rotY: 270.0 - rotZ: 180.27095 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430659 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 536b52 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Arcane Insight (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.41949248 - posZ: -36.2099876 - rotX: 359.987427 - rotY: 270.0001 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448736 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4487': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: ae16e8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dream Parasite - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -23.6763325 - posY: 1.6884582 - posZ: 7.569965 - rotX: 359.9201 - rotY: 269.999939 - rotZ: 0.0168768261 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 262201 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2622': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Minds in Harmony - DragSelectable: true - GMNotes: '' - GUID: 9c56d3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ancient Stone (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05001 - posY: 1.41825175 - posZ: -31.609993 - rotX: 359.987427 - rotY: 270.000122 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440925 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4409': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Treachery - DragSelectable: true - GMNotes: '' - GUID: aafc17 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bloodlust - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -38.1916046 - posY: 1.36471915 - posZ: -64.52677 - rotX: 0.0206168424 - rotY: 270.022461 - rotZ: 0.009735803 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538622 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4a45c6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Slip Away (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.1784477 - posY: 3.285562 - posZ: -70.44782 - rotX: 0.0208119359 - rotY: 269.9931 - rotZ: 0.0167640112 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545326 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Purifier - DragSelectable: true - GMNotes: '' - GUID: b39b78 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Grete Wagner (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.3079376 - posY: 3.170257 - posZ: -72.36504 - rotX: 0.0208083745 - rotY: 270.0 - rotZ: 0.01677083 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368855 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3f91af - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Rabbit's Foot (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.41161513 - posZ: -25.0000057 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450606 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fcffa3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scrapper (3) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.44427 - posY: 1.516405 - posZ: -51.0460434 - rotX: 0.0208013821 - rotY: 269.9996 - rotZ: 0.0167919081 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431818 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3739': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e6efe6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bury Them Deep - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 52.9744873 - posY: 1.4029851 - posZ: -45.9182663 - rotX: 0.652829766 - rotY: 269.939 - rotZ: 359.007477 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553222 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 17d34b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Faustian Bargain - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.52753 - posY: 3.28373384 - posZ: -73.61414 - rotX: 0.0208087936 - rotY: 269.999817 - rotZ: 0.0167692918 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226333 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c55160 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mano a Mano (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.39920676 - posZ: 32.6300278 - rotX: 359.987427 - rotY: 269.9999 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368716 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cdfd9f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Backstab - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500042 - posY: 1.34872425 - posZ: 57.5500031 - rotX: 0.0208148975 - rotY: 269.9749 - rotZ: 0.0167642422 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315233 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Ferryman's Pay - DragSelectable: true - GMNotes: '' - GUID: 1dbc95 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Charon's Obol (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.39835107 - posZ: 30.20001 - rotX: 359.987427 - rotY: 269.9998 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368424 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e5dd39 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hyperawareness - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.64000368 - posY: 1.34140289 - posZ: 75.95 - rotX: 0.0208141617 - rotY: 269.978821 - rotZ: 0.0167653561 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 292814 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2928': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ec38db - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Warning Shot - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.52426 - posY: 1.50795782 - posZ: -53.83897 - rotX: 0.02122694 - rotY: 270.0166 - rotZ: 0.0197900087 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368520 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 408cb5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Emergency Cache (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.395855 - posZ: 27.9000053 - rotX: 359.987427 - rotY: 269.9999 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380028 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3800': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2cfa4f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Swift Reload (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.1356068 - posY: 1.687724 - posZ: -1.17973149 - rotX: 359.921173 - rotY: 270.000244 - rotZ: 0.0157240219 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545315 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 22bb1e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: One-Two Punch - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.29341 - posY: 3.286482 - posZ: -69.44972 - rotX: 0.0208144 - rotY: 269.979553 - rotZ: 0.0167634841 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368829 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3fe6de - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Gravedigger's Shovel - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 42.5700035 - posY: 1.35658157 - posZ: 66.75 - rotX: 0.020816626 - rotY: 269.9702 - rotZ: 0.016764015 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 235603 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2356': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: "\u2026A Device, of Some Sort" - DragSelectable: true - GMNotes: '' - GUID: e27a30 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Relic of Ages - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.374157 - posY: 3.52680039 - posZ: -65.70076 - rotX: 0.0117934821 - rotY: 269.999969 - rotZ: 180.384445 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226347 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fe0cc0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .45 Automatic (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.41037369 - posZ: -8.769983 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 441025 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4410': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7686cb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Astounding Revelation - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.23474 - posY: 1.60116971 - posZ: 13.8044615 - rotX: 359.978638 - rotY: 270.006348 - rotZ: 359.946381 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527312 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5273': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 122e98 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lucid Dreaming (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -49.90816 - posY: 1.29874861 - posZ: -77.14222 - rotX: 0.0208085887 - rotY: 270.0 - rotZ: 0.0167711675 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553224 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 823e49 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Tides of Fate - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -66.3870544 - posY: 3.28106 - posZ: -75.48472 - rotX: 0.0208089966 - rotY: 269.999878 - rotZ: 0.01676939 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277812 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2778': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8dce44 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Crack the Case - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -34.2288666 - posY: 1.32635069 - posZ: 58.7566338 - rotX: 0.0208084267 - rotY: 269.999451 - rotZ: 0.0167746413 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538702 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: fc4168 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Nihilism - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.2335472 - posY: 3.284022 - posZ: -71.82146 - rotX: 0.0208121873 - rotY: 270.001343 - rotZ: 0.0167624224 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545310 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 20645e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Counterpunch - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.9353943 - posY: 3.285697 - posZ: -71.07089 - rotX: 0.020814443 - rotY: 269.979553 - rotZ: 0.0167631917 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 292915 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2929': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Rogue - DragSelectable: true - GMNotes: '' - GUID: d4dbc7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .45 Thompson (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.28594 - posY: 1.36603451 - posZ: -55.2474 - rotX: 0.0208098963 - rotY: 270.000031 - rotZ: 0.0167697147 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545204 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Doom Begets Doom - DragSelectable: true - GMNotes: '' - GUID: 946a58 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Decorated Skull (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.5000725 - posY: 3.16913486 - posZ: -87.17431 - rotX: 0.0208039563 - rotY: 270.0092 - rotZ: 0.0167778078 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 314000 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3140': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 53d765 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Blood Eclipse (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.41409588 - posZ: -22.5699883 - rotX: 359.987427 - rotY: 269.999939 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 449036 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4490': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: 'Lookin'' Out For #1' - DragSelectable: true - GMNotes: '' - GUID: 48c9ff - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Joey "The Rat" Vigil (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -30.224144 - posY: 1.696496 - posZ: 3.8599503 - rotX: 359.9201 - rotY: 269.9999 - rotZ: 0.016874982 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226361 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2d362c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lightning Gun (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.86998 - posY: 1.38363731 - posZ: -45.57002 - rotX: 0.0208066348 - rotY: 269.999878 - rotZ: 0.0167749375 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230350 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e58d2a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scrying (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76001 - posY: 1.41551018 - posZ: -15.5099869 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368843 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 06228f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stroke of Luck (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40292978 - posZ: 7.200001 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553216 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Untranslated - DragSelectable: true - GMNotes: '' - GUID: fbfa24 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cryptic Grimoire - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.5655136 - posY: 3.16720319 - posZ: -83.0385742 - rotX: 0.0208087545 - rotY: 269.999 - rotZ: 0.0167708974 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 372110 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3721': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 03c6a7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Jim's Trumpet - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.8095436 - posY: 2.18439317 - posZ: -93.41783 - rotX: 0.02080927 - rotY: 270.001282 - rotZ: 0.01677108 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226353 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bc80ab - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: First Aid (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.41471636 - posZ: -24.86999 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230320 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 54832d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Alchemical Transmutation - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0000019 - posY: 1.334735 - posZ: 75.95 - rotX: 0.0207990371 - rotY: 270.0313 - rotZ: 0.0167850517 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368622 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bc3451 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Burglary - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500046 - posY: 1.35354865 - posZ: 78.25 - rotX: 0.020810673 - rotY: 269.98877 - rotZ: 0.0167701356 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545327 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 14dcc4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dynamite Blast (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.6857872 - posY: 3.16924047 - posZ: -74.11199 - rotX: 0.0208083056 - rotY: 270.0 - rotZ: 0.0167706981 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226311 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bb0f6a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Heroic Rescue - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300049 - posY: 1.347728 - posZ: 73.65001 - rotX: 0.0207946822 - rotY: 270.027039 - rotZ: 0.0167737771 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 537608 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 85e7d9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Accursed Fate - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.6443253 - posY: 1.30579412 - posZ: -52.1594467 - rotX: 0.0208084453 - rotY: 269.999969 - rotZ: 0.0167711936 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230312 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 31d087 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Astral Travel - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6 - posY: 1.3319304 - posZ: 62.15 - rotX: 0.020817386 - rotY: 269.96698 - rotZ: 0.0167596154 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550807 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 59e40d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mysterious Raven - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.5242081 - posY: 3.2846055 - posZ: -72.25517 - rotX: 0.0147317043 - rotY: 270.0195 - rotZ: 0.0118827661 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550822 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fd393b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"Look what I found!" (2)' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.85212 - posY: 3.2834022 - posZ: -74.7243 - rotX: 0.0147321578 - rotY: 270.0195 - rotZ: 0.01188326 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538828 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Secrets Revealed - DragSelectable: true - GMNotes: '' - GUID: f375bf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Forbidden Tome (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.6860657 - posY: 3.1647644 - posZ: -86.302124 - rotX: 0.0208092518 - rotY: 269.997253 - rotZ: 0.0167697333 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274001 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e567ff - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Rookie Mistake - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -41.9113426 - posY: 1.36391878 - posZ: -62.9399719 - rotX: 0.0208036676 - rotY: 270.0199 - rotZ: 0.0167777035 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 278011 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2780': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a3f105 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Something Worth Fighting For - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -26.43471 - posY: 1.32809985 - posZ: 55.0619354 - rotX: 0.0208080262 - rotY: 269.999481 - rotZ: 0.0167707372 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447833 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4478': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3dc25c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Extensive Research (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -46.69135 - posY: 1.29797947 - posZ: -83.76117 - rotX: 0.0208081 - rotY: 270.0 - rotZ: 0.0167707074 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538722 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 219c78 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Guts (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.1411438 - posY: 3.283662 - posZ: -74.34069 - rotX: 0.02080953 - rotY: 270.001343 - rotZ: 0.0167674515 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538822 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 870bdc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cryptic Writings (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.6345139 - posY: 3.16492057 - posZ: -82.63101 - rotX: 0.0208092444 - rotY: 269.997253 - rotZ: 0.01676957 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274606 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2746': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '051742' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Able Bodied - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 49.37 - posY: 1.36039758 - posZ: 71.35 - rotX: 0.0208197385 - rotY: 269.9588 - rotZ: 0.0167587847 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545202 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 45cd73 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Truth from Fiction (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.762722 - posY: 3.28358555 - posZ: -76.61391 - rotX: 0.02080613 - rotY: 270.0092 - rotZ: 0.0167743526 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 295503 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2955': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 080d4a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Pantalone - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.1961975 - posY: 1.303426 - posZ: -60.8053932 - rotX: 0.0208087284 - rotY: 270.0 - rotZ: 0.01677115 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368410 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f763e8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unearth the Ancients - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.239993 - posY: 1.34196448 - posZ: 73.65001 - rotX: 0.02081152 - rotY: 269.9864 - rotZ: 0.0167682283 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 372011 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3720': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2c901b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Final Rhapsody - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 86.87249 - posY: 1.621133 - posZ: -58.3100052 - rotX: 0.0415969267 - rotY: 270.006866 - rotZ: 359.9695 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538724 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f5d382 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Clairvoyance (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -62.05254 - posY: 3.28342962 - posZ: -72.7563248 - rotX: 0.0208094083 - rotY: 270.001343 - rotZ: 0.0167680066 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 293314 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2933': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Mystic - DragSelectable: true - GMNotes: '' - GUID: d0de54 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Enchanted Blade (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.77679 - posY: 1.52551687 - posZ: -49.1203079 - rotX: 0.013238864 - rotY: 269.99353 - rotZ: 0.00522407331 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 369424 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3694': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 02777c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: On the Lam - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.76734 - posY: 1.29576933 - posZ: -86.254364 - rotX: 0.0208080411 - rotY: 270.0001 - rotZ: 0.0167710967 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 313905 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3139': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Empowering Elixir - DragSelectable: true - GMNotes: '' - GUID: d96e4b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Strange Solution (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05001 - posY: 1.417011 - posZ: -27.0099945 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368428 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 07a8f0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Art Student - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.64000273 - posY: 1.33871 - posZ: 66.75 - rotX: 0.0208162684 - rotY: 269.978821 - rotZ: 0.0167661086 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368713 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b18b33 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sneak Attack - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500061 - posY: 1.35141718 - posZ: 66.75 - rotX: 0.0208151527 - rotY: 269.9749 - rotZ: 0.0167625621 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430808 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2732': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9e5cd2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Curiosity - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 0.160005137 - posY: 1.34723866 - posZ: 87.4500046 - rotX: 0.02081934 - rotY: 269.9646 - rotZ: 0.0167605542 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 454740 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4547': - BackIsHidden: true - BackURL: https://i.imgur.com/r6F1mt2.jpg - FaceURL: https://i.imgur.com/CN9PXUd.jpg - NumHeight: 5 - NumWidth: 10 - Type: 0 - UniqueBack: true - Description: Ally. Government. - DragSelectable: true - GMNotes: '' - GUID: cfb393 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: John & Jessie Burke - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.7820168 - posY: 2.36514521 - posZ: -94.073204 - rotX: 0.02081031 - rotY: 270.0 - rotZ: 0.0167692546 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368821 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 215cec - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cherished Keepsake - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 42.57 - posY: 1.36196756 - posZ: 85.15 - rotX: 0.02081672 - rotY: 269.9702 - rotZ: 0.0167616438 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230346 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2236f6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Counterspell (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.41240823 - posZ: -4.00998259 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368815 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 59d89b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Oops! - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.970005 - posY: 1.35647 - posZ: 62.15 - rotX: 0.0208052136 - rotY: 270.0129 - rotZ: 0.016778376 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368859 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8837ff - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: True Survivor (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.41409659 - posZ: -34.2 - rotX: 359.987427 - rotY: 269.999847 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380125 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3801': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0d926f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scroll of Prophecies - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.18582 - posY: 1.68684137 - posZ: -4.21236 - rotX: 359.933044 - rotY: 270.002258 - rotZ: 0.0111596575 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538814 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '013446' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Extensive Research - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.3100357 - posY: 3.28346276 - posZ: -76.4470444 - rotX: 0.0208093561 - rotY: 269.997253 - rotZ: 0.0167692974 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378016 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3780': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bf5a5f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Small Favor - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 46.1860275 - posY: 1.35657763 - posZ: 62.2501678 - rotX: 0.020814402 - rotY: 269.982 - rotZ: 0.01676661 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 293215 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2932': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6de21b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Knowledge is Power - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.55411 - posY: 1.53692091 - posZ: -53.7382545 - rotX: 0.0209390428 - rotY: 270.015747 - rotZ: 0.0191810168 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374717 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3747': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d8705c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Angered Spirits - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 52.7983246 - posY: 1.64011288 - posZ: -45.68833 - rotX: 0.1292641 - rotY: 270.009277 - rotZ: 359.981171 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368826 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ee20c9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Newspaper - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 42.57 - posY: 1.35860133 - posZ: 73.65 - rotX: 0.0208154488 - rotY: 269.9702 - rotZ: 0.01676301 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450603 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 842d41 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Switchblade (2) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.4471359 - posY: 1.30509317 - posZ: -50.972744 - rotX: 0.0208083689 - rotY: 269.999664 - rotZ: 0.01677047 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368840 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Lost Son of Earth - DragSelectable: true - GMNotes: '' - GUID: a7358f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Yaotl (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40106857 - posZ: 14.1000023 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230352 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Gift of the Homunculi - DragSelectable: true - GMNotes: '' - GUID: 6bae15 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Jewel of Aureolus (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76 - posY: 1.41799176 - posZ: -24.7099953 - rotX: 359.987427 - rotY: 270.000061 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447832 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4478': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1ac667 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Practice Makes Perfect - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -44.6022263 - posY: 2.84541368 - posZ: -100.448311 - rotX: 0.0208086036 - rotY: 270.0 - rotZ: 0.0167711917 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545304 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 52c686 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Flesh Ward - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.934803 - posY: 3.28626966 - posZ: -69.98283 - rotX: 0.0208145157 - rotY: 269.979553 - rotZ: 0.0167626 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277604 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2776': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '230835' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scroll of Secrets - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -27.5756321 - posY: 1.326131 - posZ: 49.75152 - rotX: 0.0208086669 - rotY: 269.9986 - rotZ: 0.01677173 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230309 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: da7613 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dark Prophecy - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6000023 - posY: 1.33395016 - posZ: 69.05 - rotX: 0.0208175573 - rotY: 269.96698 - rotZ: 0.01676294 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 370827 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3708': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7275bc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dark Memory - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.1921158 - posY: 1.37513125 - posZ: -65.1841354 - rotX: 0.0197697822 - rotY: 269.863434 - rotZ: 0.0104709994 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 235649 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2356': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9dc3d4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Expedition Journal - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.3065948 - posY: 3.16604829 - posZ: -95.28326 - rotX: 0.0208080523 - rotY: 270.0001 - rotZ: 0.0167709477 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450624 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 41e560 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .35 Winchester (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.5040245 - posY: 1.34825277 - posZ: -50.91714 - rotX: 0.0124848755 - rotY: 270.000031 - rotZ: 0.0100587066 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368508 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: acb83a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unexpected Courage - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 64.07 - posY: 1.36506307 - posZ: 69.05 - rotX: 0.02081015 - rotY: 269.997284 - rotZ: 0.0167725924 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553207 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 6aea76 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Occult Scraps - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.53872 - posY: 3.16745186 - posZ: -79.12552 - rotX: 0.0208098 - rotY: 269.999329 - rotZ: 0.01677202 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315257 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Stealing Time - DragSelectable: true - GMNotes: '' - GUID: 62d930 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Gold Pocket Watch (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.749992 - posY: 1.41572177 - posZ: -34.200016 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230332 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 98fc57 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Grounded (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.40310252 - posZ: 30.4900265 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315240 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Louisiana Lion - DragSelectable: true - GMNotes: '' - GUID: 27446e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Leo De Luca (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.9715042 - posY: 2.18760157 - posZ: -92.92407 - rotX: 359.9792 - rotY: 270.0 - rotZ: 180.003784 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545205 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8dda2d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Colt Vest Pocket (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.0583534 - posY: 3.16848969 - posZ: -77.61848 - rotX: 0.0208065715 - rotY: 270.0092 - rotZ: 0.0167740323 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232904 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2329': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Professor of Languages - DragSelectable: true - GMNotes: '' - GUID: 42806b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Professor Warren Rice - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.05947 - posY: 2.373765 - posZ: -66.9028549 - rotX: 0.0208103973 - rotY: 270.000031 - rotZ: 0.0167690516 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315256 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: No-Nonsense Archaeologist - DragSelectable: true - GMNotes: '' - GUID: 8bec05 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lola Santiago (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.41510141 - posZ: -31.9000053 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553228 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8b46b2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Keep Faith - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.5964127 - posY: 1.3651222 - posZ: -58.195 - rotX: 0.0208016783 - rotY: 269.999939 - rotZ: 0.016794458 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368853 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: dffe4a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scrapper (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.4103744 - posZ: -20.4000053 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538824 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9b1c5b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mind Over Matter (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.3897552 - posY: 3.18030715 - posZ: -81.2347946 - rotX: 0.0208092984 - rotY: 269.997253 - rotZ: 0.0167696085 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368715 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b8c93a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cheap Shot - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500042 - posY: 1.35007071 - posZ: 62.1500053 - rotX: 0.0208151955 - rotY: 269.974884 - rotZ: 0.0167636182 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551608 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: I Guess His Name is "Pete?" - DragSelectable: true - GMNotes: '' - GUID: 448d3a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Friendly Human - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.128437 - posY: 1.49981213 - posZ: -14.769701 - rotX: 359.9201 - rotY: 269.999817 - rotZ: 0.01682643 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 504613 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4550': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: '313167' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Yaztaroth - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -41.1091042 - posY: 1.2648226 - posZ: 55.7025 - rotX: 0.0210862644 - rotY: 269.9919 - rotZ: 0.014994096 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 313502 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3135': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b94d12 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shards of the Void (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76 - posY: 1.41737127 - posZ: -22.4099979 - rotX: 359.987427 - rotY: 270.000061 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226329 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e25dc1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: True Grit - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230007 - posY: 1.34380043 - posZ: 64.4500046 - rotX: 0.0208176039 - rotY: 269.9694 - rotZ: 0.0167631973 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226340 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Pure of Spirit - DragSelectable: true - GMNotes: '' - GUID: 3c9617 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Brother Xavier (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.40479016 - posZ: 11.9300222 - rotX: 359.987427 - rotY: 270.000061 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 313906 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3139': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5e32a5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Preposterous Sketches (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.40336251 - posZ: 23.590023 - rotX: 359.987427 - rotY: 270.0001 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 233607 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2336': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Logistical Genius - DragSelectable: true - GMNotes: '' - GUID: 4120f3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lt. Wilson Stewart - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.3919563 - posY: 1.31971157 - posZ: -46.01424 - rotX: 359.394073 - rotY: 270.001282 - rotZ: 0.016761262 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 312509 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3125': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Elegant and Elusive - DragSelectable: true - GMNotes: '' - GUID: 83b588 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: August Lindquist - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.2187462 - posY: 1.36356008 - posZ: -57.5782471 - rotX: 0.0208096523 - rotY: 270.000031 - rotZ: 0.0167725645 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315252 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 074858 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ace in the Hole (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.41262 - posZ: -22.7000065 - rotX: 359.987427 - rotY: 269.999939 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553211 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cc1ef3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Book of Psalms - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.9021 - posY: 3.16692567 - posZ: -84.25069 - rotX: 0.0208106972 - rotY: 269.999 - rotZ: 0.01676831 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527561 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3798': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 06322f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Terrible Secret - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 6.347881 - posY: 1.52229333 - posZ: -78.62629 - rotX: 0.037793614 - rotY: 269.967255 - rotZ: 0.009221422 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430907 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2728': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ff3f17 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Eldritch Inspiration - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6000023 - posY: 1.33866286 - posZ: 85.15 - rotX: 0.02081807 - rotY: 269.96698 - rotZ: 0.0167602263 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368806 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cc6e4d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Take Heart - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 49.37 - posY: 1.36107087 - posZ: 73.65 - rotX: 0.0208189469 - rotY: 269.9588 - rotZ: 0.0167584512 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448735 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4487': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d6f6f1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Nightmare Bauble (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -44.8109741 - posY: 2.485328 - posZ: -81.0424 - rotX: 0.0 - rotY: 270.0 - rotZ: 22.62915 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368506 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c6ac19 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Perception - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 64.07 - posY: 1.36910248 - posZ: 82.85 - rotX: 0.0208097026 - rotY: 269.997284 - rotZ: 0.01677215 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230340 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 644af9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Arcane Studies (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.40868592 - posZ: 9.790023 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378621 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3786': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 53f076 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Soothing Melody - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -20.3991413 - posY: 1.33330619 - posZ: 65.36043 - rotX: 0.0208107736 - rotY: 269.991425 - rotZ: 0.0167647582 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368527 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Let the Storm Rage - DragSelectable: true - GMNotes: '' - GUID: 1c98ff - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Key of Ys (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.40081811 - posZ: 9.499999 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368817 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0a390e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Perseverance - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.970005 - posY: 1.3551234 - posZ: 57.55 - rotX: 0.0208045263 - rotY: 270.012939 - rotZ: 0.0167773627 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 549400 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5494': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1537373966843931844/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373966843930220/4B448C6C7009864D4D1E4FBB57F48A40AF5F9136/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bcc255 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Manipulate Destiny (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.0734825 - posY: 3.28528285 - posZ: -70.7434 - rotX: 0.02080836 - rotY: 270.0 - rotZ: 0.0167710688 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431006 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2737': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4e1d91 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Steadfast - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.0300045 - posY: 1.34963584 - posZ: 75.95 - rotX: 0.0208116733 - rotY: 269.987427 - rotZ: 0.0167684965 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440924 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4409': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: "Calamitous Blade of Celepha\xEFs" - DragSelectable: true - GMNotes: '' - GUID: bbd11b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Hungering Blade (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -38.6895256 - posY: 1.509287 - posZ: -64.4644852 - rotX: 0.04871207 - rotY: 270.0308 - rotZ: 359.983429 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 233604 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2336': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2f1166 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Universal Solvent - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.1666946 - posY: 1.302138 - posZ: -64.00173 - rotX: 0.0208088867 - rotY: 270.0 - rotZ: 0.0167715326 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538730 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f00301 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ineffable Truth (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -65.64664 - posY: 3.28367877 - posZ: -69.09282 - rotX: 0.0208081361 - rotY: 270.001343 - rotZ: 0.016772 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545212 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: e27c93 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Offer You Cannot Refuse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -43.7565 - posY: 3.1718924 - posZ: -76.1044846 - rotX: 0.0208088569 - rotY: 269.999451 - rotZ: 0.01677096 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315234 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cdd6aa - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hired Muscle (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.39959192 - posZ: 25.60001 - rotX: 359.987427 - rotY: 269.9998 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553220 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b2b554 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dark Ritual - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.0262833 - posY: 3.28368235 - posZ: -73.3182 - rotX: 0.0208091456 - rotY: 269.999817 - rotZ: 0.0167693086 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277510 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2775': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 05d263 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sign Magick - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -23.23641 - posY: 1.47389865 - posZ: 43.5471077 - rotX: -0.000413226458 - rotY: 269.990479 - rotZ: 352.212463 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379617 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3796': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d24531 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Deny Existence (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 92.68603 - posY: 1.41275847 - posZ: -14.9164782 - rotX: 359.987061 - rotY: 270.0 - rotZ: 359.985779 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368512 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0ab3f1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Knife - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 57.2699966 - posY: 1.36730623 - posZ: 85.15 - rotX: 0.0208092928 - rotY: 269.994049 - rotZ: 0.0167697817 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 292816 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2928': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: db2c81 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Telescopic Sight (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.501873 - posY: 1.51489115 - posZ: -53.5625954 - rotX: 0.02066103 - rotY: 270.0146 - rotZ: 0.015778644 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226307 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 84ba9d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"I''ll see you in hell!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300039 - posY: 1.350421 - posZ: 82.85 - rotX: 0.02079607 - rotY: 270.027039 - rotZ: 0.0167730115 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448613 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4486': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: A Liar, or a Prophet, or Both - DragSelectable: true - GMNotes: '' - GUID: 16e57b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Black Cat (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -30.2241611 - posY: 1.69086015 - posZ: -15.2800369 - rotX: 359.9201 - rotY: 269.999878 - rotZ: 0.0168764312 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230322 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8e57b8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Clarity of Mind - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0 - posY: 1.33338857 - posZ: 71.35 - rotX: 0.0207986627 - rotY: 270.0313 - rotZ: 0.016783379 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 312514 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3125': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Took You Long Enough - DragSelectable: true - GMNotes: '' - GUID: 726d1d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Valentino Rivas - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 39.88332 - posY: 1.35615063 - posZ: 68.6109161 - rotX: 0.02080685 - rotY: 269.9994 - rotZ: 0.0167702865 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550803 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 101a41 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .18 Derringer - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.0710678 - posY: 3.285107 - posZ: -72.3590546 - rotX: 0.014732915 - rotY: 270.0195 - rotZ: 0.0118833436 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553212 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cf4571 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Blessed Blade - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.508297 - posY: 3.16578174 - posZ: -83.28038 - rotX: 0.020808829 - rotY: 269.999 - rotZ: 0.0167702846 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368411 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2f9ab1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Vantage Point - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.240004 - posY: 1.34129119 - posZ: 71.35 - rotX: 0.02081259 - rotY: 269.986359 - rotZ: 0.0167654455 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538603 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cc11e4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lockpicks - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.46911 - posY: 3.28525186 - posZ: -70.1147461 - rotX: 0.0208143983 - rotY: 269.9931 - rotZ: 0.0167597141 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 371806 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3718': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4156cf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Search for the Truth - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 76.2037659 - posY: 1.48903632 - posZ: -49.09441 - rotX: 0.0161498226 - rotY: 270.00058 - rotZ: 0.0117214322 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553359 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3797': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Sanctum's Reward - DragSelectable: true - GMNotes: '' - GUID: 223ba3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Twilight Blade - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 5.766281 - posY: 1.376472 - posZ: -79.3358841 - rotX: 0.0199582744 - rotY: 269.996155 - rotZ: 0.0131309 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 371112 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3711': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '876557' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Duke - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -62.51822 - posY: 1.49823117 - posZ: -57.04474 - rotX: 0.02328792 - rotY: 270.0 - rotZ: 0.0151858637 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440723 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4407': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: aec357 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Guardian of the Crystallizer - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 92.8113861 - posY: 1.56324077 - posZ: 29.4504681 - rotX: 359.9853 - rotY: 269.977234 - rotZ: 359.981079 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374014 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2098': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '170538' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Painted World - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 7.31871462 - posY: 0.6395771 - posZ: -49.1846924 - rotX: -5.89429e-06 - rotY: 269.999939 - rotZ: 359.991943 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368717 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b4ad29 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Contraband - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500061 - posY: 1.348051 - posZ: 55.2500038 - rotX: 0.0208157171 - rotY: 269.9749 - rotZ: 0.0167655777 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277711 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2777': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c2d211 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Swift Reflexes - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -31.2479954 - posY: 1.33109152 - posZ: 71.25443 - rotX: 0.0208104569 - rotY: 269.9964 - rotZ: 0.0167663582 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430639 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Unidentified - DragSelectable: true - GMNotes: '' - GUID: 9bc46e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ancient Stone (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.40460336 - posZ: 18.99002 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 312513 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3125': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Nightmare is Over - DragSelectable: true - GMNotes: '' - GUID: 73bccf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Penny White - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 35.93601 - posY: 1.35457325 - posZ: 68.1201248 - rotX: 0.0208114143 - rotY: 269.988525 - rotZ: 0.0167672429 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379829 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3798': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Too Noble for His Own Good - DragSelectable: true - GMNotes: '' - GUID: 08e5a6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Tetsuo Mori - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.1324425 - posY: 1.67257357 - posZ: 7.045372 - rotX: 359.930023 - rotY: 269.9999 - rotZ: 0.007491751 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550804 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1d75d0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Grimm's Fairy Tales - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.3364563 - posY: 3.2840364 - posZ: -71.9591446 - rotX: 0.0147323161 - rotY: 270.0195 - rotZ: 0.0118827708 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545314 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 63b3e5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Monster Slayer - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.5310669 - posY: 3.28567147 - posZ: -71.8129654 - rotX: 0.0208143331 - rotY: 269.979553 - rotZ: 0.0167633239 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545309 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3319be - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Clean Them Out - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.95456 - posY: 3.286104 - posZ: -70.60619 - rotX: 0.0208143853 - rotY: 269.979553 - rotZ: 0.0167635027 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527238 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5272': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b4b991 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shining Trapezohedron (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.4998856 - posY: 1.297716 - posZ: -78.69504 - rotX: 0.0208082087 - rotY: 270.000061 - rotZ: 0.01677083 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226358 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b1ad65 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: M1918 BAR (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87001 - posY: 1.41781831 - posZ: -36.36999 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431731 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3744': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bcf406 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shell Shock - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 52.7654457 - posY: 1.66001654 - posZ: -46.2021942 - rotX: 0.167903721 - rotY: 270.0219 - rotZ: 0.438815027 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315235 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5fe780 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Moxie (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.40021229 - posZ: 23.300005 - rotX: 359.987427 - rotY: 269.999725 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550826 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 04d33d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lucky! (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.04656 - posY: 3.28507066 - posZ: -68.765274 - rotX: 0.0147309937 - rotY: 270.0195 - rotZ: 0.0118825054 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230315 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e425d0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Arcane Research - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0000019 - posY: 1.33810127 - posZ: 87.45 - rotX: 0.020799011 - rotY: 270.0313 - rotZ: 0.01678507 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232934 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2329': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Olaus Wormius Translation - DragSelectable: true - GMNotes: '' - GUID: d45f10 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Necronomicon - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.2950974 - posY: 1.36349916 - posZ: -51.4901772 - rotX: 0.0208088756 - rotY: 270.0 - rotZ: 0.0167707372 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 371013 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3710': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 97781f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Wracked by Nightmares - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 76.6226044 - posY: 1.37552524 - posZ: -49.2005348 - rotX: 0.0178489313 - rotY: 269.9939 - rotZ: 0.015755007 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 444024 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4408': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a33acd - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Open Gate - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 93.43073 - posY: 1.5662576 - posZ: 25.0269451 - rotX: 359.986816 - rotY: 270.027649 - rotZ: 359.9844 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368509 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 510c0d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Emergency Cache - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 60.6699944 - posY: 1.36921418 - posZ: 87.45 - rotX: 0.0208074879 - rotY: 270.000732 - rotZ: 0.0167732 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430643 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9bd7cf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shortcut (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.40708482 - posZ: 9.790022 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545200 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5efc92 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Blood Eclipse (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.8165779 - posY: 3.28376937 - posZ: -77.12867 - rotX: 0.0208068 - rotY: 270.0092 - rotZ: 0.0167717934 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226300 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 50fb37 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Take the Initiative - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.0300045 - posY: 1.35300207 - posZ: 87.45 - rotX: 0.0208121948 - rotY: 269.987427 - rotZ: 0.01676891 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232300 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2323': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Humanoid. Elite. - DragSelectable: true - GMNotes: '' - GUID: 6720ef - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Man in the Pallid Mask - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -22.02582 - posY: 2.37551236 - posZ: -83.66287 - rotX: 0.020809222 - rotY: 270.0 - rotZ: 0.0167703032 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232949 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2329': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Recalling Ancient Things - DragSelectable: true - GMNotes: '' - GUID: 6714b2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Zebulon Whateley - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.8655548 - posY: 1.363576 - posZ: -55.4826279 - rotX: 0.0208091382 - rotY: 270.0 - rotZ: 0.0167707019 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380228 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3802': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Wrong Place, Wrong Time - DragSelectable: true - GMNotes: '' - GUID: b8380d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Jessica Hyde (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.11804 - posY: 1.68581808 - posZ: -7.75991 - rotX: 359.9265 - rotY: 270.0019 - rotZ: 0.0105229123 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430636 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c17f2c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Forewarned (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.40212178 - posZ: 28.1900234 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374532 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3745': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7b6ab5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Analytical Mind - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 52.42199 - posY: 1.61407924 - posZ: -45.08632 - rotX: 0.362734765 - rotY: 270.015045 - rotZ: 359.680054 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 541300 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5413': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915335843/99E638B3D735149C6624312DBAB47A3AA2D2F95D/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: Advanced - DragSelectable: true - GMNotes: '' - GUID: bd323d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Hospital Debts - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -49.0280762 - posY: 1.30279255 - posZ: -64.41893 - rotX: 0.0208086669 - rotY: 270.000031 - rotZ: 0.0167711359 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447630 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4476': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 30062e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Three Aces (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.8546753 - posY: 1.29860055 - posZ: -78.9555054 - rotX: 0.0208080355 - rotY: 270.0001 - rotZ: 0.01677129 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226320 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0d4eb9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Trench Knife - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230004 - posY: 1.35053277 - posZ: 87.45 - rotX: 0.0208162982 - rotY: 269.9694 - rotZ: 0.0167616438 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226346 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: da46e0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Police Badge (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.4097532 - posZ: -6.469983 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553218 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 96fd5d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Plan of Action - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.736805 - posY: 3.165655 - posZ: -83.77747 - rotX: 0.0208086949 - rotY: 269.999 - rotZ: 0.0167706273 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553110 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9a5782 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Eye of Chaos - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.45764 - posY: 3.51923013 - posZ: -65.76698 - rotX: 0.0166530423 - rotY: 270.0 - rotZ: 180.006729 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 371704 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3717': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 66d810 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Zoey's Cross - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -62.3385239 - posY: 1.35815763 - posZ: -56.8936729 - rotX: 0.0154275233 - rotY: 270.0 - rotZ: 0.01495364 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538813 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ff2776 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cryptic Writings - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.6868935 - posY: 3.28050661 - posZ: -74.4305038 - rotX: 0.0208092332 - rotY: 269.997253 - rotZ: 0.0167689 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551507 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 1e6cae - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: No Sense of Space or Time - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 15.8583241 - posY: 1.47067189 - posZ: -7.926416 - rotX: 359.920135 - rotY: 270.000122 - rotZ: 0.0168734919 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450609 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3d08dc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Drawing Thin (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -49.54574 - posY: 1.48710084 - posZ: -51.26631 - rotX: 0.0208053458 - rotY: 269.9997 - rotZ: 0.0167752914 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550810 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: dc4a2c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Will to Survive - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.7706871 - posY: 3.28379083 - posZ: -72.23937 - rotX: 0.0147310672 - rotY: 270.0195 - rotZ: 0.0118822018 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551912 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5519': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 44bc00 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hired Dogs - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.1418762 - posY: 1.71884549 - posZ: -31.8025227 - rotX: 358.936829 - rotY: 269.99765 - rotZ: 0.0168741662 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 444451 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3801': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3b8cb7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mystifying Song - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 4.54795074 - posY: 1.51128662 - posZ: -84.96509 - rotX: 5.05340624 - rotY: 270.0641 - rotZ: 0.0321298726 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538831 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Petrus de Dacia Translation - DragSelectable: true - GMNotes: '' - GUID: 96ba38 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Necronomicon (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.47121 - posY: 3.167239 - posZ: -78.59439 - rotX: 0.0208092071 - rotY: 269.997253 - rotZ: 0.0167703163 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448033 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4480': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Acuity - DragSelectable: true - GMNotes: '' - GUID: 3d22c4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Empower Self (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -13.2720909 - posY: 1.57276511 - posZ: 3.53009033 - rotX: 359.9201 - rotY: 270.0217 - rotZ: 0.01684677 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538618 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5065a6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Liquid Courage (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.5539131 - posY: 3.28516722 - posZ: -70.53557 - rotX: 0.0208124164 - rotY: 269.9931 - rotZ: 0.01676321 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374115 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3741': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1890d0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stars of Hyades - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.30492 - posY: 2.19019938 - posZ: -81.69471 - rotX: 0.02080839 - rotY: 270.000031 - rotZ: 0.0167755783 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315246 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2f4db2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Pickpocketing (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.40765679 - posZ: -4.300003 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368518 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ba560e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Trench Coat - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 57.27 - posY: 1.36326671 - posZ: 71.35 - rotX: 0.02081009 - rotY: 269.99408 - rotZ: 0.0167732555 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448839 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4488': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Library Intern - DragSelectable: true - GMNotes: '' - GUID: 97e9ce - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Abigail Foreman (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -17.1198387 - posY: 1.67931545 - posZ: 7.569963 - rotX: 359.9201 - rotY: 269.999939 - rotZ: 0.016875755 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274004 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4d9b32 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bounty Contracts - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.42096 - posY: 1.49901617 - posZ: -49.8807373 - rotX: 0.0231439564 - rotY: 270.0193 - rotZ: 0.0126447231 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553105 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 86d109 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Blasphemous Covenant (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.2089958 - posY: 1.3051374 - posZ: -52.35809 - rotX: 0.0208086818 - rotY: 269.999481 - rotZ: 0.0167708173 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226314 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a13ca4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: On the Hunt - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.49531 - posY: 2.36478925 - posZ: -86.53236 - rotX: 0.020807568 - rotY: 269.999939 - rotZ: 0.0167751536 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368427 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c18ebe - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Laboratory Assistant - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.64000273 - posY: 1.33938324 - posZ: 69.05 - rotX: 0.02081406 - rotY: 269.978821 - rotZ: 0.01676627 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380128 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3801': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: db90e2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ethereal Form - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.1006126 - posY: 1.52393556 - posZ: -4.153924 - rotX: 359.924347 - rotY: 270.001984 - rotZ: 0.0104675805 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550811 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 48e516 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: A Test of Will - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.1363754 - posY: 3.28423262 - posZ: -71.51533 - rotX: 0.0147310011 - rotY: 270.0195 - rotZ: 0.0118820174 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538807 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a614de - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Feed the Mind - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.1284676 - posY: 3.285403 - posZ: -72.11149 - rotX: 0.0208092984 - rotY: 269.997253 - rotZ: 0.0167689845 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553225 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 69116c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ward of Radiance - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.71407 - posY: 3.77611351 - posZ: -77.7482147 - rotX: 0.0208089836 - rotY: 269.999939 - rotZ: 0.01676984 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448032 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4480': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Alacrity - DragSelectable: true - GMNotes: '' - GUID: 4c0f00 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Empower Self (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.4537659 - posY: 3.52513242 - posZ: -65.7639 - rotX: 0.0131430849 - rotY: 270.000458 - rotZ: 179.577087 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553206 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ad63bc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Showmanship - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.29559 - posY: 3.167245 - posZ: -81.13954 - rotX: 0.0208086949 - rotY: 269.999329 - rotZ: 0.016770551 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447836 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4478': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Dreams of a Child - DragSelectable: true - GMNotes: '' - GUID: ea40f6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dream Diary (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.5937138 - posY: 1.59167707 - posZ: 9.419598 - rotX: 359.920135 - rotY: 269.992584 - rotZ: 0.016887974 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538827 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Dark Knowledge - DragSelectable: true - GMNotes: '' - GUID: 2f4507 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Forbidden Tome (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.5784874 - posY: 3.16400886 - posZ: -82.2701 - rotX: 0.0208092239 - rotY: 269.997253 - rotZ: 0.0167695917 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550801 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: e628de - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Called by the Mists - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.19686 - posY: 3.16954231 - posZ: -71.48272 - rotX: 0.0144210625 - rotY: 270.0191 - rotZ: 0.0116316061 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550806 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Tough Old Bird - DragSelectable: true - GMNotes: '' - GUID: 1cccfe - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Granny Orne - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.7423134 - posY: 3.28557158 - posZ: -71.1751556 - rotX: 0.0147321494 - rotY: 270.0195 - rotZ: 0.0118827978 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538627 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7baf75 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Backstab (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.1333046 - posY: 3.285902 - posZ: -69.16647 - rotX: 0.0208113585 - rotY: 269.9931 - rotZ: 0.016765777 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545316 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7ec473 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stand Together - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.39431 - posY: 3.16995716 - posZ: -69.50964 - rotX: 0.0208143611 - rotY: 269.979553 - rotZ: 0.0167634916 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447733 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4477': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f21109 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: A Glimmer of Hope - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.2737465 - posY: 2.84284782 - posZ: -111.100708 - rotX: 0.020808937 - rotY: 270.0 - rotZ: 0.0167718567 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448938 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4489': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 26922c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Spiritual Resolve (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.1415749 - posY: 1.30042791 - posZ: -66.1530762 - rotX: 0.0208079927 - rotY: 270.0001 - rotZ: 0.0167709365 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226356 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a7944d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Springfield M1903 (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87001 - posY: 1.41657758 - posZ: -31.7699947 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226354 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f03baa - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Custom Ammunition (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87001 - posY: 1.41533685 - posZ: -27.1699924 - rotX: 359.987427 - rotY: 269.999939 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440626 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4406': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cf9ca8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Augur - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.34123 - posY: 1.54816771 - posZ: 37.5141525 - rotX: 359.989624 - rotY: 269.9923 - rotZ: 359.9818 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538630 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: O'Bannion Driver - DragSelectable: true - GMNotes: '' - GUID: 0e72b6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Chuck Fergus (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.83603 - posY: 3.28583312 - posZ: -69.89671 - rotX: 0.020810334 - rotY: 269.9931 - rotZ: 0.0167687237 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368835 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '812685' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Devil's Luck (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.149994 - posY: 1.39610553 - posZ: 32.50001 - rotX: 359.987427 - rotY: 269.999939 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538629 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 91da6b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Beretta M1918 (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.3051529 - posY: 3.285303 - posZ: -69.7636 - rotX: 0.0208112039 - rotY: 269.9931 - rotZ: 0.016766414 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277608 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2776': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2c6509 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .45 Thompson - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -30.922472 - posY: 1.324889 - posZ: 49.66081 - rotX: 0.0208094623 - rotY: 269.993744 - rotZ: 0.016770605 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290320 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Circumstances Beyond Your Control - DragSelectable: true - GMNotes: '' - GUID: d5c93d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "The Tower \u2022 XVI" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 79.62506 - posY: 1.3658669 - posZ: 53.07699 - rotX: 0.0129812742 - rotY: 269.999023 - rotZ: 0.0141451433 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368631 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3686': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Louisiana Lion - DragSelectable: true - GMNotes: '' - GUID: eaa415 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Leo De Luca - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.11792 - posY: 2.18863821 - posZ: -89.20177 - rotX: 359.9792 - rotY: 270.0 - rotZ: 180.003784 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448737 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4487': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ff4aea - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scavenging (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.56107 - posY: 2.483187 - posZ: -84.9376 - rotX: 0.0 - rotY: 270.0 - rotZ: 22.62915 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230355 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b3ce16 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shrivelling (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.41985285 - posZ: -31.6099911 - rotX: 359.987427 - rotY: 270.000153 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 537612 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: dc5b38 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Price of Failure - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.40347 - posY: 1.3066 - posZ: -49.7053833 - rotX: 0.0208091587 - rotY: 269.999969 - rotZ: 0.0167716891 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230305 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 45d2d2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Uncage the Soul - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6000023 - posY: 1.3366431 - posZ: 78.25 - rotX: 0.02081758 - rotY: 269.967 - rotZ: 0.0167609118 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 443723 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4437': - BackIsHidden: true - BackURL: https://i.imgur.com/sRsWiSG.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 600a3c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Stars Are Right - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 93.37835 - posY: 1.401744 - posZ: 25.1459961 - rotX: 359.9877 - rotY: 270.0277 - rotZ: 359.982635 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538826 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 96b5ed - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Perception (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.4664268 - posY: 3.16685772 - posZ: -84.75948 - rotX: 0.02080912 - rotY: 269.997253 - rotZ: 0.0167696644 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 233135 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2331': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241296009359/3EF850792428E467A4475333CCBBF6E6B5975186/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Ruthless Tactician - DragSelectable: true - GMNotes: '' - GUID: 7f7ecc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Naomi O'Bannion - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -27.6088257 - posY: 2.373914 - posZ: -84.50722 - rotX: 0.020808164 - rotY: 270.0 - rotZ: 0.0484022573 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538800 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2fdcc9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Vault of Knowledge - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -62.2160721 - posY: 5.37988853 - posZ: -67.6042252 - rotX: 0.020809019 - rotY: 269.997284 - rotZ: 0.0167697947 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527605 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2742': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Message from Your Inner Self - DragSelectable: true - GMNotes: '' - GUID: e80bd8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "The Moon \u2022 XVIII (1)" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.41013837 - posZ: -13.5000048 - rotX: 359.987427 - rotY: 269.999847 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226345 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: eea4ef - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Well Prepared (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.40789211 - posZ: 0.4300183 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226316 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: baef55 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Second Wind - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300068 - posY: 1.34436178 - posZ: 62.1500053 - rotX: 0.0207944941 - rotY: 270.027039 - rotZ: 0.0167757757 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226326 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 08bdf1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Guard Dog - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230006 - posY: 1.34582007 - posZ: 71.3500061 - rotX: 0.0208174884 - rotY: 269.9694 - rotZ: 0.01676253 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 261700 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2617': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c40cb4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"Watch this!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 31.7500019 - posY: 1.358038 - posZ: 85.15 - rotX: 0.0208082516 - rotY: 270.000122 - rotZ: 0.01677166 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232950 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2329': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Smarter Than He Lets On - DragSelectable: true - GMNotes: '' - GUID: f14dce - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Earl Sawyer - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.5583954 - posY: 1.3651762 - posZ: -51.63776 - rotX: 0.0208091978 - rotY: 270.0 - rotZ: 0.0167707857 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440813 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2699': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: dd3d09 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dark Pact - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 78.90516 - posY: 1.52898574 - posZ: 71.47087 - rotX: 0.01666248 - rotY: 269.9882 - rotZ: 0.021478314 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 312510 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3125': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Mysterious Device - DragSelectable: true - GMNotes: '' - GUID: 44334c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Puzzle Box - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.31332 - posY: 1.36443675 - posZ: -54.4657478 - rotX: 0.0208098013 - rotY: 270.0 - rotZ: 0.016772978 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 377436 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3774': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0e4a82 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Codex of Ages - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.3793259 - posY: 2.1848042 - posZ: -94.20157 - rotX: 0.02080714 - rotY: 270.000854 - rotZ: 0.0167760067 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552309 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/780749631103449151/FFAADF06C9BF9D1F4F3FE22D45CEBBB15D9B58CF/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0de10c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: False Awakening - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.3814354 - posY: 3.52287769 - posZ: -65.7089539 - rotX: 0.0125160087 - rotY: 270.000122 - rotZ: 179.900925 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226338 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a1fd61 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ambush (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.4023087 - posZ: 21.130024 - rotX: 359.987427 - rotY: 269.999939 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538616 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e4688b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Daredevil - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.6074638 - posY: 3.285712 - posZ: -70.53062 - rotX: 0.0208127052 - rotY: 269.9931 - rotZ: 0.0167631619 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368417 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '812175' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Logical Reasoning - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.240002 - posY: 1.33725178 - posZ: 57.5499954 - rotX: 0.0208138786 - rotY: 269.986359 - rotZ: 0.016766822 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 546916 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/NSozoRe.jpg - FaceURL: https://i.imgur.com/HLQOkvy.jpg - NumHeight: 5 - NumWidth: 10 - Type: 0 - UniqueBack: true - Description: Item. Weapon. Relic. Melee. - DragSelectable: true - GMNotes: '' - GUID: dc674e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Khopesh of the Abyss - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -35.6707649 - posY: 2.041185 - posZ: -100.924431 - rotX: 0.020810727 - rotY: 270.0 - rotZ: 0.0167692 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550819 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5b1550 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Leather Coat (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.7273674 - posY: 3.28407264 - posZ: -71.29579 - rotX: 0.0144219482 - rotY: 270.0191 - rotZ: 0.0116329836 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 278012 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2780': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e454c3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Well-Maintained (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -30.5159187 - posY: 1.326544 - posZ: 54.8107338 - rotX: 0.02080832 - rotY: 269.998047 - rotZ: 0.0167722814 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230300 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 79287f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Torrent of Power - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -18.2000046 - posY: 1.34057081 - posZ: 87.45 - rotX: 0.0208165441 - rotY: 269.971 - rotZ: 0.0167645477 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545305 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Purifier - DragSelectable: true - GMNotes: '' - GUID: f6dfe5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Grete Wagner - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.8801346 - posY: 3.28633022 - posZ: -69.80603 - rotX: 0.0208143089 - rotY: 269.979553 - rotZ: 0.0167628229 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 376501 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3765': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f93ea8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Voice of the Messenger - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.2586918 - posY: 1.357923 - posZ: -50.11138 - rotX: 0.0269877315 - rotY: 270.035828 - rotZ: 0.01620763 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368846 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 439af2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lucky! (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40479088 - posZ: 0.299998045 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368404 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: edb554 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Barricade - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.23999453 - posY: 1.34600389 - posZ: 87.4500046 - rotX: 0.02081109 - rotY: 269.986359 - rotZ: 0.0167644043 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553109 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3feff1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Armageddon - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.45762 - posY: 3.52648163 - posZ: -65.76777 - rotX: 0.0165135432 - rotY: 270.0 - rotZ: 180.327332 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 537609 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 6cbc01 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Bell Tolls - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.8913 - posY: 1.30483675 - posZ: -55.12381 - rotX: 0.0208084658 - rotY: 269.999969 - rotZ: 0.01677108 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368861 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Forgotten Daughter - DragSelectable: true - GMNotes: '' - GUID: fb9dbb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Aquinnah (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.149994 - posY: 1.41595781 - posZ: -41.1000137 - rotX: 359.987427 - rotY: 269.999939 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230316 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 80acd2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Forbidden Knowledge - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0000019 - posY: 1.33742809 - posZ: 85.15 - rotX: 0.0207991842 - rotY: 270.0313 - rotZ: 0.01678471 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368624 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c607c5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lucky Cigarette Case - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500046 - posY: 1.35152888 - posZ: 71.35 - rotX: 0.02081083 - rotY: 269.98877 - rotZ: 0.01677086 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538600 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2c563c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Anything You Can Do, Better - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.02157 - posY: 3.285268 - posZ: -72.7382355 - rotX: 0.02081092 - rotY: 269.9931 - rotZ: 0.0167650357 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 314003 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3140': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 25ad44 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Kerosene (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.4041698 - posZ: 14.2300215 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232348 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2323': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Madness. Pact. - DragSelectable: true - GMNotes: '' - GUID: 4f903e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lost Soul - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -28.30787 - posY: 2.37636733 - posZ: -74.3676 - rotX: 0.0208093375 - rotY: 270.0 - rotZ: 0.0167706758 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368511 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5cb973 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fine Clothes - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 57.2699966 - posY: 1.36797941 - posZ: 87.45 - rotX: 0.0208086763 - rotY: 269.994049 - rotZ: 0.0167718157 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379253 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3792': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7f1b48 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hypnotic Therapy - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 7.17400074 - posY: 1.52685761 - posZ: -65.01166 - rotX: 0.0271723326 - rotY: 270.0131 - rotZ: -0.00206514588 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431205 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2667': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: b2ef43 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Indebted - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 79.12614 - posY: 1.52719057 - posZ: 71.0024948 - rotX: 0.0208145846 - rotY: 270.0049 - rotZ: 0.0171645433 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315237 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: edd6c4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lockpicks (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.401453 - posZ: 18.7000046 - rotX: 359.987427 - rotY: 269.999756 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 278010 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2780': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Fearless Flatfoot - DragSelectable: true - GMNotes: '' - GUID: ae20e0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Alice Luxley - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -34.431 - posY: 1.32506227 - posZ: 54.60595 - rotX: 0.0208093189 - rotY: 269.99942 - rotZ: 0.0167746153 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538723 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c5fb42 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Azure Flame (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.5975952 - posY: 3.28375673 - posZ: -72.29174 - rotX: 0.0208092667 - rotY: 270.001343 - rotZ: 0.0167678669 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 370046 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3700': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 274daa - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mysteries Remain - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 84.64643 - posY: 1.54209042 - posZ: -58.08328 - rotX: 6.12337255 - rotY: 270.007751 - rotZ: 0.006448847 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553107 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 37882c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Skeptic (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.61065 - posY: 1.30367255 - posZ: -56.8638954 - rotX: 0.0208085012 - rotY: 269.999481 - rotZ: 0.01677089 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368825 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9da37c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fire Axe - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 42.57 - posY: 1.35927451 - posZ: 75.95 - rotX: 0.02081681 - rotY: 269.9702 - rotZ: 0.0167647749 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315255 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a6af13 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lupara (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.414481 - posZ: -29.600008 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440625 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4406': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 695bb7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Zeal - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.16347 - posY: 1.56949711 - posZ: 37.4911728 - rotX: 359.9874 - rotY: 269.9922 - rotZ: 359.9842 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274003 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f4dd3d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shocking Discovery - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.0190773 - posY: 1.36276233 - posZ: -66.7568359 - rotX: 0.0208035558 - rotY: 270.019226 - rotZ: 0.016777629 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230360 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7bc995 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ward of Protection (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.4229548 - posZ: -43.109993 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274011 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6945f7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Watcher from Another Dimension - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -41.8951149 - posY: 1.36539435 - posZ: -57.9189568 - rotX: 0.0208037551 - rotY: 270.0197 - rotZ: 0.0167778321 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538830 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1a1b58 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Miskatonic Archaeology Funding (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.612587 - posY: 3.16738367 - posZ: -80.51151 - rotX: 0.0208090954 - rotY: 269.997253 - rotZ: 0.0167700425 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230301 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a5c780 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Enraptured - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -18.2000046 - posY: 1.33922434 - posZ: 82.85 - rotX: 0.0208174363 - rotY: 269.971 - rotZ: 0.0167632867 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374014 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2098': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: dfd48b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Painted World - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 7.31871462 - posY: 0.622307062 - posZ: -49.1846924 - rotX: -5.89429e-06 - rotY: 269.999939 - rotZ: 359.991943 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 371907 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3719': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 033a35 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Rex's Curse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 76.5889359 - posY: 1.49881017 - posZ: -49.1716652 - rotX: 0.0157422461 - rotY: 270.000061 - rotZ: 0.0127807 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550825 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Tough Old Bird - DragSelectable: true - GMNotes: '' - GUID: 52a66f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Granny Orne (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.328167 - posY: 5.377853 - posZ: -67.87628 - rotX: 0.01473101 - rotY: 270.0195 - rotZ: 0.011882768 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379616 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3796': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Deals with "Devils" - DragSelectable: true - GMNotes: '' - GUID: 4f2489 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dayana Esperence (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 92.65864 - posY: 1.41104889 - posZ: -8.65793 - rotX: 359.987427 - rotY: 269.999176 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538802 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a2e7d7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Obsessive - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.1068153 - posY: 3.28374267 - posZ: -75.74227 - rotX: 0.0208097342 - rotY: 269.997223 - rotZ: 0.0167702455 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448738 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4487': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f0389b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Nothing Left to Lose (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.3847427 - posY: 1.30081713 - posZ: -67.00287 - rotX: 0.0208080914 - rotY: 270.0001 - rotZ: 0.01677122 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368841 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Forgotten Daughter - DragSelectable: true - GMNotes: '' - GUID: 9393ec - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Aquinnah (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40168893 - posZ: 11.8 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553112 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 541ee9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Paradoxical Covenant (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.45762 - posY: 3.52184319 - posZ: -65.76732 - rotX: 0.0166523419 - rotY: 270.0 - rotZ: 180.096146 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450619 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Let the Storm Rage - DragSelectable: true - GMNotes: '' - GUID: 244d61 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Key of Ys (5) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.6845245 - posY: 1.3909651 - posZ: -51.78406 - rotX: 0.0208023489 - rotY: 269.999664 - rotZ: 0.0167920664 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538801 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 3eef18 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Thrice-Damned Curiosity - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.80547 - posY: 3.285487 - posZ: -69.0229645 - rotX: 0.0208092257 - rotY: 269.997253 - rotZ: 0.0167695954 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368712 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '833305' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Elusive - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500042 - posY: 1.35209048 - posZ: 69.05 - rotX: 0.0208152477 - rotY: 269.974854 - rotZ: 0.0167662222 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368803 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d1d7fa - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"Not without a fight!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 49.37 - posY: 1.36309063 - posZ: 80.55 - rotX: 0.0208194442 - rotY: 269.9588 - rotZ: 0.01675947 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230356 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 07bc04 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Grotesque Statue (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.42047322 - posZ: -33.90999 - rotX: 359.987427 - rotY: 270.0001 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553226 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d8b64b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Promise of Power - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.8023376 - posY: 3.283064 - posZ: -74.32583 - rotX: 0.0208089463 - rotY: 269.999878 - rotZ: 0.0167692434 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315250 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f2508d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hot Streak (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.4113791 - posZ: -18.1000061 - rotX: 359.987427 - rotY: 269.999847 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368409 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a8e495 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Anatomical Diagrams - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.239993 - posY: 1.34263766 - posZ: 75.9500046 - rotX: 0.0208109878 - rotY: 269.986359 - rotZ: 0.0167700239 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368828 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Mysterious Benefactress - DragSelectable: true - GMNotes: '' - GUID: 1ee492 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Madame Labranche - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 42.5700035 - posY: 1.35725486 - posZ: 69.05 - rotX: 0.0208162181 - rotY: 269.970184 - rotZ: 0.0167627446 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553102 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 87226d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sacred Covenant (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.45764 - posY: 3.51937938 - posZ: -65.76698 - rotX: 0.016651 - rotY: 270.0 - rotZ: 180.017426 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315262 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9f0b34 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Pay Day (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.39897144 - posZ: 27.90001 - rotX: 359.987427 - rotY: 269.999725 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368831 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fc9e1b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dig Deep - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.76141 - posY: 1.36816335 - posZ: -57.0264244 - rotX: 0.02079995 - rotY: 270.040161 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315236 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 18927e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Treasure Hunter (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.40083265 - posZ: 21.0000038 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440627 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4406': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: dacbf0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fortuitous Discovery - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.31382 - posY: 1.5461663 - posZ: 37.3481064 - rotX: 359.984924 - rotY: 269.992371 - rotZ: 359.9843 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 371466 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3714': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 46812e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sacrificial Beast - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 76.95408 - posY: 1.51747715 - posZ: -49.6841774 - rotX: 0.018425867 - rotY: 270.021179 - rotZ: 0.02911497 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226336 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 102fad - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Reliable (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.40671 - posY: 3.51911259 - posZ: -65.72932 - rotX: 0.0208095815 - rotY: 270.017 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538820 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2172e2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Esoteric Atlas (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.27167 - posY: 3.28348327 - posZ: -80.1634445 - rotX: 0.0208092164 - rotY: 269.997253 - rotZ: 0.0167695563 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545307 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: af3efd - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Relentless - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.07636 - posY: 3.28584647 - posZ: -70.35861 - rotX: 0.02081439 - rotY: 269.979553 - rotZ: 0.0167634711 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545211 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 121b2d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dendromorphosis - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -45.1638451 - posY: 3.18465137 - posZ: -78.99707 - rotX: 0.02080465 - rotY: 269.997864 - rotZ: 0.7455131 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545325 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 54293e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Boxing Gloves (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.8833427 - posY: 3.169314 - posZ: -73.31997 - rotX: 0.0208083354 - rotY: 270.0 - rotZ: 0.0167705938 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 371605 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3716': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e68658 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Smite the Wicked - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 76.515625 - posY: 1.52500629 - posZ: -50.03807 - rotX: 0.037379235 - rotY: 269.966217 - rotZ: 0.06762503 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226327 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 86ee68 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Machete - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230006 - posY: 1.34514689 - posZ: 69.05001 - rotX: 0.0208164584 - rotY: 269.9694 - rotZ: 0.0167631 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438123 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: f6aba5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Curiosity) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -23.0862484 - posY: 2.377057 - posZ: -75.92746 - rotX: 0.0 - rotY: 270.0 - rotZ: 0.0 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290207 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2902': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Free from the Past - DragSelectable: true - GMNotes: '' - GUID: 2e5b03 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "Death \u2022 XIII (1)" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.400881 - posZ: 32.7900352 - rotX: 359.987427 - rotY: 269.999847 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379555 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3795': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f4bac6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Detective's Colt 1911s - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 6.403568 - posY: 1.378892 - posZ: -71.7250748 - rotX: 0.0207481515 - rotY: 269.99942 - rotZ: 0.0167482235 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 235600 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2356': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Renowned Historian - DragSelectable: true - GMNotes: '' - GUID: c49b4b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Alejandro Vela - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.8602333 - posY: 3.17244 - posZ: -61.7880058 - rotX: 0.0208084844 - rotY: 269.999847 - rotZ: 0.0167707447 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368516 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 756a35 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Kukri - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 57.27 - posY: 1.36461318 - posZ: 75.95 - rotX: 0.020810049 - rotY: 269.99408 - rotZ: 0.0167692974 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 293217 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2932': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Seeker - DragSelectable: true - GMNotes: '' - GUID: 1433eb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Grisly Totem (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.7730675 - posY: 1.36253119 - posZ: -55.4446869 - rotX: 0.020809114 - rotY: 270.0 - rotZ: 0.0167707428 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430656 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Restorative Concoction - DragSelectable: true - GMNotes: '' - GUID: 4874bc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Strange Solution (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05001 - posY: 1.41639066 - posZ: -24.7099915 - rotX: 359.987427 - rotY: 270.000061 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368801 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '358387' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Rise to the Occasion - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 49.37 - posY: 1.36443722 - posZ: 85.15 - rotX: 0.0208204873 - rotY: 269.9588 - rotZ: 0.0167588126 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368848 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6aae86 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Close Call (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40603161 - posZ: -4.30000353 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226305 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 36c0cb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"Let me handle this!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300039 - posY: 1.35176742 - posZ: 87.45 - rotX: 0.0207943413 - rotY: 270.027039 - rotZ: 0.01677379 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 261701 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2617': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: efb09b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Double or Nothing - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 31.7500019 - posY: 1.35736465 - posZ: 82.85 - rotX: 0.0208079945 - rotY: 270.000122 - rotZ: 0.0167725533 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226334 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bb640d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ever Vigilant (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.39982712 - posZ: 30.3300285 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545210 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 389a34 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Backpack (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.4068222 - posY: 3.2850585 - posZ: -73.0593 - rotX: 0.0208073538 - rotY: 270.0092 - rotZ: 0.01676984 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430906 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2728': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 493b03 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Prophesy - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -18.2000046 - posY: 1.33989763 - posZ: 85.15 - rotX: 0.0208171364 - rotY: 269.970978 - rotZ: 0.0167635083 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 276200 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2762': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2240f9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "Coup de Gr\xE2ce" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500042 - posY: 1.34939754 - posZ: 59.8500023 - rotX: 0.0208155029 - rotY: 269.974884 - rotZ: 0.0167655852 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538709 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6c3156 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Crystal Pendulum - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -62.5530319 - posY: 3.283612 - posZ: -71.50618 - rotX: 0.0208110511 - rotY: 270.001343 - rotZ: 0.01676353 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 232951 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2329': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Seeing Things Unseen - DragSelectable: true - GMNotes: '' - GUID: f96ed0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Powder of Ibn Ghazi - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.4629173 - posY: 1.36626446 - posZ: -46.7977753 - rotX: 0.0208089761 - rotY: 270.0 - rotZ: 0.0167704951 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 296500 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2965': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Ally. Believer. - DragSelectable: true - GMNotes: '' - GUID: 1e7f1b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Abbess Allegria Di Biase - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.02915 - posY: 1.77067351 - posZ: 4.416883 - rotX: 2.0594604 - rotY: 270.102448 - rotZ: 3.75599837 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368401 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5c3aea - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Inquiring Mind - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 0.160006061 - posY: 1.34589219 - posZ: 82.8500061 - rotX: 0.0208204687 - rotY: 269.9646 - rotZ: 0.0167588983 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538819 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6e4d54 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Glimpse the Unthinkable (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.7147179 - posY: 3.163674 - posZ: -85.7649 - rotX: 0.0208091736 - rotY: 269.997253 - rotZ: 0.0167692658 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440926 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4409': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ef7c11 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Solemn Vow - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.1418 - posY: 1.403798 - posZ: 21.0005112 - rotX: 359.9877 - rotY: 270.0044 - rotZ: 359.9829 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527606 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2742': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e2767a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cunning - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 31.7500019 - posY: 1.35871112 - posZ: 87.45 - rotX: 0.02080716 - rotY: 270.000122 - rotZ: 0.0167723987 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374417 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3744': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 864fb6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bait and Switch (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 112.267654 - posY: 1.3757329 - posZ: 45.7017555 - rotX: 0.0208089612 - rotY: 269.999878 - rotZ: 0.0167736318 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368619 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: dc3b07 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lone Wolf - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500027 - posY: 1.35556841 - posZ: 85.15 - rotX: 0.0208101571 - rotY: 269.9888 - rotZ: 0.01676966 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 261100 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2611': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d3e55b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Timeworn Brand (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94001 - posY: 1.40205884 - posZ: 4.89999962 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315238 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2423e7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fence (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.40207338 - posZ: 16.4000072 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450601 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 34140c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Elusive (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.79034 - posY: 1.30492866 - posZ: -51.10886 - rotX: 0.0208091177 - rotY: 269.999664 - rotZ: 0.0167718679 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230336 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 35166c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Book of Shadows (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76 - posY: 1.40620458 - posZ: 18.99002 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538614 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d099f4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sneak By - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -45.104393 - posY: 2.842704 - posZ: -102.308365 - rotX: 0.020808693 - rotY: 270.000061 - rotZ: 0.0167713556 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431115 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2698': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: da227d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Thing That Follows - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 79.6971741 - posY: 1.516075 - posZ: 71.10236 - rotX: 0.02737251 - rotY: 269.988983 - rotZ: 0.00684426632 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 293214 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2932': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Seeker - DragSelectable: true - GMNotes: '' - GUID: 0b12ac - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scroll of Secrets (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.4576035 - posY: 3.522443 - posZ: -65.76737 - rotX: 0.0124911685 - rotY: 270.0 - rotZ: 180.115143 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538704 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6446d1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scrying Mirror - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.7526474 - posY: 3.28131819 - posZ: -72.5047 - rotX: 0.0208116863 - rotY: 270.001343 - rotZ: 0.0167630389 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368625 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: da7c01 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Pickpocketing - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500046 - posY: 1.35085571 - posZ: 69.05 - rotX: 0.0208106581 - rotY: 269.98877 - rotZ: 0.0167695228 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 314800 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3148': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 44a37f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Old Hunting Rifle (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.41471708 - posZ: -36.5000038 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 377042 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3770': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f91fd9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mitch Brown - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.353 - posY: 2.190368 - posZ: -89.69797 - rotX: 359.9792 - rotY: 270.0 - rotZ: 180.006226 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 369816 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3698': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Knows Too Much - DragSelectable: true - GMNotes: '' - GUID: 7e2896 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Elina Harper - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.4537659 - posY: 3.52636623 - posZ: -65.7639 - rotX: 0.0125333974 - rotY: 270.0003 - rotZ: 179.7309 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368849 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f66dd9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Snare Trap (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40727246 - posZ: -8.900003 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430649 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d48b25 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Higher Education (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.41080713 - posZ: -4.009982 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368814 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f0e425 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dumb Luck - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.97 - posY: 1.35714316 - posZ: 64.45 - rotX: 0.020805018 - rotY: 270.0129 - rotZ: 0.0167762935 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 371308 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3713': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d87128 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Jenny's Twin .45s - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 76.6732559 - posY: 1.52007174 - posZ: -48.314106 - rotX: 0.04478311 - rotY: 270.017731 - rotZ: 359.920624 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 231709 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2317': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537091085/26A674065298A59068E1D6BA3804D03554C234A3/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Skilled Botanist - DragSelectable: true - GMNotes: '' - GUID: a0c2da - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Veda Whitsley - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.36957 - posY: 1.30220938 - posZ: -48.6176262 - rotX: 0.0208126362 - rotY: 269.985657 - rotZ: 0.0167656019 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 381050 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3810': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 67e006 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Split the Angle - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -1.436187 - posY: 2.09197116 - posZ: -46.23643 - rotX: 0.03567951 - rotY: 270.066925 - rotZ: 0.0572711229 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 541109 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5411': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/775107869050061525/A759DF697FFB26F0F5B75E116A923E33F88FCA7B/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fa4c1e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dream-Gate - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -60.9905357 - posY: 3.16472745 - posZ: -83.01713 - rotX: 359.91983 - rotY: 269.9864 - rotZ: 0.0154172564 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315261 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3add54 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cheat Death (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.749962 - posY: 1.38609779 - posZ: -45.70004 - rotX: 0.02080863 - rotY: 269.9999 - rotZ: 0.0167719424 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368525 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 523b76 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Moment of Respite (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.39957726 - posZ: 14.1 - rotX: 359.987427 - rotY: 269.999847 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315232 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 731d2a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Adaptable (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.39773071 - posZ: 32.5000153 - rotX: 359.987427 - rotY: 269.9997 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230323 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fa1d67 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Holy Rosary - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0 - posY: 1.33271539 - posZ: 69.05 - rotX: 0.0207979213 - rotY: 270.0313 - rotZ: 0.0167850684 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 379020 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3790': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5d6728 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Occult Lexicon - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 13.9440126 - posY: 1.34620976 - posZ: 66.8332062 - rotX: 0.0208179 - rotY: 269.980469 - rotZ: 0.0167577937 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368851 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c6c260 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cornered (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40851319 - posZ: -13.5000057 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551714 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5517': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 87f6b9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Old Shoe - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.1416931 - posY: 1.31019628 - posZ: -47.5659332 - rotX: 0.0208086874 - rotY: 269.998779 - rotZ: 0.0167704076 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538624 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0feb74 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lucky Cigarette Case (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.44495 - posY: 3.28489232 - posZ: -72.91061 - rotX: 0.0208115689 - rotY: 269.9931 - rotZ: 0.0167649854 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368416 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 60b353 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Preposterous Sketches - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.24000239 - posY: 1.337925 - posZ: 59.8499947 - rotX: 0.0208115336 - rotY: 269.986359 - rotZ: 0.0167706627 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 314204 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3142': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e8b7ad - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bandolier (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.40851247 - posZ: -1.86998224 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378019 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3780': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0e0530 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Double, Double (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 112.103218 - posY: 1.3954078 - posZ: 33.496376 - rotX: 359.987427 - rotY: 270.000122 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368707 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 62cf25 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"I''m outta here!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500023 - posY: 1.35545671 - posZ: 80.55 - rotX: 0.02081474 - rotY: 269.974884 - rotZ: 0.01676473 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378018 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3780': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d27d12 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"You owe me one!"' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 46.0198975 - posY: 1.3575114 - posZ: 65.64583 - rotX: 0.0208127461 - rotY: 269.982056 - rotZ: 0.01676411 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 292912 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2929': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Rogue - DragSelectable: true - GMNotes: '' - GUID: b5e5f1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Tennessee Sour Mash (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.25424 - posY: 1.5068202 - posZ: -48.776722 - rotX: 359.875 - rotY: 269.98233 - rotZ: 359.889984 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 233606 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2336': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2fc31c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mi-Go Weapon - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.6340179 - posY: 1.2999053 - posZ: -72.28999 - rotX: 0.0208086576 - rotY: 270.0 - rotZ: 0.0167716239 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538713 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 47bdba - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Parallel Fates - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.19831 - posY: 3.28503919 - posZ: -70.7977 - rotX: 0.0208103936 - rotY: 270.001343 - rotZ: 0.0167649258 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450613 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Petrus de Dacia Translation - DragSelectable: true - GMNotes: '' - GUID: 9fa2a5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Necronomicon (5) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.93347 - posY: 1.44876873 - posZ: -51.3429031 - rotX: 0.020808002 - rotY: 269.999725 - rotZ: 0.0167890638 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 314002 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3140': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cf4f15 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Flamethrower (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.41967952 - posZ: -43.2699928 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 534901 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2317': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/778493212055041441/90F035BD69A7C5C6B6F43426DDDA3A09DFCBCBDF/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Madness. - DragSelectable: true - GMNotes: '' - GUID: 2c76d9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: What Have You Done? - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.6642151 - posY: 2.371999 - posZ: -73.67534 - rotX: 0.0211164355 - rotY: 270.0 - rotZ: 0.0169385374 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368431 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 063fd8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Old Book of Lore - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.640002 - posY: 1.33669019 - posZ: 59.85 - rotX: 0.02081435 - rotY: 269.978821 - rotZ: 0.0167656858 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368413 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: eb6165 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Working a Hunch - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.24000335 - posY: 1.33994472 - posZ: 66.75 - rotX: 0.0208135787 - rotY: 269.986359 - rotZ: 0.0167685822 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226342 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fc2629 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"Eat lead!" (2)' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.406031 - posZ: 7.33001947 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368419 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 658d38 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shrewd Analysis - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.63999367 - posY: 1.34476912 - posZ: 87.4500046 - rotX: 0.02081338 - rotY: 269.978821 - rotZ: 0.0167668 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 235822 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2358': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777501236/D145C8B748FB42258EB442B9DF36797851CEECC3/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Madness. Paradox. - DragSelectable: true - GMNotes: '' - GUID: d64b8f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Out of Body Experience - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -46.1434669 - posY: 3.17477942 - posZ: -63.370575 - rotX: 0.0208083838 - rotY: 269.999847 - rotZ: 0.0167704877 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 293315 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2933': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Mystic - DragSelectable: true - GMNotes: '' - GUID: 194d88 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scroll of Secrets (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.73687 - posY: 1.50124466 - posZ: -49.17045 - rotX: 0.05648235 - rotY: 270.0217 - rotZ: -0.002907931 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 447835 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4478': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Dreams of a Madman - DragSelectable: true - GMNotes: '' - GUID: e5f9cb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dream Diary (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.5946255 - posY: 1.59327507 - posZ: 14.8424034 - rotX: 359.920135 - rotY: 269.996155 - rotZ: 0.0168813411 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527235 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5272': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ab4fb3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Summoned Hound (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.6454124 - posY: 1.29864454 - posZ: -75.34238 - rotX: 0.0208087377 - rotY: 269.999756 - rotZ: 0.01677042 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368928 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3689': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a56ffe - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Wendy's Amulet - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 87.36852 - posY: 1.4640274 - posZ: -54.70025 - rotX: 0.0210064612 - rotY: 270.000427 - rotZ: 4.54647064 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545328 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 85fe46 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Taunt (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.2340546 - posY: 3.169604 - posZ: -75.87329 - rotX: 0.0208084155 - rotY: 270.0 - rotZ: 0.0167709012 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 549900 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5499': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1537373966843931844/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373966843937651/74845294CAEB3908414DAE31A5BC8A6683FEBF20/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 34e9f8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Gaze of Ouraxsh (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.0887566 - posY: 3.2843976 - posZ: -73.28977 - rotX: 0.02080861 - rotY: 269.999969 - rotZ: 0.0167707726 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553213 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 88865b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Rite of Sanctification - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.3946571 - posY: 3.16200924 - posZ: -90.46195 - rotX: 0.0208087657 - rotY: 269.999 - rotZ: 0.0167703237 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527417 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2666': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: 16a89d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Silver Twilight Acolyte - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 74.44922 - posY: 1.56336081 - posZ: 81.83084 - rotX: 0.020568762 - rotY: 269.999268 - rotZ: 0.0177706 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430641 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7f99cc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Pathfinder (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.40584409 - posZ: 14.3900223 - rotX: 359.987427 - rotY: 270.000061 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 261702 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2617': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a88392 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Opportunist - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 31.7500038 - posY: 1.35669148 - posZ: 80.55 - rotX: 0.0208076444 - rotY: 270.000122 - rotZ: 0.0167729724 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368709 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6fec31 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Think on Your Feet - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500042 - posY: 1.35411012 - posZ: 75.95 - rotX: 0.020815298 - rotY: 269.9749 - rotZ: 0.016764313 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545321 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 415ca2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"Get over here!" (2)' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -56.5655479 - posY: 3.28498816 - posZ: -74.21584 - rotX: 0.0208084416 - rotY: 270.0 - rotZ: 0.0167704467 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527416 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2666': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: b239d7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mob Enforcer - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 74.1295853 - posY: 1.57301271 - posZ: 81.96535 - rotX: 0.0202451628 - rotY: 269.998047 - rotZ: 0.017438814 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538809 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8595fb - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Higher Education - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.71999 - posY: 3.28314877 - posZ: -77.8439255 - rotX: 0.0208094642 - rotY: 269.997253 - rotZ: 0.0167688243 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430653 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Prophecy Foretold - DragSelectable: true - GMNotes: '' - GUID: 3d35aa - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Archaic Glyphs (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.41390908 - posZ: -15.509985 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448838 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4488': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ff59dd - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Surprising Find (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.5645676 - posY: 1.299145 - posZ: -77.45552 - rotX: 0.0208085515 - rotY: 270.0 - rotZ: 0.016771242 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 444022 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4408': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 968a26 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stargazing (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 93.17623 - posY: 1.5469203 - posZ: 25.128376 - rotX: 359.989166 - rotY: 270.027618 - rotZ: 359.9685 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440720 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4407': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 26a3bf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stealth (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 92.95461 - posY: 1.54556274 - posZ: 29.33836 - rotX: 359.9763 - rotY: 269.978271 - rotZ: 359.9808 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368834 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 86b9c5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Plucky (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.39672589 - posZ: 30.2000084 - rotX: 359.987427 - rotY: 270.000061 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380027 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3800': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d3dcf1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: '"Let God sort them out..."' - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.1617146 - posY: 1.66998422 - posZ: -1.0745914 - rotX: 359.9013 - rotY: 269.995422 - rotZ: 0.0255841073 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226359 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e21854 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Monster Slayer (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87001 - posY: 1.41843867 - posZ: -38.66999 - rotX: 359.987427 - rotY: 270.000031 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368845 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0414b4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dig Deep (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 110.15 - posY: 1.40417051 - posZ: 2.59999847 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552011 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5520': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '041012' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dog Monocle - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.1418762 - posY: 1.567957 - posZ: -23.9889088 - rotX: 359.920135 - rotY: 269.986145 - rotZ: 0.0168946683 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538725 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '943332' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ineffable Truth (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.2550964 - posY: 3.28405976 - posZ: -71.59284 - rotX: 0.0208090339 - rotY: 270.001343 - rotZ: 0.01676817 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438127 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 57e648 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Narcolepsy - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.20527 - posY: 1.5186789 - posZ: 51.2058372 - rotX: 0.0206013937 - rotY: 270.002258 - rotZ: 180.0141 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226315 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1bc300 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Trusted - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300058 - posY: 1.34503508 - posZ: 64.4500046 - rotX: 0.0207948089 - rotY: 270.027039 - rotZ: 0.0167727638 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226301 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 80628f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Inspiring Presence - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.0300045 - posY: 1.3523289 - posZ: 85.15 - rotX: 0.0208112579 - rotY: 269.987427 - rotZ: 0.0167698432 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553113 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4e2d75 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mariner's Compass - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.45762 - posY: 3.524765 - posZ: -65.76762 - rotX: 0.0166539215 - rotY: 270.0 - rotZ: 180.2173 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553217 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b176fc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Deep Knowledge - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.9516678 - posY: 3.16666675 - posZ: -85.02927 - rotX: 0.0208086651 - rotY: 269.999 - rotZ: 0.0167703424 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538602 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: c45e67 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Reckless - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -58.6244621 - posY: 3.285529 - posZ: -69.83184 - rotX: 0.0208142158 - rotY: 269.9931 - rotZ: 0.0167592838 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368521 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c4cf62 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bulletproof Vest (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 116.94 - posY: 1.39771616 - posZ: 21.0000038 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527401 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5274': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: c17498 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Paranoia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.3827248 - posY: 3.28183174 - posZ: -72.54614 - rotX: 359.9788 - rotY: 270.0022 - rotZ: 174.093964 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378017 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3780': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 006d44 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Another Day, Another Dollar (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 112.317162 - posY: 1.39417815 - posZ: 37.881134 - rotX: 359.987427 - rotY: 270.0001 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553219 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a5087b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: .25 Automatic - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.6913071 - posY: 3.28392243 - posZ: -72.74665 - rotX: 0.0208082013 - rotY: 269.999817 - rotZ: 0.0167705584 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 231600 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2316': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1017195287736529784/BEB850DCAA5497CC1A96E1603C0D3AFFE8B0F2BB/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: Advanced - DragSelectable: true - GMNotes: '' - GUID: cf41be - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Daisy's Tote Bag - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -51.50849 - posY: 1.30044091 - posZ: -69.37549 - rotX: 0.0208080076 - rotY: 270.0 - rotZ: 0.0167705547 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538620 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fc82a5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Daring Maneuver (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.19061 - posY: 3.28441215 - posZ: -73.52365 - rotX: 0.0208122823 - rotY: 269.9931 - rotZ: 0.0167636927 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 235648 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2356': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: The Forgotten Guardian - DragSelectable: true - GMNotes: '' - GUID: 29fc24 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ichtaca - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.62483 - posY: 3.17204762 - posZ: -63.4302139 - rotX: 0.020808531 - rotY: 269.999847 - rotZ: 0.0167708434 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277509 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2775': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a00fca - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Banish (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -26.6736889 - posY: 1.566863 - posZ: 70.85531 - rotX: 0.01997196 - rotY: 269.999084 - rotZ: 0.0208501965 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368832 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Big Man on Campus - DragSelectable: true - GMNotes: '' - GUID: ffdeb5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Peter Sylvestre - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 42.5700035 - posY: 1.35456181 - posZ: 59.8500023 - rotX: 0.0208163559 - rotY: 269.9702 - rotZ: 0.0167621151 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 274608 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2746': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6fa7fa - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Track Shoes - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 42.5700035 - posY: 1.35321534 - posZ: 55.2500038 - rotX: 0.0208173972 - rotY: 269.9702 - rotZ: 0.0167611558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230328 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '914053' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Shrivelling - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -25.0 - posY: 1.32934916 - posZ: 57.55 - rotX: 0.0207989346 - rotY: 270.0313 - rotZ: 0.01678501 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553208 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4e405d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sea Change Harpoon - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -54.90177 - posY: 3.28445745 - posZ: -76.90057 - rotX: 0.0208086148 - rotY: 269.999329 - rotZ: 0.01677068 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 296704 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2967': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 96ae32 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Monstrous Transformation - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.55273 - posY: 1.30414021 - posZ: -57.92313 - rotX: 0.0208086055 - rotY: 270.0 - rotZ: 0.016771147 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368822 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1b76c9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scavenging - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -37.6326675 - posY: 1.36736 - posZ: -66.1336441 - rotX: 0.0207946468 - rotY: 270.040375 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226348 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7001be - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Beat Cop (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.410994 - posZ: -11.0699854 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527419 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2666': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: fd9c56 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Through the Gates - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 74.34954 - posY: 1.57672024 - posZ: 61.3802452 - rotX: 0.0203758851 - rotY: 269.999542 - rotZ: 0.01571979 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 312511 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3125': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Not Going Down That Easily - DragSelectable: true - GMNotes: '' - GUID: 2237f4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Gavriella Mizrah - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.35406 - posY: 1.62373781 - posZ: -52.944416 - rotX: 0.0179333128 - rotY: 270.007782 - rotZ: 0.028359253 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368805 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 58c435 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stunning Blow - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 49.37 - posY: 1.361744 - posZ: 75.95 - rotX: 0.0208197571 - rotY: 269.9588 - rotZ: 0.0167563129 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 454741 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4547': - BackIsHidden: true - BackURL: https://i.imgur.com/r6F1mt2.jpg - FaceURL: https://i.imgur.com/CN9PXUd.jpg - NumHeight: 5 - NumWidth: 10 - Type: 0 - UniqueBack: true - Description: Item. Relic. - DragSelectable: true - GMNotes: '' - GUID: 0ce113 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ancient Ankh - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -41.99787 - posY: 2.36574912 - posZ: -93.55096 - rotX: 0.0208107159 - rotY: 269.999939 - rotZ: 0.01676894 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 444147 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3805': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 13eaf0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dreams of the Deep - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.149692 - posY: 2.06653118 - posZ: -46.2199059 - rotX: 0.0160595868 - rotY: 270.0005 - rotZ: 0.0145351663 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550823 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 0c433b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dumb Luck (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -57.9844 - posY: 3.28493977 - posZ: -71.77057 - rotX: 0.0147311278 - rotY: 270.0195 - rotZ: 0.0118826525 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430501 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2758': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: aa3984 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Winging It - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.97 - posY: 1.35781634 - posZ: 66.75 - rotX: 0.02080432 - rotY: 270.012939 - rotZ: 0.0167804044 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368807 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 050ba1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Live and Learn - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.97 - posY: 1.36320233 - posZ: 85.15 - rotX: 0.020803472 - rotY: 270.0129 - rotZ: 0.0167760346 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 440621 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4406': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bda4fd - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lantern (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.32716 - posY: 1.5488534 - posZ: 37.4422379 - rotX: 359.989349 - rotY: 269.992371 - rotZ: 359.982239 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 293015 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2930': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e674e8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fortune or Fate (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.4155731 - posY: 1.52457511 - posZ: -53.7638931 - rotX: 0.0229964554 - rotY: 270.012634 - rotZ: 0.0177416671 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374419 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3744': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: eaaee9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Eucatastrophe (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 111.842651 - posY: 1.39317536 - posZ: 41.98588 - rotX: 359.987427 - rotY: 270.0001 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226313 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e0dff3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dodge - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6300058 - posY: 1.34638155 - posZ: 69.05001 - rotX: 0.0207969118 - rotY: 270.027039 - rotZ: 0.0167740118 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277511 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2775': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d946d9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Wither - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -26.7956734 - posY: 1.57171309 - posZ: 40.9552956 - rotX: 1.12907594e-06 - rotY: 269.998749 - rotZ: 2.312074e-05 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430657 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5d25b1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Cryptic Research (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05001 - posY: 1.41763139 - posZ: -29.3099918 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 376600 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3766': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 41a9ec - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Until the End of Time - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 27.6287518 - posY: 1.4419347 - posZ: -51.9697838 - rotX: 0.0280682351 - rotY: 269.874725 - rotZ: 4.47717762 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378618 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3786': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d6eda3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Agency Backup (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 112.024666 - posY: 1.39823854 - posZ: 23.0658474 - rotX: 359.987427 - rotY: 269.999481 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 276101 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2761': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 5a305e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Colt Vest Pocket - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500046 - posY: 1.348836 - posZ: 62.1500053 - rotX: 0.02081202 - rotY: 269.9888 - rotZ: 0.0167703833 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368811 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 30f90b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Improvised Weapon - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.97 - posY: 1.3598361 - posZ: 73.65 - rotX: 0.0208048522 - rotY: 270.012939 - rotZ: 0.0167763215 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 261703 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2617': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 99989c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Quick Thinking - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 31.7500019 - posY: 1.35601819 - posZ: 78.25 - rotX: 0.0208088942 - rotY: 270.000122 - rotZ: 0.0167740677 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545301 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: c3a014 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Tommy Malloy - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -43.26724 - posY: 3.174611 - posZ: -68.4174652 - rotX: 0.0205496773 - rotY: 269.9956 - rotZ: 0.0170879588 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226337 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: f60263 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Extra Ammunition (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.40168822 - posZ: 23.430027 - rotX: 359.987427 - rotY: 269.999817 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431110 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2698': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 88a9b3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Overzealous - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 79.34387 - posY: 1.521027 - posZ: 71.2091 - rotX: 0.0200308 - rotY: 269.999939 - rotZ: 0.0167929437 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230351 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e72762 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mind Wipe (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76 - posY: 1.41613054 - posZ: -17.80999 - rotX: 359.987427 - rotY: 270.0002 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 527608 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2742': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 66b7d5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Well Connected - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500046 - posY: 1.35287535 - posZ: 75.95 - rotX: 0.02081098 - rotY: 269.988831 - rotZ: 0.0167695135 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230303 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cd0ac1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fearless - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -18.2000027 - posY: 1.33787787 - posZ: 78.25 - rotX: 0.0208174773 - rotY: 269.971 - rotZ: 0.0167640541 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551404 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ed4256 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Take the Wheel - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 16.2317638 - posY: 1.51399493 - posZ: 0.0367458239 - rotX: 359.920135 - rotY: 270.000061 - rotZ: 0.0168725774 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450623 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Mystic - DragSelectable: true - GMNotes: '' - GUID: 5839e4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scroll of Secrets (3) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -49.63492 - posY: 1.30829561 - posZ: -44.7619629 - rotX: 0.0208089389 - rotY: 269.999634 - rotZ: 0.01677007 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368406 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: bbfe9b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Guidance - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -3.239994 - posY: 1.34465742 - posZ: 82.8500061 - rotX: 0.0208123866 - rotY: 269.986359 - rotZ: 0.0167671517 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538726 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: ca23d4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Arcane Studies (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.8508453 - posY: 3.28354359 - posZ: -73.28051 - rotX: 0.0208091922 - rotY: 270.001343 - rotZ: 0.01676852 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 551813 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5518': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '952924' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Howl of Clyhf'ford - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.141777 - posY: 1.54049265 - posZ: -39.6801033 - rotX: 359.920135 - rotY: 269.981354 - rotZ: 1.29702878 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 550800 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6da7c4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Neither Rain nor Snow - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.7919922 - posY: 3.28410816 - posZ: -72.41342 - rotX: 0.0147348512 - rotY: 270.0195 - rotZ: 0.0118878279 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538625 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7f27d6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Sharpshooter (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.3573074 - posY: 3.26376963 - posZ: -70.37441 - rotX: 0.02081183 - rotY: 269.9931 - rotZ: 0.01676547 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553234 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a9d77d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Day of Reckoning - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.6806946 - posY: 1.30510676 - posZ: -51.877182 - rotX: 0.0208085384 - rotY: 270.0 - rotZ: 0.0167706478 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538707 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c6caf6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Ineffable Truth - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -67.12337 - posY: 3.28281879 - posZ: -69.99682 - rotX: 0.02081139 - rotY: 270.001343 - rotZ: 0.01676363 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 448837 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4488': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8a0060 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Old Book of Lore (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -34.6117477 - posY: 2.845372 - posZ: -123.871094 - rotX: 0.0208082739 - rotY: 269.999939 - rotZ: 0.0167707168 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368432 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2304': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Mortal Reminder - DragSelectable: true - GMNotes: '' - GUID: c1a687 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Tooth of Eztli - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -6.640002 - posY: 1.336017 - posZ: 57.55 - rotX: 0.020814199 - rotY: 269.978821 - rotZ: 0.0167644545 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 295501 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2955': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: a42f33 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Bauta - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.87838 - posY: 3.16514683 - posZ: -98.8938751 - rotX: 0.0208086148 - rotY: 269.999634 - rotZ: 0.01677102 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 295128 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2951': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642393244/74ADDF83D8B03DBF4AD5DC7230C2D12E84685317/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Ally - DragSelectable: true - GMNotes: '' - GUID: 3c1944 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lita Chantler - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.62659 - posY: 1.731941 - posZ: 13.0320845 - rotX: 3.19259238 - rotY: 269.9959 - rotZ: 0.0182487071 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230335 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 90a106 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Spirit Athame (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.4055841 - posZ: 21.2900219 - rotX: 359.987427 - rotY: 270.000244 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230314 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9c922f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Storm of Spirits - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -21.6 - posY: 1.33058393 - posZ: 57.55 - rotX: 0.0208180714 - rotY: 269.96698 - rotZ: 0.01676364 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431656 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3796': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 22d886 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unsolved Case - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 6.089414 - posY: 1.42903221 - posZ: -72.42946 - rotX: 0.0207405332 - rotY: 269.991516 - rotZ: 0.0169848632 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553209 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 4f11a2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Silas's Net - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -46.57681 - posY: 3.17013431 - posZ: -78.59785 - rotX: 0.020808639 - rotY: 269.999329 - rotZ: 0.016770402 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 374420 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3744': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1a90a4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lure (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 112.262115 - posY: 1.37650943 - posZ: 48.36173 - rotX: 0.020808477 - rotY: 270.0 - rotZ: 0.01677365 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380230 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3802': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: fb9b7e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Brute Force (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 19.9545345 - posY: 1.5229435 - posZ: -8.064844 - rotX: 359.9151 - rotY: 270.007782 - rotZ: 0.0103515983 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226321 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 097dcc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Blackjack - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230005 - posY: 1.3498596 - posZ: 85.15 - rotX: 0.0208169557 - rotY: 269.9694 - rotZ: 0.0167641137 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538701 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Weakness - DragSelectable: true - GMNotes: '' - GUID: 3aa40e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dark Future - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -65.60581 - posY: 3.283627 - posZ: -68.9708 - rotX: 0.0208119676 - rotY: 270.001343 - rotZ: 0.01676205 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368830 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 48e103 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Baseball Bat - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.75805 - posY: 1.36662269 - posZ: -56.0895958 - rotX: 0.02079865 - rotY: 270.04 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226350 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 82d62c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stick to the Plan (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.41223478 - posZ: -15.6699867 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538623 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: '982716' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Manual Dexterity (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -59.4477119 - posY: 3.28514123 - posZ: -70.45213 - rotX: 0.0208119471 - rotY: 269.9931 - rotZ: 0.0167645179 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553233 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: c54d7e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dread Curse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -52.7849045 - posY: 1.30583155 - posZ: -49.2717628 - rotX: 0.0208085217 - rotY: 269.999939 - rotZ: 0.0167706348 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430905 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2728': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Chalice of the Heart - DragSelectable: true - GMNotes: '' - GUID: dd4e2a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Four of Cups (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.40496361 - posZ: 23.590023 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431425 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4314': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 527f1c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hospital Debts - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -45.1214066 - posY: 1.30226815 - posZ: -71.05752 - rotX: 0.0208089035 - rotY: 270.000061 - rotZ: 0.0167712178 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 444020 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4408': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 283e54 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Alchemical Transmutation (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -47.6973 - posY: 1.364044 - posZ: -55.3335571 - rotX: 0.0208053179 - rotY: 270.017761 - rotZ: 0.016775595 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450614 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Professor of Entomology - DragSelectable: true - GMNotes: '' - GUID: 8ae314 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dr. Milan Christopher (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.49287 - posY: 1.43936789 - posZ: -51.0247459 - rotX: 0.0208014939 - rotY: 269.999573 - rotZ: 0.0167931467 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 235667 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2356': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Forestalling the Future - DragSelectable: true - GMNotes: '' - GUID: 7667ef - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Relic of Ages - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -46.0404434 - posY: 1.31665075 - posZ: -74.18784 - rotX: 0.0245627742 - rotY: 270.0043 - rotZ: 0.8296155 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 378620 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3786': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 312d38 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hallowed Mirror - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 30.8494987 - posY: 1.351685 - posZ: 64.56357 - rotX: 0.0208110046 - rotY: 269.990936 - rotZ: 0.0167647637 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545208 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9e4e11 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Alter Fate (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -55.9760551 - posY: 3.28508377 - posZ: -73.30521 - rotX: 0.0208075289 - rotY: 270.0092 - rotZ: 0.016770035 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277607 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2776': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: c7d9b5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Enchanted Blade - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -34.748642 - posY: 1.32271636 - posZ: 46.98568 - rotX: 0.0208090227 - rotY: 269.998566 - rotZ: 0.0167730749 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430638 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3a0df6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Scientific Theory (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.403983 - posZ: 21.2900238 - rotX: 359.987427 - rotY: 270.000061 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368827 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e66002 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lantern - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 42.57 - posY: 1.357928 - posZ: 71.35 - rotX: 0.020816328 - rotY: 269.970184 - rotZ: 0.0167607069 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368714 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2616': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cf1d4e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Slip Away - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 28.3500042 - posY: 1.350744 - posZ: 64.45 - rotX: 0.0208153985 - rotY: 269.974854 - rotZ: 0.0167630762 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 315244 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '... Or Are They?' - DragSelectable: true - GMNotes: '' - GUID: 9dd911 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Lucky Dice (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 102.75 - posY: 1.40517533 - posZ: 4.89999962 - rotX: 359.987427 - rotY: 269.999878 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 431206 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2667': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 4fb446 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Internal Injury - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 79.15498 - posY: 1.49438834 - posZ: 72.1812439 - rotX: 0.03946274 - rotY: 269.999573 - rotZ: 359.9925 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230348 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 64e131 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Blood Pact (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.41426945 - posZ: -10.9099836 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430660 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8b0193 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Deciphered Reality (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.42073345 - posZ: -40.80999 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 450608 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 8f170b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Flamethrower (5) (Taboo) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -48.5497971 - posY: 1.58908463 - posZ: -51.07922 - rotX: 356.358124 - rotY: 269.9749 - rotZ: 0.0204766355 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430810 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2732': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: b9bb2a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Fingerprint Kit - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -10.0399933 - posY: 1.34218788 - posZ: 82.8500061 - rotX: 0.0208109729 - rotY: 269.984833 - rotZ: 0.01676825 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 277811 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2778': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 1339b0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mr. "Rook" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -43.8864021 - posY: 2.368725 - posZ: -89.90842 - rotX: 0.0208068751 - rotY: 270.00296 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226343 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d708d9 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Physical Training (2) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.40665138 - posZ: 5.03001928 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230331 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Cleansing Fire - DragSelectable: true - GMNotes: '' - GUID: 423d46 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: St. Hubert's Key - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -28.4000015 - posY: 1.33551991 - posZ: 82.85 - rotX: 0.02080567 - rotY: 270.0064 - rotZ: 0.0167738758 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368630 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2615': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Unscrupulous Investor - DragSelectable: true - GMNotes: '' - GUID: 5ec1a2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dario El-Amin - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 24.9500065 - posY: 1.34681618 - posZ: 55.2500038 - rotX: 0.0208117589 - rotY: 269.9888 - rotZ: 0.016770687 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368507 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2096': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 45bdf0 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Desperate Search - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 64.07 - posY: 1.3684293 - posZ: 80.55 - rotX: 0.02080979 - rotY: 269.997284 - rotZ: 0.0167730879 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226339 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 6a9021 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Marksmanship (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 95.87002 - posY: 1.40292907 - posZ: 18.8300266 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 226331 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 7d4749 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Beat Cop - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 9.230008 - posY: 1.34245384 - posZ: 59.85 - rotX: 0.0208177976 - rotY: 269.969421 - rotZ: 0.0167637467 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230357 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 68fce2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mists of R'lyeh (4) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76001 - posY: 1.42109358 - posZ: -36.2099876 - rotX: 359.987427 - rotY: 270.000183 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 430651 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2915': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 2e3115 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Barricade (3) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 88.05002 - posY: 1.41266835 - posZ: -10.9099836 - rotX: 359.987427 - rotY: 270.0 - rotZ: 359.984558 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438126 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 447a08 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Kleptomania - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 89.8331757 - posY: 1.54224169 - posZ: 51.3644943 - rotX: 0.0211661216 - rotY: 269.999542 - rotZ: 180.017242 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 230359 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 91e890 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Seal of the Elder Sign (5) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.76002 - posY: 1.42233443 - posZ: -40.80999 - rotX: 359.987427 - rotY: 269.999969 - rotZ: 359.984528 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552515 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5522': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 61c4c5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hair of the Dog - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -42.1416969 - posY: 1.30838335 - posZ: -53.75933 - rotX: 0.0208085682 - rotY: 269.999573 - rotZ: 0.0167707819 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 368812 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2097': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 3f3488 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: A Chance Encounter - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 45.97 - posY: 1.35916281 - posZ: 71.35 - rotX: 0.02080517 - rotY: 270.012939 - rotZ: 0.0167774316 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 380026 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '3800': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: d753d7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Momentum (1) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 20.0951538 - posY: 1.67418337 - posZ: -0.8636197 - rotX: 359.909546 - rotY: 270.009155 - rotZ: 0.006574045 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -CustomDeck: - '2263': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2303': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2305': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2306': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2316': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1017195287736529784/BEB850DCAA5497CC1A96E1603C0D3AFFE8B0F2BB/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '2317': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537091085/26A674065298A59068E1D6BA3804D03554C234A3/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2323': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2329': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2331': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241296009359/3EF850792428E467A4475333CCBBF6E6B5975186/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2336': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2356': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2358': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777501236/D145C8B748FB42258EB442B9DF36797851CEECC3/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2611': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2617': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2622': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2655': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2730': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280920105/BBE662BDDC5F2C94A5DE10256B991D1E1DD2C50D/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '2731': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280920329/24678C1EA9F75CE15164134ACF04BD5642D9F434/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '2740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2741': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/778493212055041441/90F035BD69A7C5C6B6F43426DDDA3A09DFCBCBDF/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2746': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2757': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/829135524526809828/AB799C8FFD9024655A9F179CCFF1EE30DE0D3C75/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2761': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2762': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2763': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2775': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2776': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2777': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2778': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2779': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2780': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2788': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2902': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2928': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2929': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2930': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2932': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2933': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2942': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2951': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642393244/74ADDF83D8B03DBF4AD5DC7230C2D12E84685317/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2955': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2965': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2967': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2971': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3121': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3125': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3133': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3135': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3136': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3139': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3140': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3141': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3142': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3148': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3149': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3152': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3153': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3187': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3684': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3685': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3686': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3687': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3688': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3689': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3694': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3698': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3699': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3700': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3703': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3704': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3708': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3709': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3710': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3711': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3712': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3713': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3714': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3715': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3716': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3717': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3718': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3719': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3720': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3721': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3738': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3739': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3740': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3741': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3742': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/960860341956230050/FB390FF37A182334B982AA19488275BB5C6E2219/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3743': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3744': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3745': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3746': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3747': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3748': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3749': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3750': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3751': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3765': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3766': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3767': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3768': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3769': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3770': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3771': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3772': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3773': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3774': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3775': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3780': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3786': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3787': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3788': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3789': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3790': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3791': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3792': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3795': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3796': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3797': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3798': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3799': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3800': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3801': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3802': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3809': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '3810': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4305': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4306': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4308': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4309': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4310': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4311': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4312': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4314': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4315': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4316': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4317': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4318': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4406': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4407': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4408': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4409': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4410': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4437': - BackIsHidden: true - BackURL: https://i.imgur.com/sRsWiSG.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4440': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4441': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4442': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4443': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4444': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4476': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4477': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4478': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4479': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4480': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4485': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/780749631103449151/FFAADF06C9BF9D1F4F3FE22D45CEBBB15D9B58CF/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4486': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4487': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4488': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4489': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4490': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4506': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4523': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4525': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4541': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4547': - BackIsHidden: true - BackURL: https://i.imgur.com/r6F1mt2.jpg - FaceURL: https://i.imgur.com/CN9PXUd.jpg - NumHeight: 5 - NumWidth: 10 - Type: 0 - UniqueBack: true - '4661': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5046': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5272': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5273': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5274': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5275': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5276': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5349': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/778493212055041441/90F035BD69A7C5C6B6F43426DDDA3A09DFCBCBDF/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5376': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5395': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1017195287736531119/B300331BEF8B29732A2AD6123D59380B7ECB631C/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5411': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/775107869050061525/A759DF697FFB26F0F5B75E116A923E33F88FCA7B/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5412': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915335413/F6B6100F5713A33245CFBB6F1D7316AA2DD0F760/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5413': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915335843/99E638B3D735149C6624312DBAB47A3AA2D2F95D/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5453': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5469': - BackIsHidden: true - BackURL: https://i.imgur.com/NSozoRe.jpg - FaceURL: https://i.imgur.com/HLQOkvy.jpg - NumHeight: 5 - NumWidth: 10 - Type: 0 - UniqueBack: true - '5494': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1537373966843931844/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373966843930220/4B448C6C7009864D4D1E4FBB57F48A40AF5F9136/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5496': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1537373966843931844/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373966843934735/BFCEAE686380A770B52AAFB4710A0AB3043E02EE/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5499': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1537373966843931844/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373966843937651/74845294CAEB3908414DAE31A5BC8A6683FEBF20/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5505': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1537373966843931844/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373966843945794/C608E9B39B1E0B4267BCCC9A5B308495278702C0/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5508': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5512': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5513': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5514': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5515': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5516': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5517': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5518': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5519': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5520': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5521': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5522': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5523': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg - FaceURL: http://cloud-3.steamusercontent.com/ugc/780749631103449151/FFAADF06C9BF9D1F4F3FE22D45CEBBB15D9B58CF/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5524': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5525': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297420931/3655DD579E6DE8FFA2C1E4D84DFDEA3B3957C28C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5531': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5532': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5533': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5535': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507632247/1E1B6D93DBC33FA7C8DC93C7D06B7964CAD98AD0/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5536': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507630340/07BD7D0674499D3B5B315239E1B9682B6E4D8285/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5537': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507632620/1C7C9B898C919EDAD757709C161F0DFFF3FA9238/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5538': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870529507632983/CC643186858EEC718B5F3FEA9CD7D0CEDE055F13/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '75': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false -DeckIDs: -- 266322 -- 273000 -- 273100 -- 538719 -- 230502 -- 430655 -- 430647 -- 538811 -- 294203 -- 230321 -- 368423 -- 230337 -- 553232 -- 315249 -- 441024 -- 379827 -- 430637 -- 368528 -- 368522 -- 369945 -- 368519 -- 230327 -- 226309 -- 368837 -- 430646 -- 450604 -- 430503 -- 368842 -- 450617 -- 226325 -- 370926 -- 262203 -- 368422 -- 545300 -- 553600 -- 538626 -- 226360 -- 315258 -- 553500 -- 226330 -- 226322 -- 368505 -- 553203 -- 553231 -- 449034 -- 377537 -- 230330 -- 226310 -- 376739 -- 371209 -- 378619 -- 368708 -- 545329 -- 431008 -- 232332 -- 538604 -- 277910 -- 550805 -- 230318 -- 274000 -- 376840 -- 315251 -- 226328 -- 368407 -- 538718 -- 450621 -- 368403 -- 550809 -- 440922 -- 374014 -- 444260 -- 315239 -- 230302 -- 538706 -- 230338 -- 527418 -- 276300 -- 448030 -- 447734 -- 538821 -- 318703 -- 235840 -- 274008 -- 226352 -- 553111 -- 450618 -- 230317 -- 226318 -- 430642 -- 265502 -- 538628 -- 550829 -- 545209 -- 368800 -- 430644 -- 230361 -- 545302 -- 277709 -- 368623 -- 315247 -- 527552 -- 368818 -- 538728 -- 545213 -- 293016 -- 315253 -- 368429 -- 431009 -- 538808 -- 374418 -- 230326 -- 368808 -- 374834 -- 230343 -- 538727 -- 274002 -- 368421 -- 450622 -- 538609 -- 527607 -- 368629 -- 368513 -- 368400 -- 368408 -- 448031 -- 450616 -- 315242 -- 368526 -- 368500 -- 368854 -- 315245 -- 430635 -- 449037 -- 368426 -- 448936 -- 277912 -- 553101 -- 553223 -- 538601 -- 538720 -- 546917 -- 232907 -- 368823 -- 378863 -- 545308 -- 290321 -- 368802 -- 553215 -- 379931 -- 277606 -- 545303 -- 450625 -- 379022 -- 292914 -- 368621 -- 545324 -- 440622 -- 230347 -- 368434 -- 368804 -- 230304 -- 368706 -- 379619 -- 292813 -- 552421 -- 230307 -- 230306 -- 368852 -- 431111 -- 466112 -- 538700 -- 553201 -- 438128 -- 313604 -- 438124 -- 538812 -- 277813 -- 368813 -- 440814 -- 550828 -- 538805 -- 545322 -- 449035 -- 368418 -- 447935 -- 368524 -- 430908 -- 374834 -- 430640 -- 226341 -- 538613 -- 553114 -- 553214 -- 551303 -- 430645 -- 312109 -- 274010 -- 538621 -- 232333 -- 292815 -- 315304 -- 274005 -- 261704 -- 378617 -- 226355 -- 292913 -- 315248 -- 368405 -- 538818 -- 262200 -- 368710 -- 430658 -- 278846 -- 374633 -- 314802 -- 314904 -- 448034 -- 452300 -- 553210 -- 527237 -- 447633 -- 262202 -- 430809 -- 230319 -- 538823 -- 553103 -- 545318 -- 230325 -- 368711 -- 374935 -- 226324 -- 538825 -- 377244 -- 368628 -- 379929 -- 230354 -- 368847 -- 448937 -- 230311 -- 226323 -- 368626 -- 379831 -- 226317 -- 550827 -- 448519 -- 235644 -- 545312 -- 230334 -- 368415 -- 230342 -- 538729 -- 368860 -- 527403 -- 370323 -- 447632 -- 450615 -- 553230 -- 380949 -- 553700 -- 261101 -- 454100 -- 232941 -- 550802 -- 379018 -- 553108 -- 274609 -- 233605 -- 368514 -- 452504 -- 375016 -- 440623 -- 553100 -- 438122 -- 551405 -- 368515 -- 538717 -- 545330 -- 430654 -- 538708 -- 379828 -- 448029 -- 375129 -- 368501 -- 538619 -- 550813 -- 553202 -- 447932 -- 315303 -- 538721 -- 379154 -- 379618 -- 368430 -- 550820 -- 230349 -- 440721 -- 550500 -- 538806 -- 545313 -- 538815 -- 379930 -- 230358 -- 373819 -- 538710 -- 378958 -- 368857 -- 297101 -- 274100 -- 527404 -- 370422 -- 431207 -- 230603 -- 380126 -- 549600 -- 380025 -- 368414 -- 315241 -- 314905 -- 226303 -- 230353 -- 431007 -- 431557 -- 376938 -- 274607 -- 277710 -- 368523 -- 450611 -- 226335 -- 527402 -- 450600 -- 553229 -- 368844 -- 550824 -- 538804 -- 447732 -- 226349 -- 448840 -- 277911 -- 368824 -- 541200 -- 374330 -- 274006 -- 368510 -- 447934 -- 368810 -- 538705 -- 230362 -- 230310 -- 232900 -- 293013 -- 552220 -- 315259 -- 226351 -- 450612 -- 444021 -- 450620 -- 447933 -- 538803 -- 379928 -- 527400 -- 538829 -- 379711 -- 368705 -- 440624 -- 275733 -- 380127 -- 368838 -- 534902 -- 538607 -- 551200 -- 440724 -- 441026 -- 368858 -- 226302 -- 430648 -- 226319 -- 368620 -- 313501 -- 368425 -- 551201 -- 368819 -- 293014 -- 226344 -- 538615 -- 368517 -- 368502 -- 368820 -- 551302 -- 368412 -- 379019 -- 373910 -- 314105 -- 550818 -- 368836 -- 379021 -- 230333 -- 230329 -- 368816 -- 295504 -- 377343 -- 226308 -- 438125 -- 295502 -- 293313 -- 545203 -- 553104 -- 430652 -- 371565 -- 275732 -- 313301 -- 226312 -- 368809 -- 293216 -- 545207 -- 315254 -- 368420 -- 450602 -- 545206 -- 450605 -- 368402 -- 312512 -- 553227 -- 368627 -- 550821 -- 545214 -- 368433 -- 430650 -- 315243 -- 450610 -- 226304 -- 230313 -- 441023 -- 230344 -- 380229 -- 368503 -- 315260 -- 226306 -- 368839 -- 539500 -- 553205 -- 440722 -- 551506 -- 527236 -- 538714 -- 553221 -- 274007 -- 447834 -- 230345 -- 230339 -- 444348 -- 380029 -- 377141 -- 545201 -- 374264 -- 545319 -- 441027 -- 378762 -- 447731 -- 226357 -- 226332 -- 230341 -- 368504 -- 7502 -- 551609 -- 450607 -- 553200 -- 262204 -- 368618 -- 313603 -- 545320 -- 230324 -- 440923 -- 447631 -- 552110 -- 230308 -- 261102 -- 369815 -- 379830 -- 553800 -- 545323 -- 277605 -- 368833 -- 368850 -- 538608 -- 368856 -- 277512 -- 235857 -- 553204 -- 553106 -- 430659 -- 448736 -- 262201 -- 440925 -- 538622 -- 545326 -- 368855 -- 450606 -- 431818 -- 553222 -- 226333 -- 368716 -- 315233 -- 368424 -- 292814 -- 368520 -- 380028 -- 545315 -- 368829 -- 235603 -- 226347 -- 441025 -- 527312 -- 553224 -- 277812 -- 538702 -- 545310 -- 292915 -- 545204 -- 314000 -- 449036 -- 226361 -- 230350 -- 368843 -- 553216 -- 372110 -- 226353 -- 230320 -- 368622 -- 545327 -- 226311 -- 537608 -- 230312 -- 550807 -- 550822 -- 538828 -- 274001 -- 278011 -- 447833 -- 538722 -- 538822 -- 274606 -- 545202 -- 295503 -- 368410 -- 372011 -- 538724 -- 293314 -- 369424 -- 313905 -- 368428 -- 368713 -- 430808 -- 454740 -- 368821 -- 230346 -- 368815 -- 368859 -- 380125 -- 538814 -- 378016 -- 293215 -- 374717 -- 368826 -- 450603 -- 368840 -- 230352 -- 447832 -- 545304 -- 277604 -- 230309 -- 370827 -- 235649 -- 450624 -- 368508 -- 553207 -- 315257 -- 230332 -- 315240 -- 545205 -- 232904 -- 315256 -- 553228 -- 368853 -- 538824 -- 368715 -- 551608 -- 504613 -- 313502 -- 226329 -- 226340 -- 313906 -- 233607 -- 312509 -- 315252 -- 553211 -- 527561 -- 430907 -- 368806 -- 448735 -- 368506 -- 230340 -- 378621 -- 368527 -- 368817 -- 549400 -- 431006 -- 440924 -- 233604 -- 538730 -- 545212 -- 315234 -- 553220 -- 277510 -- 379617 -- 368512 -- 292816 -- 226307 -- 448613 -- 230322 -- 312514 -- 550803 -- 553212 -- 368411 -- 538603 -- 371806 -- 553359 -- 371112 -- 440723 -- 374014 -- 368717 -- 277711 -- 430639 -- 312513 -- 379829 -- 550804 -- 545314 -- 545309 -- 527238 -- 226358 -- 431731 -- 315235 -- 550826 -- 230315 -- 232934 -- 371013 -- 444024 -- 368509 -- 430643 -- 545200 -- 226300 -- 232300 -- 232949 -- 380228 -- 430636 -- 374532 -- 541300 -- 447630 -- 226320 -- 226346 -- 553218 -- 553110 -- 371704 -- 538813 -- 551507 -- 450609 -- 550810 -- 551912 -- 444451 -- 538831 -- 448033 -- 538618 -- 374115 -- 315246 -- 368518 -- 448839 -- 274004 -- 553105 -- 226314 -- 368427 -- 380128 -- 550811 -- 538807 -- 553225 -- 448032 -- 553206 -- 447836 -- 538827 -- 550801 -- 550806 -- 538627 -- 545316 -- 447733 -- 448938 -- 226356 -- 226354 -- 440626 -- 538630 -- 368835 -- 538629 -- 277608 -- 290320 -- 368631 -- 448737 -- 230355 -- 537612 -- 230305 -- 443723 -- 538826 -- 233135 -- 538800 -- 527605 -- 226345 -- 226316 -- 226326 -- 261700 -- 232950 -- 440813 -- 312510 -- 377436 -- 552309 -- 226338 -- 538616 -- 368417 -- 546916 -- 550819 -- 278012 -- 230300 -- 545305 -- 376501 -- 368846 -- 368404 -- 553109 -- 537609 -- 368861 -- 230316 -- 368624 -- 538600 -- 314003 -- 232348 -- 368511 -- 379253 -- 431205 -- 315237 -- 278010 -- 538723 -- 370046 -- 553107 -- 368825 -- 315255 -- 440625 -- 274003 -- 230360 -- 274011 -- 538830 -- 230301 -- 374014 -- 371907 -- 550825 -- 379616 -- 538802 -- 448738 -- 368841 -- 553112 -- 450619 -- 538801 -- 368712 -- 368803 -- 230356 -- 553226 -- 315250 -- 368409 -- 368828 -- 553102 -- 315262 -- 368831 -- 315236 -- 440627 -- 371466 -- 226336 -- 538820 -- 545307 -- 545211 -- 545325 -- 371605 -- 226327 -- 438123 -- 290207 -- 379555 -- 235600 -- 368516 -- 293217 -- 430656 -- 368801 -- 368848 -- 226305 -- 261701 -- 226334 -- 545210 -- 430906 -- 276200 -- 538709 -- 232951 -- 296500 -- 368401 -- 538819 -- 440926 -- 527606 -- 374417 -- 368619 -- 261100 -- 315238 -- 450601 -- 230336 -- 538614 -- 431115 -- 293214 -- 538704 -- 368625 -- 314800 -- 377042 -- 369816 -- 368849 -- 430649 -- 368814 -- 371308 -- 231709 -- 381050 -- 541109 -- 315261 -- 368525 -- 315232 -- 230323 -- 379020 -- 368851 -- 551714 -- 538624 -- 368416 -- 314204 -- 378019 -- 368707 -- 378018 -- 292912 -- 233606 -- 538713 -- 450613 -- 314002 -- 534901 -- 368431 -- 368413 -- 226342 -- 368419 -- 235822 -- 293315 -- 447835 -- 527235 -- 368928 -- 545328 -- 549900 -- 553213 -- 527417 -- 430641 -- 261702 -- 368709 -- 545321 -- 527416 -- 538809 -- 430653 -- 448838 -- 444022 -- 440720 -- 368834 -- 380027 -- 226359 -- 368845 -- 552011 -- 538725 -- 438127 -- 226315 -- 226301 -- 553113 -- 553217 -- 538602 -- 368521 -- 527401 -- 378017 -- 553219 -- 231600 -- 538620 -- 235648 -- 277509 -- 368832 -- 274608 -- 230328 -- 553208 -- 296704 -- 368822 -- 226348 -- 527419 -- 312511 -- 368805 -- 454741 -- 444147 -- 550823 -- 430501 -- 368807 -- 440621 -- 293015 -- 374419 -- 226313 -- 277511 -- 430657 -- 376600 -- 378618 -- 276101 -- 368811 -- 261703 -- 545301 -- 226337 -- 431110 -- 230351 -- 527608 -- 230303 -- 551404 -- 450623 -- 368406 -- 538726 -- 551813 -- 550800 -- 538625 -- 553234 -- 538707 -- 448837 -- 368432 -- 295501 -- 295128 -- 230335 -- 230314 -- 431656 -- 553209 -- 374420 -- 380230 -- 226321 -- 538701 -- 368830 -- 226350 -- 538623 -- 553233 -- 430905 -- 431425 -- 444020 -- 450614 -- 235667 -- 378620 -- 545208 -- 277607 -- 430638 -- 368827 -- 368714 -- 315244 -- 431206 -- 230348 -- 430660 -- 450608 -- 430810 -- 277811 -- 226343 -- 230331 -- 368630 -- 368507 -- 226339 -- 226331 -- 230357 -- 430651 -- 438126 -- 230359 -- 552515 -- 368812 -- 380026 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: 4141fb -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: true -IgnoreFoW: false -Locked: false -LuaScript: '' -LuaScriptState: '' -MeasureMovement: false -Name: Deck -Nickname: '' -SidewaysCard: false -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: -63.9 - posY: 2.4 - posZ: -63.85 - rotX: 0.02 - rotY: 270.01 - rotZ: 180.02 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Arkhamdb bag b85d6d/Deck All Weaknesses dd549a.yaml b/unpacked/Custom_Model_Bag Arkhamdb bag b85d6d/Deck All Weaknesses dd549a.yaml deleted file mode 100644 index e0de9c41e..000000000 --- a/unpacked/Custom_Model_Bag Arkhamdb bag b85d6d/Deck All Weaknesses dd549a.yaml +++ /dev/null @@ -1,2288 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 -ContainedObjects: -- Autoraise: true - CardID: 438124 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a5be8b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Bloodthirst) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.46176 - posY: 1.37253177 - posZ: 73.76154 - rotX: 0.0148119656 - rotY: 270.004944 - rotZ: 0.0242835376 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545211 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 121b2d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dendromorphosis - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.2310028 - posY: 1.29762256 - posZ: -76.8665543 - rotX: 0.0208089575 - rotY: 270.0 - rotZ: 0.0167721659 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438128 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 406ab2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Your Worst Nightmare - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.44901 - posY: 1.53057539 - posZ: 58.7713966 - rotX: 0.0195846576 - rotY: 269.9999 - rotZ: 0.0153481439 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290816 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: b239d7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mob Enforcer - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.38398 - posY: 1.36537349 - posZ: 75.9246 - rotX: 0.02080847 - rotY: 269.999084 - rotZ: 0.0167746339 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290806 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 4fb446 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Internal Injury - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 84.63887 - posY: 1.376687 - posZ: 83.34652 - rotX: 0.0193456579 - rotY: 269.996979 - rotZ: 0.0182021931 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290804 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2908': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 88ee43 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hypochondria - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.3866119 - posY: 1.80896521 - posZ: -77.7885361 - rotX: 0.02079337 - rotY: 270.040619 - rotZ: 180.0168 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290320 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Circumstances Beyond Your Control - DragSelectable: true - GMNotes: '' - GUID: d5c93d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "The Tower \u2022 XVI" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -65.1514359 - posY: 3.57692623 - posZ: 6.00838327 - rotX: 0.0208086111 - rotY: 269.999878 - rotZ: 0.0167732742 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553434 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: ffb62c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Day of Reckoning - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.6921654 - posY: 1.792034 - posZ: -56.7708473 - rotX: 0.02080212 - rotY: 270.009521 - rotZ: 180.0168 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290801 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2908': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: c17498 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Paranoia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.3866119 - posY: 1.81096566 - posZ: -77.78853 - rotX: 0.02079328 - rotY: 270.0409 - rotZ: 180.0168 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 291019 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2910': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: fd9c56 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Through the Gates - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.4280052 - posY: 1.85709047 - posZ: -77.81856 - rotX: 0.0208126642 - rotY: 269.9844 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290802 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2908': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 249d83 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Haunted - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.4280052 - posY: 1.85719132 - posZ: -77.81856 - rotX: 0.02081545 - rotY: 269.9845 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290807 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 016e3c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Chronophobia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.96729 - posY: 1.37533462 - posZ: 83.17558 - rotX: 0.0208096765 - rotY: 269.9989 - rotZ: 0.016768232 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 291019 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2659': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 31f72f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Through the Gates - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 81.1103439 - posY: 1.37475467 - posZ: 81.38222 - rotX: 0.0155774252 - rotY: 269.998871 - rotZ: 0.0148439659 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290321 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: cebf6a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The 13th Vision - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.422718 - posY: 1.85711145 - posZ: -77.81429 - rotX: 0.0208138973 - rotY: 269.97757 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553433 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 96eb52 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dread Curse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 7.394306 - posY: 1.2917521 - posZ: 48.2496529 - rotX: 0.0207969919 - rotY: 269.999847 - rotZ: 0.87159 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438126 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 447a08 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Kleptomania - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.45187 - posY: 1.51685083 - posZ: 58.63176 - rotX: 0.02240032 - rotY: 270.002625 - rotZ: 0.00697853556 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 547902 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5479': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 2204cc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Self-Destructive - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -44.6743774 - posY: 3.16606283 - posZ: -96.95051 - rotX: 0.0208084453 - rotY: 270.0 - rotZ: 0.01677049 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553432 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 483f9a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Accursed Follower - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 6.90543127 - posY: 1.27752221 - posZ: 56.0015526 - rotX: 0.020808218 - rotY: 269.999939 - rotZ: 0.016770957 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290817 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: 16a89d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Silver Twilight Acolyte - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.2340546 - posY: 1.36607194 - posZ: 78.4964752 - rotX: 0.0208077766 - rotY: 269.999542 - rotZ: 0.016773073 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553433 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: '993595' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dread Curse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 6.520298 - posY: 1.27640986 - posZ: 52.67936 - rotX: 0.020808354 - rotY: 269.999939 - rotZ: 0.0167707969 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538702 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: fc4168 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Nihilism - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -65.69718 - posY: 1.3562721 - posZ: -83.43286 - rotX: 0.0208079629 - rotY: 270.0195 - rotZ: 0.016803991 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290818 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: 4ea68b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stubborn Detective - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.32571 - posY: 1.3645314 - posZ: 73.1198349 - rotX: 0.0208079163 - rotY: 269.999237 - rotZ: 0.0167740583 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290814 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: ba2ae1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Doomed - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 73.57277 - posY: 1.367833 - posZ: 67.00315 - rotX: 0.0171475261 - rotY: 269.999878 - rotZ: 0.014829508 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552702 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a3bc7a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Atychiphobia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 33.8660851 - posY: 1.29044318 - posZ: 55.64921 - rotX: 0.0208031386 - rotY: 270.01947 - rotZ: 0.0167778675 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438125 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: eff3c8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Self-Centered - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 82.3005 - posY: 1.37097037 - posZ: 66.61211 - rotX: 0.0208081 - rotY: 269.999756 - rotZ: 0.0167713575 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290321 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e42f12 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The 13th Vision - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.3866119 - posY: 1.80897725 - posZ: -77.7885361 - rotX: 0.0207925364 - rotY: 270.0409 - rotZ: 180.0168 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290811 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2908': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 3b3c0a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Drawing the Sign - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.4171066 - posY: 1.85708785 - posZ: -77.80978 - rotX: 0.0208140146 - rotY: 269.9754 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 545212 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: e27c93 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Offer You Cannot Refuse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -53.6115227 - posY: 1.2985549 - posZ: -73.20949 - rotX: 0.020809751 - rotY: 270.000061 - rotZ: 0.016769927 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290807 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: eeb330 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Chronophobia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 77.61771 - posY: 1.37417972 - posZ: 83.3862152 - rotX: 0.02080846 - rotY: 269.998749 - rotZ: 0.0167724155 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552602 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2662': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a2e7d7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Obsessive - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -50.4945068 - posY: 2.84449673 - posZ: -98.49263 - rotX: 0.02080569 - rotY: 270.010651 - rotZ: 0.0167755187 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290806 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2908': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: d28be6 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Internal Injury - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.394413 - posY: 1.81095624 - posZ: -77.7948 - rotX: 0.0207971055 - rotY: 270.041931 - rotZ: 180.0168 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290803 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: d83baf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Psychosis - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.276104 - posY: 1.36351478 - posZ: 69.70881 - rotX: 0.0208085179 - rotY: 269.998138 - rotZ: 0.0167739056 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438122 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: ea0fa1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Cowardice) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -63.422718 - posY: 1.85714376 - posZ: -77.81429 - rotX: 0.0208181739 - rotY: 269.975281 - rotZ: 180.016785 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290810 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 29766c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Overzealous - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 84.76986 - posY: 1.37477219 - posZ: 76.5368347 - rotX: 0.0208052341 - rotY: 270.008362 - rotZ: 0.01677476 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290810 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 88a9b3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Overzealous - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 81.0201 - posY: 1.373406 - posZ: 76.52217 - rotX: 0.0208056755 - rotY: 270.00824 - rotZ: 0.016777223 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438123 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: f6aba5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Curiosity) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.29785 - posY: 1.53495085 - posZ: 73.75409 - rotX: 0.02094236 - rotY: 269.999878 - rotZ: 0.0147951907 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290800 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 2210c1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Amnesia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 60.0020523 - posY: 1.35961318 - posZ: 55.47854 - rotX: 0.0208090711 - rotY: 269.9957 - rotZ: 0.0167709384 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290815 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: da227d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Thing That Follows - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 77.00673 - posY: 1.37194359 - posZ: 76.50519 - rotX: 0.0208081231 - rotY: 269.999054 - rotZ: 0.0167726167 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290801 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 3575a3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Paranoia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 60.2334442 - posY: 1.36171019 - posZ: 62.84418 - rotX: 0.0131824408 - rotY: 269.998535 - rotZ: 0.0226880386 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438127 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 57e648 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Narcolepsy - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 82.24709 - posY: 1.371798 - posZ: 69.50579 - rotX: 0.0208078641 - rotY: 269.9998 - rotZ: 0.01677146 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538602 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: c45e67 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Reckless - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 33.86608 - posY: 1.3293891 - posZ: 55.6492081 - rotX: 0.0208107773 - rotY: 269.99292 - rotZ: 0.0167680979 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290320 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Circumstances Beyond Your Control - DragSelectable: true - GMNotes: '' - GUID: cc65f3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "The Tower \u2022 XVI" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.4137726 - posY: 3.57692623 - posZ: 5.186873 - rotX: 0.0208082758 - rotY: 269.9998 - rotZ: 0.0167729743 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 553432 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 6d8407 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Accursed Follower - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 7.77942562 - posY: 1.30375266 - posZ: 51.57145 - rotX: 0.0208079368 - rotY: 269.999939 - rotZ: 0.0167710185 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290805 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: b2ef43 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Indebted - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 69.6492 - posY: 1.37130547 - posZ: 83.45329 - rotX: 0.02080887 - rotY: 269.997437 - rotZ: 0.0167718846 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290800 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 8598a4 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Amnesia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.72087 - posY: 1.36020052 - posZ: 57.8339 - rotX: 0.0208095219 - rotY: 269.9957 - rotZ: 0.01677148 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290813 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: dd3d09 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dark Pact - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 73.7898941 - posY: 1.50798833 - posZ: 66.88923 - rotX: 0.0198830087 - rotY: 269.998352 - rotZ: 0.0241802726 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290805 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 8df93a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Indebted - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 74.0187149 - posY: 1.37291312 - posZ: 83.52449 - rotX: 0.0208078064 - rotY: 269.9976 - rotZ: 0.0167761613 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2908': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '2910': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5452': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5479': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5526': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5527': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - '5534': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false -DeckIDs: -- 438124 -- 545211 -- 438128 -- 290816 -- 290806 -- 290804 -- 290320 -- 553434 -- 290801 -- 291019 -- 290802 -- 290807 -- 291019 -- 290321 -- 553433 -- 438126 -- 547902 -- 553432 -- 290817 -- 553433 -- 538702 -- 290818 -- 290814 -- 552702 -- 438125 -- 290321 -- 290811 -- 545212 -- 290807 -- 552602 -- 290806 -- 290803 -- 438122 -- 290810 -- 290810 -- 438123 -- 290800 -- 290815 -- 290801 -- 438127 -- 538602 -- 290320 -- 553432 -- 290805 -- 290800 -- 290813 -- 290805 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: dd549a -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: true -IgnoreFoW: false -Locked: false -LuaScript: '' -LuaScriptState: '' -MeasureMovement: false -Name: Deck -Nickname: All Weaknesses -SidewaysCard: false -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: -63.28 - posY: 1.6 - posZ: -62.5 - rotX: 0.02 - rotY: 270.01 - rotZ: 180.02 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c.ttslua new file mode 100644 index 000000000..d4332d4c8 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c.ttslua @@ -0,0 +1,503 @@ +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c.yaml new file mode 100644 index 000000000..c3bf2bf17 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c.yaml @@ -0,0 +1,119 @@ +AttachedDecals: +- CustomDecal: + ImageURL: http://cloud-3.steamusercontent.com/ugc/959719855119695911/931B9829687A20F4DEADB36DA57B7E6D76792231/ + Name: dunwich_back + Size: 7.4 + Transform: + posX: -0.0021877822 + posY: -0.08963572 + posZ: -0.00288731651 + rotX: 270.0 + rotY: 359.869568 + rotZ: 0.0 + scaleX: 2.00000215 + scaleY: 2.00000238 + scaleZ: 2.00000262 +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 0de2c4.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Monterey Jack Mini + 0e3906.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Kate Winthrop 13a465.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 226716.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Infinite_Bag Evidence + Tokens 3068ef.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 307044.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 3ddfeb.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn + token 41bfc7.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn + token 4ad11b.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 543164.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Agatha Crane Mini + 5f4b38.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn + token 6330da.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Darrell Simmons + Mini 6d9f16.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Daniela Reyes Mini + 750b6f.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 779aa6.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Tile Artifact Expansion + User Guide 871d2f.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn + token 9e80b9.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Daniela Reyes a8246c.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Agatha Crane b564f3.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Monterey Jack b77c53.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn + token bde4a6.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn + token d6fdbf.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn + token d9fb86.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Darrell Simmons + dced09.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn + token de216f.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn + token e04b48.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.yaml' +- !include 'Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Kate Winthrop Mini + f1896b.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1648844021962694851/601082A480E848588228915565491B24C4231888/ + MaterialIndex: 3 + MeshURL: https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj + NormalURL: '' + TypeIndex: 6 +Description: By Mint Tea Fan +DragSelectable: true +GMNotes: '' +GUID: b43c9c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Artifact Expansion b43c9c.ttslua' +LuaScriptState: '{"ml":{"0de2c4":{"lock":false,"pos":{"x":-16.640100479126,"y":1.35992395877838,"z":-67.8206024169922},"rot":{"x":0.0208164770156145,"y":269.999786376953,"z":0.0167682692408562}},"0e3906":{"lock":false,"pos":{"x":-19.2959003448486,"y":1.31220138072968,"z":-69.0606994628906},"rot":{"x":0.0208087358623743,"y":270.000091552734,"z":0.0167712364345789}},"13a465":{"lock":false,"pos":{"x":-22.6168994903564,"y":1.31328415870667,"z":-61.2414016723633},"rot":{"x":0.0208037719130516,"y":270.016998291016,"z":0.0167772136628628}},"226716":{"lock":false,"pos":{"x":-16.640100479126,"y":1.35920095443726,"z":-70.2906036376953},"rot":{"x":0.0208163242787123,"y":269.99951171875,"z":0.0167674925178289}},"2bff9c":{"lock":false,"pos":{"x":-26.3001976013184,"y":1.29605293273926,"z":-69.0606002807617},"rot":{"x":359.983215332031,"y":0.028911367058754,"z":0.0208273660391569}},"3068ef":{"lock":false,"pos":{"x":-22.6053009033203,"y":1.37177276611328,"z":-88.2667007446289},"rot":{"x":0.0208114460110664,"y":269.999938964844,"z":0.0167696736752987}},"307044":{"lock":false,"pos":{"x":-16.6401996612549,"y":1.35494840145111,"z":-84.8181991577148},"rot":{"x":0.0208098478615284,"y":270.022186279297,"z":0.0167756900191307}},"3a5047":{"lock":false,"pos":{"x":-28.2011,"y":1.2954,"z":-69.067},"rot":{"x":359.9832,"y":-0.0001,"z":0.0208}},"3ddfeb":{"lock":false,"pos":{"x":-16.6394004821777,"y":1.35459744930267,"z":-86.0186004638672},"rot":{"x":0.0208161473274231,"y":269.99951171875,"z":0.0167678408324718}},"41bfc7":{"lock":false,"pos":{"x":-16.6550998687744,"y":1.36184680461884,"z":-61.2331008911133},"rot":{"x":0.020813349634409,"y":270.010894775391,"z":0.0167719759047031}},"4285a6":{"lock":false,"pos":{"x":-17.8047008514404,"y":1.12067413330078,"z":-46.6142997741699},"rot":{"x":359.979156494141,"y":89.9986877441406,"z":359.983215332031}},"4ad11b":{"lock":false,"pos":{"x":-16.6396007537842,"y":1.357253074646,"z":-76.9456024169922},"rot":{"x":0.0208165366202593,"y":269.999694824219,"z":0.0167679507285357}},"543164":{"lock":false,"pos":{"x":-16.6403007507324,"y":1.3595609664917,"z":-69.060302734375},"rot":{"x":0.0208165254443884,"y":269.99951171875,"z":0.0167674962431192}},"5f4b38":{"lock":false,"pos":{"x":-19.2936000823975,"y":1.30989551544189,"z":-76.9414978027344},"rot":{"x":0.0208090543746948,"y":270.000091552734,"z":0.0167708471417427}},"6330da":{"lock":false,"pos":{"x":-16.640100479126,"y":1.3637877702713,"z":-54.6207008361816},"rot":{"x":0.0208163876086473,"y":270.000213623047,"z":0.0167681388556957}},"6d9f16":{"lock":false,"pos":{"x":-19.2998008728027,"y":1.30758762359619,"z":-84.8181991577148},"rot":{"x":0.0208090357482433,"y":270,"z":0.0167707540094852}},"750b6f":{"lock":false,"pos":{"x":-19.2999992370605,"y":1.31677353382111,"z":-53.4357986450195},"rot":{"x":0.020808657631278,"y":269.999938964844,"z":0.0167711712419987}},"779aa6":{"lock":false,"pos":{"x":-16.638599395752,"y":1.35532283782959,"z":-83.5414962768555},"rot":{"x":0.0208173561841249,"y":269.997985839844,"z":0.0167672354727983}},"871d2f":{"lock":false,"pos":{"x":-25.1793079376221,"y":1.48027086257935,"z":-43.2673530578613},"rot":{"x":0.182462647557259,"y":270.007049560547,"z":0.699320673942566}},"9e80b9":{"lock":false,"pos":{"x":-16.640100479126,"y":1.36414790153503,"z":-53.3903999328613},"rot":{"x":0.0208215489983559,"y":269.983795166016,"z":0.016762301325798}},"a8246c":{"lock":false,"pos":{"x":-22.613899230957,"y":1.31556940078735,"z":-53.4380989074707},"rot":{"x":0.0208087023347616,"y":270.000305175781,"z":0.0167712960392237}},"b564f3":{"lock":false,"pos":{"x":-22.6156997680664,"y":1.30868768692017,"z":-76.9459991455078},"rot":{"x":0.0208089146763086,"y":269.999938964844,"z":0.0167711954563856}},"b77c53":{"lock":false,"pos":{"x":-22.6156997680664,"y":1.31099140644073,"z":-69.0755996704102},"rot":{"x":0.0208087656646967,"y":270,"z":0.0167710538953543}},"b9fc9d":{"lock":false,"pos":{"x":-26.2999992370605,"y":1.30062639713287,"z":-53.4369010925293},"rot":{"x":359.983215332031,"y":-2.17039905692218E-05,"z":0.0208478271961212}},"bde4a6":{"lock":false,"pos":{"x":-16.640100479126,"y":1.36451041698456,"z":-52.1520004272461},"rot":{"x":0.0208161342889071,"y":269.999786376953,"z":0.0167680084705353}},"c3e12f":{"lock":false,"pos":{"x":-26.2996006011963,"y":1.29144096374512,"z":-84.818000793457},"rot":{"x":359.983215332031,"y":-0.000786474032793194,"z":0.0208397023379803}},"ced1e0":{"lock":false,"pos":{"x":-26.300199508667,"y":1.29374480247498,"z":-76.9456024169922},"rot":{"x":359.983215332031,"y":0.000286838185274974,"z":0.0208373516798019}},"d6fdbf":{"lock":false,"pos":{"x":-16.6399993896484,"y":1.36149287223816,"z":-62.4608993530273},"rot":{"x":0.0208265036344528,"y":269.965209960938,"z":0.0167555399239063}},"d9fb86":{"lock":false,"pos":{"x":-16.640100479126,"y":1.35689282417297,"z":-78.1756973266602},"rot":{"x":0.0208141282200813,"y":270.008697509766,"z":0.0167712904512882}},"dced09":{"lock":false,"pos":{"x":-22.6168994903564,"y":1.3063827753067,"z":-84.8184967041016},"rot":{"x":0.0208087004721165,"y":269.999938964844,"z":0.0167711116373539}},"de216f":{"lock":false,"pos":{"x":-16.6550998687744,"y":1.3622065782547,"z":-60.0037002563477},"rot":{"x":0.020812813192606,"y":270.010711669922,"z":0.0167718641459942}},"e04b48":{"lock":false,"pos":{"x":-16.6403007507324,"y":1.35761594772339,"z":-75.7053985595703},"rot":{"x":0.0208198688924313,"y":269.987426757813,"z":0.0167636144906282}},"e3a45e":{"lock":false,"pos":{"x":-26.3001003265381,"y":1.29834163188934,"z":-61.2410011291504},"rot":{"x":359.983215332031,"y":0.00058197503676638,"z":0.0208341758698225}},"f1896b":{"lock":false,"pos":{"x":-19.3001003265381,"y":1.31449115276337,"z":-61.2332000732422},"rot":{"x":0.0208087507635355,"y":269.999786376953,"z":0.016770962625742}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Artifact Expansion +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 32.45 + posY: 1.43 + posZ: -13.12 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 2.21 + scaleY: 0.46 + scaleZ: 2.42 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.ttslua similarity index 94% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543.ttslua rename to unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.ttslua index 758efa0e2..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543.ttslua +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Setup", click_function="buttonClick_setup", function_owner=self, ---- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={1,1,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.yaml new file mode 100644 index 000000000..9cafb5b54 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Bag Artifact Deck Setup 4285a6/CardCustom Venture Too Deep 52b042.yaml' +- !include 'Bag Artifact Deck Setup 4285a6/CardCustom Venture Too Deep 371b1d.yaml' +- !include 'Bag Artifact Deck Setup 4285a6/CardCustom Undead Servant 73a303.yaml' +- !include 'Bag Artifact Deck Setup 4285a6/Deck Artifact Expansion Custom Upgrades + f5bbf3.yaml' +- !include 'Bag Artifact Deck Setup 4285a6/Deck Artifact Deck 485770.yaml' +Description: Shuffle the Artifact deck!!! Remember to shuffle the 2nd copy of Venture + Too Deep into the Encounter deck when the Agenda advances. +DragSelectable: true +GMNotes: '' +GUID: 4285a6 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Bag Artifact Deck Setup 4285a6.ttslua' +LuaScriptState: '{"ml":{"371b1d":{"lock":false,"pos":{"x":-12.8236,"y":1.6091,"z":-13.1427},"rot":{"x":359.9201,"y":269.9999,"z":0.0168}},"485770":{"lock":false,"pos":{"x":-17.12,"y":1.9154,"z":-15.28},"rot":{"x":359.9201,"y":270,"z":180.0168}},"52b042":{"lock":false,"pos":{"x":-3.9277,"y":1.6023,"z":5.7572},"rot":{"x":359.9197,"y":270,"z":180.0168}},"73a303":{"lock":false,"pos":{"x":-12.8236,"y":1.6084,"z":-15.4302},"rot":{"x":359.9201,"y":269.9993,"z":0.0168}},"f5bbf3":{"lock":false,"pos":{"x":-12.8236,"y":1.6439,"z":-17.7177},"rot":{"x":359.9201,"y":269.9995,"z":0.0168}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Bag +Nickname: Artifact Deck Setup +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.8 + posY: 1.12 + posZ: -46.61 + rotX: 359.98 + rotY: 90.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Undead Servant 73a303.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Undead Servant 73a303.yaml new file mode 100644 index 000000000..b8fc9ea5c --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Undead Servant 73a303.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 567400 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5674': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648843044116295865/1225F7BEE4E51D74F13F566A9BD39D04DB364F46/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262664441/8A77C3073A6E546268B019BC45760A32F7F87691/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: At Your Service +DragSelectable: true +GMNotes: '' +GUID: 73a303 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Undead Servant +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -12.82 + posY: 1.61 + posZ: -15.43 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Venture Too Deep 371b1d.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Venture Too Deep 371b1d.yaml new file mode 100644 index 000000000..914e24e52 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Venture Too Deep 371b1d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 574100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5741': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648843119262549591/A372A735C4BCA35FE128AD9388BD116ECDC282F0/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844222670783789/7A1168CAECAB821F2E6869E991300B2B1B29DB91/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 371b1d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Venture Too Deep +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -12.82 + posY: 1.61 + posZ: -13.14 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Venture Too Deep 52b042.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Venture Too Deep 52b042.yaml new file mode 100644 index 000000000..2f343e3a1 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/CardCustom Venture Too Deep 52b042.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 574100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5741': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648843119262549591/A372A735C4BCA35FE128AD9388BD116ECDC282F0/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844222670783789/7A1168CAECAB821F2E6869E991300B2B1B29DB91/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 52b042 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Venture Too Deep +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -3.93 + posY: 1.6 + posZ: 5.76 + rotX: 359.92 + rotY: 270.0 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/Deck Artifact Deck 485770.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/Deck Artifact Deck 485770.yaml new file mode 100644 index 000000000..d239bf7f3 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/Deck Artifact Deck 485770.yaml @@ -0,0 +1,3332 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 566200 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5662': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262663007/D5E780E0580C484DCC94F3D329BDED336CFDCCA5/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 20886f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Zanthu Tablets + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.17828369 + posY: 1.96391785 + posZ: -56.5773621 + rotX: 0.0124883745 + rotY: 269.999817 + rotZ: 180.293015 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 572500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5725': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843527264911752/EAA3379883648790126BAF7927B346DF35638EE1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 85fb98 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Yithian Rifle + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.68207836 + posY: 1.94723761 + posZ: -57.0084038 + rotX: 0.0124870772 + rotY: 270.0 + rotZ: 180.009949 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 573800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5720': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387894047491/41E3A01AC523BB07000267CC2F05BC128D439C0E/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 3efc48 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Warding Statue + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.299603 + posY: 1.9386636 + posZ: -57.52431 + rotX: 0.0167916473 + rotY: 270.00058 + rotZ: 179.699081 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 4400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '44': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716486422/2B9C4CADFC92F3B4CE92CA4077E7B8D4097571CD/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 79c999 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Vach-Viraj Chant + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.233523 + posY: 1.92914307 + posZ: -56.8195763 + rotX: 0.0166820437 + rotY: 270.0 + rotZ: 179.700012 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 4300 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '43': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716485887/EEF7E1DF5BA787AAD06B90D03207C42664BCCCBD/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: f2136f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Twin Scepters + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.4272747 + posY: 1.9137156 + posZ: -56.79279 + rotX: 0.016664695 + rotY: 269.999634 + rotZ: 180.207092 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 4200 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '42': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716485233/586467EFE08A0568CFA4C5131C80132C58ACF7C8/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: eb01e7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: True Magick + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.66880274 + posY: 1.93190253 + posZ: -56.3255463 + rotX: 0.01665467 + rotY: 269.999725 + rotZ: 176.990555 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 4100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '41': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716484604/DB43500B56C050A58C259D2F3A7EDB6BF9972B80/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d385ab + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Tikkoun Elixir + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.57784748 + posY: 1.97772682 + posZ: -56.8453827 + rotX: 0.01663706 + rotY: 269.999542 + rotZ: 175.2212 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 566100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5661': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262659325/62067D1288E20DC38E6F3A8D2F2AFEE1BF22D88C/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0ecb08 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: T'tka Halot + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.44292259 + posY: 1.97532284 + posZ: -57.00924 + rotX: 0.0166539215 + rotY: 270.0004 + rotZ: 175.8218 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 571500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5715': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893998749/4D4F7506C8FA20F195E566574299E66847A27B45/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c822e8 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Sword of Y'ha-Talla + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.349844 + posY: 1.9656148 + posZ: -57.25757 + rotX: 0.01665435 + rotY: 270.0004 + rotZ: 175.82074 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 571400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5714': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893997624/80205D3DA21AC285F6B95F0612DB562E24FBBE7E/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 6cec68 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Sword of Saint Jerome + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.51922846 + posY: 1.89135337 + posZ: -56.814724 + rotX: 0.0171566345 + rotY: 270.0039 + rotZ: 178.243484 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 571300 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5713': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893996032/DEBC7A489B24AD0EABD55FB96D4A9520DD55CDBA/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d40c0b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Sword of Glory + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.345117 + posY: 2.25873113 + posZ: -56.6468353 + rotX: 0.0152714495 + rotY: 269.9975 + rotZ: 152.726044 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 570500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5705': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893988824/8F8A25CC071F8F3B547A1EC5C2A935720C02154D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0dd5e4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Summoning Glass + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.61802435 + posY: 1.85192537 + posZ: -57.0366669 + rotX: 0.0166485887 + rotY: 270.0 + rotZ: 180.078491 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 568400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5684': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262588786/E7B8841B649AC41D030D091DE5FC9219F611D884/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: cdf84b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Spirit Vessel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.541803 + posY: 1.85302293 + posZ: -56.928688 + rotX: 0.0166528281 + rotY: 269.9998 + rotZ: 180.767929 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 568500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5685': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262586026/90725ACACF7E3ACF6D5EA36FEBA35AD9A8BDA76D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 33e171 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Soul Gem + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.979733 + posY: 1.91027653 + posZ: -56.84795 + rotX: 0.0166334324 + rotY: 269.999542 + rotZ: 175.22287 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 570400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5704': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893988172/2F3D5807945CE7828AF4005F26E72CABD9264DB0/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: acda4b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Seven Cryptical Books of Hsan + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.828375 + posY: 1.8298682 + posZ: -57.29174 + rotX: 0.0166507475 + rotY: 270.000031 + rotZ: 180.621765 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 3700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '37': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716473018/2CB7D314648C35BBC9E4268644673C729B92C743/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 7329e9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Serpent Crown + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.955037 + posY: 1.898116 + posZ: -57.3629456 + rotX: 0.0166539215 + rotY: 270.0004 + rotZ: 175.8179 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 565900 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5659': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262651984/8D0815CA90F93BE97B5F8190E89CD9469D6A6E4C/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: ec96d8 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Scales of Thoth + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.83137 + posY: 1.80345261 + posZ: -57.3267975 + rotX: 0.0166483223 + rotY: 270.0 + rotZ: 180.078491 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 3500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '35': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716471953/79F16B6D12ACA7B67C68075B6934E8AEB397FBA1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 145c77 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Satchel of the Void + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.750715 + posY: 1.80599821 + posZ: -57.26105 + rotX: 0.0166479051 + rotY: 270.000061 + rotZ: 179.653091 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 565800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5658': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262650629/27CE5FD0D428A0D1A605A406CF7CB1AC6BA59487/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 9e2bba + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Ruby of R'yleh + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.86378145 + posY: 1.92985189 + posZ: -56.9010658 + rotX: 0.0165504031 + rotY: 269.999146 + rotZ: 171.989868 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 565700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5657': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262648097/C5B09AF7F8B01F084CF0A6B26B32180C64041C5B/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b9fede + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Pentacle of Planes + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.713175 + posY: 1.792998 + posZ: -56.1270523 + rotX: 0.016634712 + rotY: 269.9996 + rotZ: 176.183441 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 573900 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5724': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843527264910041/516CECEBCA23D760DB606399191920AE8FA52348/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c96549 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Nacaal Key + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.718298 + posY: 1.771163 + posZ: -56.6901474 + rotX: 0.0124881342 + rotY: 269.9998 + rotZ: 180.293274 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 565500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5655': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262646703/312448B4910E493905F076FE0CF4B43536BCA7AF/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 82a4ec + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Milk of Shub-Niggurath + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.343191 + posY: 1.98616779 + posZ: -56.47084 + rotX: 0.01579652 + rotY: 269.997925 + rotZ: 158.516678 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 565400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5654': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262645243/AAA839DA39444BFA2F8CD09B0A46D2BBF9EB73A6/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 6459b1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Mi-Go Brain Case + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.282863 + posY: 1.97118425 + posZ: -56.75112 + rotX: 0.0162660964 + rotY: 269.998535 + rotZ: 165.72142 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 3000 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '30': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716466433/924D93E4D0A40A5A719280D55BA70C0219DF85D6/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b7554 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Massa di Requiem per Shuggay + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.25784874 + posY: 1.748359 + posZ: -57.27796 + rotX: 0.0166477319 + rotY: 270.000061 + rotZ: 179.65506 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 570300 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5703': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893987470/2183DBCA1F2FA439826BC065CA6CC2B87FF63128/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: cf40b3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Mask of Wisdom + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.083265 + posY: 1.72688818 + posZ: -57.15703 + rotX: 0.0165874474 + rotY: 270.000336 + rotZ: 179.699188 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 570200 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5702': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893986717/DE055A39A7C0D31D60B8A8989C508567B771AA81/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 73d099 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Mask of Vice + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.32696772 + posY: 1.71142876 + posZ: -57.0711937 + rotX: 0.01669703 + rotY: 269.9996 + rotZ: 180.207 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 565300 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5653': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262642807/BD2EFE7ED85B1BE1108F9C64EBEBC753C379B7D9/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 7eeabe + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Mask of the Watcher + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.30887842 + posY: 1.71572053 + posZ: -57.092205 + rotX: 0.016651921 + rotY: 270.000031 + rotZ: 180.71431 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 2800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '28': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716464745/8976110685AF0055C7A33FA57F9179E2DA2E6764/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 16ecb9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Mask of Sthenelus + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.394775 + posY: 1.697944 + posZ: -56.4938126 + rotX: 0.0166483987 + rotY: 269.999969 + rotZ: 180.078491 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 2700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '27': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716464161/82493C4F21D4F6B0EB05E731ECDADCD79FA582F8/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 84ce3c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: '' + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.307485 + posY: 1.76239932 + posZ: -56.623745 + rotX: 0.0166046172 + rotY: 269.99942 + rotZ: 174.455246 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 568700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5687': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262583713/B76861677163E419BCA8CF2AAEA3636184924748/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: '586429' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Lamp of Alhazred + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.08889532 + posY: 1.67869985 + posZ: -57.3307724 + rotX: 0.01675755 + rotY: 270.000671 + rotZ: 179.699066 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 569900 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5699': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893972494/874EBBE8EF7121D2CD0101BF234C4E0FB0718C8E/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: cb7f0e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Key of Tawil At-Umr + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.17985773 + posY: 1.66920316 + posZ: -56.67819 + rotX: 0.0166628864 + rotY: 270.0 + rotZ: 179.699921 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 565200 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5652': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262640037/AAB59EB8B5798881585C823A9340A58F10CFA83E/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 059d83 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Key to Carcosa + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.27080774 + posY: 1.66819215 + posZ: -57.1905861 + rotX: 0.0166500267 + rotY: 270.000031 + rotZ: 180.784729 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 565100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5651': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262638674/46358B7D8B9D5B327D34FA550D4E6397E4DB474C/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b259dc + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Hyperborean Crystal + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.20630836 + posY: 1.66171491 + posZ: -57.2402458 + rotX: 0.0166476518 + rotY: 270.000061 + rotZ: 179.654419 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 565000 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5650': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262637340/5B82A0E1128D1A6ED45F5FB2849B5B8E78884793/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 2c73c3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Heart of Winter + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.803461 + posY: 1.64656818 + posZ: -57.2306938 + rotX: 0.01665136 + rotY: 270.0 + rotZ: 180.578186 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 569800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5698': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893971840/F12B96E27E3187915791DBC0F80FD4A2AC1642D1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 80b7f6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Gruesome Talisman + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.857058 + posY: 1.63010359 + posZ: -57.507103 + rotX: 0.0166477934 + rotY: 270.0 + rotZ: 180.078491 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 561500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5615': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843044116306025/7C506D922E72FEA06A45625EDC856C89F6DD1F9D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 9b7642 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Glass of Mortlan + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.38145638 + posY: 1.61526978 + posZ: -56.6304 + rotX: 0.0166763477 + rotY: 269.999634 + rotZ: 180.207138 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 564900 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5649': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262635212/5361F4FED7A6048202A8BF5BBE9AA3599D927D2A/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 18e329 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: G'harne Fragments + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.00718069 + posY: 1.623103 + posZ: -57.6592865 + rotX: 0.01664245 + rotY: 270.000122 + rotZ: 181.163055 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 2100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '21': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716449859/30A0CAB9E97421E6472177E94EFEAEC689F68A90/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 60e064 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Flute of the Outer Gods + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.110788 + posY: 1.618306 + posZ: -57.29121 + rotX: 0.0166452788 + rotY: 270.000122 + rotZ: 181.181549 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 568800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5688': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262582928/6205AA7AF120D6858E951A22EB67F313EF12F138/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d887f4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Fire of Asshuranipal + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.0518713 + posY: 1.60603833 + posZ: -57.5363541 + rotX: 0.0166427158 + rotY: 270.000122 + rotZ: 181.188309 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 566300 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5663': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262632739/DBA6F14362E5AB3F80BE33555EF4FFD3BC83FD47/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: '872295' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Fetch Stick + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.34655333 + posY: 1.60320175 + posZ: -56.7449532 + rotX: 0.0168427136 + rotY: 270.0008 + rotZ: 178.123077 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 569700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5697': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893971247/11A1E0CED23286A0E8ACB4375BDD5637B61F7926/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: f2d241 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Eye of Light and Darkness + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.739712 + posY: 1.5841589 + posZ: -56.90091 + rotX: 0.01664904 + rotY: 269.999878 + rotZ: 180.616348 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 574000 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5723': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843527264907942/A448622E8647F92D8AD9E36495D959AEA19FCBF1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5e3f39 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Execration Text + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.67878437 + posY: 1.56161392 + posZ: -56.9303055 + rotX: 0.0210431144 + rotY: 269.999176 + rotZ: 180.01738 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 566400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5664': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262629067/B567241C9298ADCF2C2C9B4C149532AE322E70F1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0098c9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Elixir of Life + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.57509327 + posY: 1.55222571 + posZ: -57.5716667 + rotX: 0.0166473091 + rotY: 270.0 + rotZ: 180.006912 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 1800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '18': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716447507/7635FEBD2E10F3419CD42F922A133DFF2CEA87E9/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: acd7c2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Eldtown Shards + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 7.045392 + posY: 1.53835988 + posZ: -56.965332 + rotX: 0.0164535455 + rotY: 270.002319 + rotZ: 180.206833 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 1700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '17': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716446750/B2EC91B8A99D7AB69093DB680C6F105E3838493A/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d41def + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Elder Key + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.62169838 + posY: 1.54186916 + posZ: -57.3702164 + rotX: 0.0166514684 + rotY: 270.000031 + rotZ: 180.808517 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 566500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5665': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262627432/40B181731566AFBF4CE860DC417648B7776D5CCA/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b82063 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Dragon Idol + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.321157 + posY: 1.53804708 + posZ: -57.01776 + rotX: 0.016650321 + rotY: 270.000061 + rotZ: 180.8891 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 566600 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5666': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262625587/CFAD075F27F26398C563DE670D08E12AE6BD0244/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d37e33 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Dhol Chants + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.29672861 + posY: 1.52941394 + posZ: -56.5287247 + rotX: 0.0166489333 + rotY: 269.999878 + rotZ: 180.754623 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 566700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5667': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716444889/30DF30BED43A4BABA96C838D7E581D70BDED4DFD/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 3689b4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Cursed Sphere + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.26292229 + posY: 1.50934434 + posZ: -57.0599136 + rotX: 0.0166525878 + rotY: 270.0 + rotZ: 180.477478 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 566800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5668': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262621883/9D8AF9D1E6E21794629A03A7905100CE6D778D14/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0444e5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Cultes des Goules + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.97451 + posY: 1.50137353 + posZ: -57.1199532 + rotX: 0.0166510139 + rotY: 270.0 + rotZ: 180.602859 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 566900 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5669': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262605436/526C05F1712860AE218093E67E49398D8098A634/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 61553a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Crystal of the Elder Things + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.19403934 + posY: 1.5025171 + posZ: -56.8483925 + rotX: 0.01664944 + rotY: 269.999817 + rotZ: 180.90741 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 567000 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5670': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716443822/066E3DA07F9796F59BF1EBFC34B4443930093DE2/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 76e5c1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Crux of Cykranosh + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.327899 + posY: 1.48166418 + posZ: -56.79257 + rotX: 0.0166505072 + rotY: 269.999817 + rotZ: 180.447815 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 569500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5695': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893969794/FC8AA00E50F60F7ED385D4C3859D8B4D2E66FFA4/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: df86ca + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Chime of Ra + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.37472343 + posY: 1.46427143 + posZ: -56.49167 + rotX: 0.01687685 + rotY: 269.999634 + rotZ: 179.699081 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 572200 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5722': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843527264905413/DE70BE81E7C0A0246BD12DF625593BF51D978618/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: de39db + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Cabala of Saboth + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.745525 + posY: 1.50077009 + posZ: -57.4764938 + rotX: 0.0124170706 + rotY: 270.0008 + rotZ: 183.759048 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 569300 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5693': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893968626/2FF16B7D4579BE0E37CB0564E0E8B350126A9F64/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 76ac29 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Brazier of Souls + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.90707064 + posY: 1.45786452 + posZ: -57.05452 + rotX: 0.01664752 + rotY: 270.000031 + rotZ: 180.553955 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 567100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5671': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843044116294676/47EE1B5E219B19203D9F4DDEAEACBD30FBD31149/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 456be9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: '' + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.89691973 + posY: 1.4430604 + posZ: -56.7326355 + rotX: 0.01664992 + rotY: 269.999817 + rotZ: 180.449692 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 569200 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5692': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893967658/88A89E2D3AD58DE819EC81B84966F50734A71CDA/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 27dd24 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Book of the Believer + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.9081893 + posY: 1.43340778 + posZ: -54.9475 + rotX: 0.0125092249 + rotY: 270.0004 + rotZ: 179.544357 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 569100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5691': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893966903/3B5859CF4AC56010B80A467F1C8D2985397990A7/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5fd583 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Book of Dzyan + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.2371707 + posY: 1.42365849 + posZ: -54.7190781 + rotX: 0.01249487 + rotY: 270.0004 + rotZ: 179.542145 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 567200 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5672': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716443363/393AC309ECB96AF6294642A7AAFD3A2D24BFEFBC/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 64cfd0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Bone Pipes + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.34050941 + posY: 1.41437817 + posZ: -54.36135 + rotX: 0.016651094 + rotY: 269.9998 + rotZ: 180.528946 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 567300 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5673': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716442748/B000EC1798BD18E5E5ED28B0A6F3CA85E41AA44D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d2a5ea + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Black Fan + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.23521948 + posY: 1.3939966 + posZ: -54.74934 + rotX: 0.01669403 + rotY: 269.99942 + rotZ: 180.207214 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 569000 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5690': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893966213/5E9570D6D27488EC71B6D2894A5248914285BC53/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: fbc218 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Astral Mirror + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.32469845 + posY: 1.39768672 + posZ: -54.3620262 + rotX: 0.0166481063 + rotY: 269.999847 + rotZ: 178.282074 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 568900 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5689': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262581866/1D5FD82836496F98ADB72747DB61E6DA59CB8606/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: dad88d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Ancient Spear + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.3261404 + posY: 1.325438 + posZ: -54.38948 + rotX: 0.0208081063 + rotY: 269.999939 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '17': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716446750/B2EC91B8A99D7AB69093DB680C6F105E3838493A/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '18': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716447507/7635FEBD2E10F3419CD42F922A133DFF2CEA87E9/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '21': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716449859/30A0CAB9E97421E6472177E94EFEAEC689F68A90/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '27': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716464161/82493C4F21D4F6B0EB05E731ECDADCD79FA582F8/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '28': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716464745/8976110685AF0055C7A33FA57F9179E2DA2E6764/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '30': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716466433/924D93E4D0A40A5A719280D55BA70C0219DF85D6/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '35': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716471953/79F16B6D12ACA7B67C68075B6934E8AEB397FBA1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '37': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716473018/2CB7D314648C35BBC9E4268644673C729B92C743/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '41': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716484604/DB43500B56C050A58C259D2F3A7EDB6BF9972B80/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '42': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716485233/586467EFE08A0568CFA4C5131C80132C58ACF7C8/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '43': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716485887/EEF7E1DF5BA787AAD06B90D03207C42664BCCCBD/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '44': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716486422/2B9C4CADFC92F3B4CE92CA4077E7B8D4097571CD/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5615': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843044116306025/7C506D922E72FEA06A45625EDC856C89F6DD1F9D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5649': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262635212/5361F4FED7A6048202A8BF5BBE9AA3599D927D2A/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5650': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262637340/5B82A0E1128D1A6ED45F5FB2849B5B8E78884793/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5651': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262638674/46358B7D8B9D5B327D34FA550D4E6397E4DB474C/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5652': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262640037/AAB59EB8B5798881585C823A9340A58F10CFA83E/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5653': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262642807/BD2EFE7ED85B1BE1108F9C64EBEBC753C379B7D9/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5654': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262645243/AAA839DA39444BFA2F8CD09B0A46D2BBF9EB73A6/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5655': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262646703/312448B4910E493905F076FE0CF4B43536BCA7AF/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5657': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262648097/C5B09AF7F8B01F084CF0A6B26B32180C64041C5B/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5658': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262650629/27CE5FD0D428A0D1A605A406CF7CB1AC6BA59487/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5659': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262651984/8D0815CA90F93BE97B5F8190E89CD9469D6A6E4C/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5661': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262659325/62067D1288E20DC38E6F3A8D2F2AFEE1BF22D88C/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5662': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262663007/D5E780E0580C484DCC94F3D329BDED336CFDCCA5/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5663': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262632739/DBA6F14362E5AB3F80BE33555EF4FFD3BC83FD47/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5664': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262629067/B567241C9298ADCF2C2C9B4C149532AE322E70F1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5665': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262627432/40B181731566AFBF4CE860DC417648B7776D5CCA/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5666': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262625587/CFAD075F27F26398C563DE670D08E12AE6BD0244/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5667': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716444889/30DF30BED43A4BABA96C838D7E581D70BDED4DFD/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5668': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262621883/9D8AF9D1E6E21794629A03A7905100CE6D778D14/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5669': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262605436/526C05F1712860AE218093E67E49398D8098A634/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5670': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716443822/066E3DA07F9796F59BF1EBFC34B4443930093DE2/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5671': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843044116294676/47EE1B5E219B19203D9F4DDEAEACBD30FBD31149/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5672': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716443363/393AC309ECB96AF6294642A7AAFD3A2D24BFEFBC/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5673': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716442748/B000EC1798BD18E5E5ED28B0A6F3CA85E41AA44D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5684': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262588786/E7B8841B649AC41D030D091DE5FC9219F611D884/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5685': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262586026/90725ACACF7E3ACF6D5EA36FEBA35AD9A8BDA76D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5687': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262583713/B76861677163E419BCA8CF2AAEA3636184924748/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5688': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262582928/6205AA7AF120D6858E951A22EB67F313EF12F138/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5689': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262581866/1D5FD82836496F98ADB72747DB61E6DA59CB8606/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5690': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893966213/5E9570D6D27488EC71B6D2894A5248914285BC53/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5691': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893966903/3B5859CF4AC56010B80A467F1C8D2985397990A7/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5692': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893967658/88A89E2D3AD58DE819EC81B84966F50734A71CDA/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5693': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893968626/2FF16B7D4579BE0E37CB0564E0E8B350126A9F64/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5695': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893969794/FC8AA00E50F60F7ED385D4C3859D8B4D2E66FFA4/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5697': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893971247/11A1E0CED23286A0E8ACB4375BDD5637B61F7926/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5698': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893971840/F12B96E27E3187915791DBC0F80FD4A2AC1642D1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5699': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893972494/874EBBE8EF7121D2CD0101BF234C4E0FB0718C8E/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5702': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893986717/DE055A39A7C0D31D60B8A8989C508567B771AA81/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5703': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893987470/2183DBCA1F2FA439826BC065CA6CC2B87FF63128/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5704': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893988172/2F3D5807945CE7828AF4005F26E72CABD9264DB0/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5705': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893988824/8F8A25CC071F8F3B547A1EC5C2A935720C02154D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5713': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893996032/DEBC7A489B24AD0EABD55FB96D4A9520DD55CDBA/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5714': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893997624/80205D3DA21AC285F6B95F0612DB562E24FBBE7E/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5715': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893998749/4D4F7506C8FA20F195E566574299E66847A27B45/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5722': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843527264905413/DE70BE81E7C0A0246BD12DF625593BF51D978618/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5725': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843527264911752/EAA3379883648790126BAF7927B346DF35638EE1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5738': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387894047491/41E3A01AC523BB07000267CC2F05BC128D439C0E/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5739': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843527264910041/516CECEBCA23D760DB606399191920AE8FA52348/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5740': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843527264907942/A448622E8647F92D8AD9E36495D959AEA19FCBF1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +DeckIDs: +- 566200 +- 572500 +- 573800 +- 4400 +- 4300 +- 4200 +- 4100 +- 566100 +- 571500 +- 571400 +- 571300 +- 570500 +- 568400 +- 568500 +- 570400 +- 3700 +- 565900 +- 3500 +- 565800 +- 565700 +- 573900 +- 565500 +- 565400 +- 3000 +- 570300 +- 570200 +- 565300 +- 2800 +- 2700 +- 568700 +- 569900 +- 565200 +- 565100 +- 565000 +- 569800 +- 561500 +- 564900 +- 2100 +- 568800 +- 566300 +- 569700 +- 574000 +- 566400 +- 1800 +- 1700 +- 566500 +- 566600 +- 566700 +- 566800 +- 566900 +- 567000 +- 569500 +- 572200 +- 569300 +- 567100 +- 569200 +- 569100 +- 567200 +- 567300 +- 569000 +- 568900 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '485770' +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Artifact Deck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 1.92 + posZ: -15.28 + rotX: 359.92 + rotY: 270.0 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/Deck Artifact Expansion Custom Upgrades f5bbf3.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/Deck Artifact Expansion Custom Upgrades f5bbf3.yaml new file mode 100644 index 000000000..485e0e81e --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6/Deck Artifact Expansion Custom Upgrades f5bbf3.yaml @@ -0,0 +1,362 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 567500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5629': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262539748/9F8A7AC40F15649491F06849ACA6043308E42E73/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: a4bebf + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Bodyguard (1) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 3.872638 + posY: 0.973604858 + posZ: -1.51286876 + rotX: -8.282259e-06 + rotY: 270.206848 + rotZ: -1.04842011e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 567600 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5627': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262537153/9AF3FD6C7FE18320760C4DEE3829C5F6BFFC9722/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: db6c4a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Edward Jayce (2) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 4.2868166 + posY: 0.973605633 + posZ: -4.21078 + rotX: -1.020946e-05 + rotY: 270.894836 + rotZ: -2.22341969e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 567700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5630': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262540664/29762CF8A88CCB8FC747DB3066397E49719221A1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 53c975 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: '"Not leaving without it!" (1)' + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 7.30070066 + posY: 0.9736043 + posZ: -1.76559436 + rotX: -1.52949524e-05 + rotY: 269.985535 + rotZ: -2.20619258e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 567800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5632': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262556648/AD8E83E39DCE0167FFADC1185F72FFD0F6623299/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b67664 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Museum Curator (2) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 7.78077 + posY: 0.9736057 + posZ: -5.81979752 + rotX: -9.644529e-06 + rotY: 269.5232 + rotZ: -2.29279485e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 568200 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5682': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648843119262549591/A372A735C4BCA35FE128AD9388BD116ECDC282F0/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893956505/639097ACA7E95969B49708037590825EF678B543/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 298bfa + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Artifacts Discovered! + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -12.9118662 + posY: 1.70044124 + posZ: -18.1225777 + rotX: 359.9201 + rotY: 269.999451 + rotZ: 0.01684466 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 568100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5681': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893955275/A167C52F314D3604E97DCF46B4937BE40438B3D5/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 4774b4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Perilous Expedition (1) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -13.1955223 + posY: 1.71049356 + posZ: -17.8979759 + rotX: 359.9201 + rotY: 269.999847 + rotZ: 0.0168440416 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '5675': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262539748/9F8A7AC40F15649491F06849ACA6043308E42E73/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5676': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262537153/9AF3FD6C7FE18320760C4DEE3829C5F6BFFC9722/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5677': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262540664/29762CF8A88CCB8FC747DB3066397E49719221A1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5678': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262556648/AD8E83E39DCE0167FFADC1185F72FFD0F6623299/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5681': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893955275/A167C52F314D3604E97DCF46B4937BE40438B3D5/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5682': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648843119262549591/A372A735C4BCA35FE128AD9388BD116ECDC282F0/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843387893956505/639097ACA7E95969B49708037590825EF678B543/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +DeckIDs: +- 567500 +- 567600 +- 567700 +- 567800 +- 568200 +- 568100 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f5bbf3 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Artifact Expansion Custom Upgrades +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -12.82 + posY: 1.64 + posZ: -17.72 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Agatha Crane Mini 5f4b38.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Agatha Crane Mini 5f4b38.yaml new file mode 100644 index 000000000..0fff7f141 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Agatha Crane Mini 5f4b38.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 572100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5721': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716416034/A114B5EF486C4EEB5BD0796D7309A0EF4B6E0DB2/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716415837/F352200A614F9893E102BBD40763FFA68B741C26/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5f4b38 +Grid: false +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Agatha Crane Mini +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -19.29 + posY: 1.31 + posZ: -76.94 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.6 + scaleY: 1.0 + scaleZ: 0.6 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Agatha Crane b564f3.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Agatha Crane b564f3.yaml new file mode 100644 index 000000000..6a30a0560 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Agatha Crane b564f3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 573600 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5736': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648843250610964103/E148DCE882FBC4A6B42980C24B15D30EEEC3E92E/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962511493/52C0E5D7B5F58144E9D3CE7F0DA1EE62350D765C/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b564f3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Agatha Crane +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -22.62 + posY: 1.31 + posZ: -76.95 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.78 + scaleY: 1.0 + scaleZ: 0.78 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Daniela Reyes Mini 750b6f.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Daniela Reyes Mini 750b6f.yaml new file mode 100644 index 000000000..1eb9f925a --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Daniela Reyes Mini 750b6f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 561100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5611': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1664605116697406140/78FB1A8C88EEF50CFB59E73A47856D1CB5A1C4E8/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1664605116697405898/759D878C3662D9A2602A7F1F10A0E57F3BC67DCB/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 750b6f +Grid: false +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Daniela Reyes Mini +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -19.3 + posY: 1.32 + posZ: -53.44 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.6 + scaleY: 1.0 + scaleZ: 0.6 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Daniela Reyes a8246c.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Daniela Reyes a8246c.yaml new file mode 100644 index 000000000..1d3483931 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Daniela Reyes a8246c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 573100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5731': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648844021962498344/50460433F7971BAE750796F8481D529F9C88421F/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962498092/9BFF0C651FC53C19991AA16CC45C85945BCF213B/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a8246c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Daniela Reyes +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -22.61 + posY: 1.32 + posZ: -53.44 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.78 + scaleY: 1.0 + scaleZ: 0.78 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Darrell Simmons Mini 6d9f16.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Darrell Simmons Mini 6d9f16.yaml new file mode 100644 index 000000000..4e3d0fa06 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Darrell Simmons Mini 6d9f16.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 561300 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5613': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716422423/F71B773F591BE53173DFB1E487C2BF405B198EA3/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716422323/3C3D858F97453CB073AB72CA4E8CA784F2E3CCA8/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6d9f16 +Grid: false +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Darrell Simmons Mini +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -19.3 + posY: 1.31 + posZ: -84.82 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.6 + scaleY: 1.0 + scaleZ: 0.6 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Darrell Simmons dced09.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Darrell Simmons dced09.yaml new file mode 100644 index 000000000..b2e04aac2 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Darrell Simmons dced09.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 573700 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5737': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716421689/FCD4905B16CB9B4D0F7822DB097057DD72A70184/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843527264915379/DE977F67AACA80ADFF1A256CBE391759C59AD314/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dced09 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Darrell Simmons +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -22.62 + posY: 1.31 + posZ: -84.82 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.78 + scaleY: 1.0 + scaleZ: 0.78 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Kate Winthrop 13a465.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Kate Winthrop 13a465.yaml new file mode 100644 index 000000000..0d82b90f0 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Kate Winthrop 13a465.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 564000 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5640': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716377574/BEF1667082645464554356F5012277D451679B62/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716385955/51B519E68A355D8CB26059651AE415EFAFFC856B/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 13a465 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Kate Winthrop +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -22.62 + posY: 1.31 + posZ: -61.24 + rotX: 0.02 + rotY: 270.02 + rotZ: 0.02 + scaleX: 0.78 + scaleY: 1.0 + scaleZ: 0.78 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Kate Winthrop Mini f1896b.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Kate Winthrop Mini f1896b.yaml new file mode 100644 index 000000000..f24d397ca --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Kate Winthrop Mini f1896b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 200 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716378517/85344DF420BE62FE93372685A1B2678309BD97CB/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716378227/5E50966C8015D348AE52C068B4139B6BD36E401B/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f1896b +Grid: false +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Kate Winthrop Mini +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -19.3 + posY: 1.31 + posZ: -61.23 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.6 + scaleY: 1.0 + scaleZ: 0.6 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Monterey Jack Mini 0e3906.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Monterey Jack Mini 0e3906.yaml new file mode 100644 index 000000000..093986666 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Monterey Jack Mini 0e3906.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 573000 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5730': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716430629/E42A404CE0C63FA9777FBCF1DB111DAE61CA09B5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716430341/BE5651C47A29AF24E7978FE4FC8DBE8266CFD4C6/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0e3906 +Grid: false +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Monterey Jack Mini +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -19.3 + posY: 1.31 + posZ: -69.06 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.6 + scaleY: 1.0 + scaleZ: 0.6 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Monterey Jack b77c53.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Monterey Jack b77c53.yaml new file mode 100644 index 000000000..6e971054c --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/CardCustom Monterey Jack b77c53.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 573500 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5735': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648844021962516100/423DE9875511E23BDE6C771631908CEF1F5A94F2/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716429101/DB16FB145EEA54AA502C0E11E6D21EA4D98AA809/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b77c53 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Monterey Jack +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -22.62 + posY: 1.31 + posZ: -69.08 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.78 + scaleY: 1.0 + scaleZ: 0.78 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 41bfc7.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 41bfc7.yaml new file mode 100644 index 000000000..c282064d1 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 41bfc7.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516265983/F50A6212D30C442429ED22B8CC8FD24D4CB76A2A/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 41bfc7 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Survivor turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.66 + posY: 1.36 + posZ: -61.23 + rotX: 0.02 + rotY: 270.01 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Arkhamdb bag b85d6d.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 4ad11b.yaml similarity index 52% rename from unpacked/Custom_Model_Bag Arkhamdb bag b85d6d.yaml rename to unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 4ad11b.yaml index 3dcf059f4..a4c18e103 100644 --- a/unpacked/Custom_Model_Bag Arkhamdb bag b85d6d.yaml +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 4ad11b.yaml @@ -3,46 +3,41 @@ ColorDiffuse: b: 1.0 g: 1.0 r: 1.0 -ContainedObjects: -- !include 'Custom_Model_Bag Arkhamdb bag b85d6d/Deck All Weaknesses dd549a.yaml' -- !include 'Custom_Model_Bag Arkhamdb bag b85d6d/Deck 4141fb.yaml' CustomMesh: CastShadows: true ColliderURL: '' Convex: true - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516372129/745E93331A66C547C69B39EAD5044A72B8D732D3/ + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516557267/757887224F6C37104CDFFE241FAD09B57117D670/ MaterialIndex: 3 MeshURL: https://pastebin.com/raw/ALrYhQGb NormalURL: '' - TypeIndex: 6 + TypeIndex: 4 Description: '' DragSelectable: true GMNotes: '' -GUID: b85d6d +GUID: 4ad11b Grid: true GridProjection: false Hands: false HideWhenFaceDown: false IgnoreFoW: false -Locked: true -LuaScript: !include 'Custom_Model_Bag Arkhamdb bag b85d6d.ttslua' +Locked: false +LuaScript: '' LuaScriptState: '' -MaterialIndex: -1 MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Arkhamdb bag +Name: Custom_Model +Nickname: Survivor turn token Snap: true Sticky: true Tooltip: false Transform: - posX: -62.94 - posY: 1.23 - posZ: -62.48 + posX: -16.64 + posY: 1.36 + posZ: -76.95 rotX: 0.02 rotY: 270.0 rotZ: 0.02 - scaleX: 1.2 - scaleY: 1.0 - scaleZ: 1.2 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 6330da.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 6330da.yaml new file mode 100644 index 000000000..96072b1f0 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 6330da.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516201848/72B3B9E2B59F25FEC82412AC22245D03655A4558/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6330da +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Survivor turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.36 + posZ: -54.62 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 9e80b9.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 9e80b9.yaml new file mode 100644 index 000000000..735fe8f42 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token 9e80b9.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516201848/72B3B9E2B59F25FEC82412AC22245D03655A4558/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 9e80b9 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Survivor turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.36 + posZ: -53.39 + rotX: 0.02 + rotY: 269.98 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token bde4a6.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token bde4a6.yaml new file mode 100644 index 000000000..edf3d7131 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token bde4a6.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516201848/72B3B9E2B59F25FEC82412AC22245D03655A4558/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: bde4a6 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Survivor turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.36 + posZ: -52.15 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token d6fdbf.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token d6fdbf.yaml new file mode 100644 index 000000000..7e3087481 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token d6fdbf.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516265983/F50A6212D30C442429ED22B8CC8FD24D4CB76A2A/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d6fdbf +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Survivor turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.36 + posZ: -62.46 + rotX: 0.02 + rotY: 269.97 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token d9fb86.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token d9fb86.yaml new file mode 100644 index 000000000..97345dc9e --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token d9fb86.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516557267/757887224F6C37104CDFFE241FAD09B57117D670/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d9fb86 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Survivor turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.36 + posZ: -78.18 + rotX: 0.02 + rotY: 270.01 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token de216f.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token de216f.yaml new file mode 100644 index 000000000..de862939c --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token de216f.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516265983/F50A6212D30C442429ED22B8CC8FD24D4CB76A2A/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: de216f +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Survivor turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.66 + posY: 1.36 + posZ: -60.0 + rotX: 0.02 + rotY: 270.01 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token e04b48.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token e04b48.yaml new file mode 100644 index 000000000..223ba0844 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Survivor turn token e04b48.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516557267/757887224F6C37104CDFFE241FAD09B57117D670/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e04b48 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Survivor turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.36 + posZ: -75.71 + rotX: 0.02 + rotY: 269.99 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 0de2c4.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 0de2c4.yaml new file mode 100644 index 000000000..4a000fd71 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 0de2c4.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515898740/E92441671B056D4CDF99DF9E6C88BE6598AAB50F/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0de2c4 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.36 + posZ: -67.82 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 226716.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 226716.yaml new file mode 100644 index 000000000..dee675e53 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 226716.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515898740/E92441671B056D4CDF99DF9E6C88BE6598AAB50F/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '226716' +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.36 + posZ: -70.29 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 307044.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 307044.yaml new file mode 100644 index 000000000..302cec631 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 307044.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515960460/F43F63452854B10B416FDF3BF9EF3068E6E68F26/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '307044' +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.35 + posZ: -84.82 + rotX: 0.02 + rotY: 270.02 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 3ddfeb.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 3ddfeb.yaml new file mode 100644 index 000000000..39e95633c --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 3ddfeb.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515960460/F43F63452854B10B416FDF3BF9EF3068E6E68F26/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3ddfeb +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.35 + posZ: -86.02 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 543164.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 543164.yaml new file mode 100644 index 000000000..1d63bc1d3 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 543164.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515898740/E92441671B056D4CDF99DF9E6C88BE6598AAB50F/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '543164' +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.36 + posZ: -69.06 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 779aa6.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 779aa6.yaml new file mode 100644 index 000000000..87a122127 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model Turn token 779aa6.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515960460/F43F63452854B10B416FDF3BF9EF3068E6E68F26/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 4 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 779aa6 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Turn token +Snap: true +Sticky: true +Tooltip: false +Transform: + posX: -16.64 + posY: 1.36 + posZ: -83.54 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.45 + scaleY: 0.6 + scaleZ: 0.45 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.ttslua new file mode 100644 index 000000000..c341fbc36 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.ttslua @@ -0,0 +1,29 @@ +function onload() + b_display = { index = 0, + click_function = 'updateDisplay', + label = self.getName(), + function_owner = self, + position = {0, 1.4, 0}, + rotation = {0, 270, 0}, + width = 500, + height = 200, + font_size = 200} + + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) + end + + self.createButton(b_display) +end + +function updateDisplay() + b_display.label = self.getName() + + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) + end + + self.editButton(b_display) +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.yaml new file mode 100644 index 000000000..6237eddc0 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.yaml @@ -0,0 +1,51 @@ +Autoraise: true +ColorDiffuse: + b: 0.8446619 + g: 0.25203383 + r: 0.8286206 +ContainedObjects: +- !include 'Custom_Model_Bag Agatha ced1e0/Deck Agatha Starter Bonded Cards d25df2.yaml' +- !include 'Custom_Model_Bag Agatha ced1e0/Deck Agatha Starter Deck 22456c.yaml' +- !include 'Custom_Model_Bag Agatha ced1e0/Deck Agatha Signatures b0efc9.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://i.imgur.com/1ohL4YF.pnghttp://i.imgur.com/1ohL4YF.png + MaterialIndex: 1 + MeshURL: https://www.dropbox.com/s/ikgs1s70gnh9fjs/MtGdecksdeckBox001.obj?dl=1 + NormalURL: '' + TypeIndex: 6 +Description: 'font size = 90 + + ' +DragSelectable: true +GMNotes: '' +GUID: ced1e0 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Agatha ced1e0.ttslua' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Agatha +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 1.29 + posZ: -76.95 + rotX: 359.98 + rotY: 0.0 + rotZ: 0.02 + scaleX: 2.2 + scaleY: 2.2 + scaleZ: 2.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Signatures b0efc9.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Signatures b0efc9.yaml new file mode 100644 index 000000000..dc5149ef4 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Signatures b0efc9.yaml @@ -0,0 +1,200 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 573800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5730': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962513089/C080E5C139974448EB249C87483B72CA315917E8/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: '561289' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Superstitious + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -6.017912 + posY: 0.973598063 + posZ: -5.096334 + rotX: 3.63684e-06 + rotY: 269.9995 + rotZ: 7.693863e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 572200 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5722': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843250610965513/900DABA5B371F90D318987E01EB55EAA95DAB539/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 12d504 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Telekinesis + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -6.09597349 + posY: 1.0126549 + posZ: -5.0663023 + rotX: 9.903633e-06 + rotY: 269.9995 + rotZ: 6.282115e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 573900 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5739': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021963051268/DEF77290A817AF737D77F0557E52BEDA5E124F65/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b731ed + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Precognition + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -32.7114258 + posY: 1.378288 + posZ: -76.5944443 + rotX: 0.0208095871 + rotY: 269.999939 + rotZ: 0.0167706478 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '5722': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843250610965513/900DABA5B371F90D318987E01EB55EAA95DAB539/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5738': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962513089/C080E5C139974448EB249C87483B72CA315917E8/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5739': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021963051268/DEF77290A817AF737D77F0557E52BEDA5E124F65/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +DeckIDs: +- 573800 +- 572200 +- 573900 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b0efc9 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Agatha Signatures +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.36 + posZ: -76.95 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Starter Bonded Cards d25df2.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Starter Bonded Cards d25df2.yaml new file mode 100644 index 000000000..3ef003510 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Starter Bonded Cards d25df2.yaml @@ -0,0 +1,184 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 379021 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3790': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 49b523 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Blood-Rite + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614838 + posY: 1.31350589 + posZ: -72.3782 + rotX: 0.002230371 + rotY: 269.999023 + rotZ: 359.990967 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 379021 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3790': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 26729c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Blood-Rite + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16152 + posY: 1.34124279 + posZ: -72.37791 + rotX: 0.0245485 + rotY: 270.000977 + rotZ: 359.155975 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 379021 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3790': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: eafd12 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Blood-Rite + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614723 + posY: 1.87669742 + posZ: -72.37811 + rotX: 0.0016939526 + rotY: 270.0 + rotZ: 359.992828 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '3790': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +DeckIDs: +- 379021 +- 379021 +- 379021 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d25df2 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Agatha Starter Bonded Cards +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.36 + posZ: -76.95 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Starter Deck 22456c.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Starter Deck 22456c.yaml new file mode 100644 index 000000000..81ae5c6a3 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0/Deck Agatha Starter Deck 22456c.yaml @@ -0,0 +1,1530 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 230305 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 45d2d2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Uncage the Soul + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 230314 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 9c922f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Storm of Spirits + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 430907 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4309': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: ff3f17 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Eldritch Inspiration + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 380126 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3801': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 75eca5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Read the Signs + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 277813 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5ada0a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hawk-Eye Folding Camera + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 430908 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4309': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8aa0c3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deny Existence + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 230331 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Cleansing Fire + DragSelectable: true + GMNotes: '' + GUID: 423d46 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: St. Hubert's Key + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266326 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d8b64b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Promise of Power + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 448029 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4480': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8e8a14 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Spectral Razor + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: ffa4f9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Eureka! + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 277512 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2775': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 6eceef + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Sixth Sense + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538807 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: a614de + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Feed the Mind + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 444024 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4440': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: a33acd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Open Gate + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538710 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d9292f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Robes of Endless Night + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 277812 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8dce44 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Crack the Case + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538714 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0988b2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Voice of Ra + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266323 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 9c32e2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Sword Cane + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 450621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 19b705 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Scroll of Secrets (Taboo) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 444024 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4440': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: a33acd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Open Gate + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368420 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Untranslated + DragSelectable: true + GMNotes: '' + GUID: cbfc12 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Archaic Glyphs + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 379020 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3790': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5d6728 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Occult Lexicon + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538811 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hunter of Rare Books + DragSelectable: true + GMNotes: '' + GUID: 3c5099 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Whitton Greene + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 230329 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 29b842 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Rite of Seeking + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.51321411 + posZ: -68.62185 + rotX: 0.00478854124 + rotY: 270.0 + rotZ: 180.030563 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368506 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c6ac19 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Perception + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.43838108 + posZ: -68.62185 + rotX: 0.007883958 + rotY: 270.0 + rotZ: 180.050186 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8f7289 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Guts + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614761 + posY: 1.43335342 + posZ: -68.62189 + rotX: 0.007892775 + rotY: 269.9999 + rotZ: 180.050156 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 230308 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 6656ad + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ward of Protection + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.37156379 + posZ: -68.62185 + rotX: 0.007883916 + rotY: 270.0 + rotZ: 180.050186 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 230328 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: '914053' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Shrivelling + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.76968074 + posZ: -68.62185 + rotX: 3.06009912 + rotY: 270.2682 + rotZ: 190.015427 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368408 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8cf335 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Mind over Matter + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16143 + posY: 1.33686876 + posZ: -68.62188 + rotX: 359.576263 + rotY: 270.0001 + rotZ: 180.012665 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 450614 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Professor of Entomology + DragSelectable: true + GMNotes: '' + GUID: 8ae314 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dr. Milan Christopher (Taboo) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -52.3711281 + posY: 1.63057673 + posZ: -78.40548 + rotX: 0.0208116956 + rotY: 269.999939 + rotZ: 0.01677445 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 230330 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Speaker to the Dead + DragSelectable: true + GMNotes: '' + GUID: 53867b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Alyssa Graham + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -51.2858276 + posY: 1.707727 + posZ: -78.22212 + rotX: 359.964752 + rotY: 269.997925 + rotZ: 354.228851 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2303': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2775': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3790': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3801': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4309': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4440': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4480': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +DeckIDs: +- 230305 +- 230314 +- 430907 +- 380126 +- 277813 +- 430908 +- 230331 +- 266326 +- 448029 +- 368400 +- 277512 +- 538807 +- 444024 +- 538710 +- 277812 +- 538714 +- 266323 +- 450621 +- 444024 +- 368420 +- 379020 +- 538811 +- 230329 +- 368506 +- 368500 +- 230308 +- 230328 +- 368408 +- 450614 +- 230330 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 22456c +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Agatha Starter Deck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.49 + posZ: -76.95 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.ttslua new file mode 100644 index 000000000..c341fbc36 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.ttslua @@ -0,0 +1,29 @@ +function onload() + b_display = { index = 0, + click_function = 'updateDisplay', + label = self.getName(), + function_owner = self, + position = {0, 1.4, 0}, + rotation = {0, 270, 0}, + width = 500, + height = 200, + font_size = 200} + + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) + end + + self.createButton(b_display) +end + +function updateDisplay() + b_display.label = self.getName() + + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) + end + + self.editButton(b_display) +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.yaml new file mode 100644 index 000000000..8a07cbf96 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.yaml @@ -0,0 +1,53 @@ +Autoraise: true +ColorDiffuse: + b: 0.861062765 + g: 0.578766346 + r: 0.341496 +ContainedObjects: +- !include 'Custom_Model_Bag Daniela b9fc9d/Deck Daniela Starter Bonded Cards d43832.yaml' +- !include 'Custom_Model_Bag Daniela b9fc9d/Deck Daniela Survivor Starter Deck aff35f.yaml' +- !include 'Custom_Model_Bag Daniela b9fc9d/Deck Daniela Rogue Starter Deck 91ab4d.yaml' +- !include 'Custom_Model_Bag Daniela b9fc9d/Deck Custom Tool Upgrades ec9fd8.yaml' +- !include 'Custom_Model_Bag Daniela b9fc9d/Deck Daniela Signatures 22fe8e.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://i.imgur.com/1ohL4YF.pnghttp://i.imgur.com/1ohL4YF.png + MaterialIndex: 1 + MeshURL: https://www.dropbox.com/s/ikgs1s70gnh9fjs/MtGdecksdeckBox001.obj?dl=1 + NormalURL: '' + TypeIndex: 6 +Description: 'font size = 90 + + ' +DragSelectable: true +GMNotes: '' +GUID: b9fc9d +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Daniela b9fc9d.ttslua' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Daniela +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 1.3 + posZ: -53.44 + rotX: 359.98 + rotY: 0.0 + rotZ: 0.02 + scaleX: 2.2 + scaleY: 2.2 + scaleZ: 2.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Custom Tool Upgrades ec9fd8.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Custom Tool Upgrades ec9fd8.yaml new file mode 100644 index 000000000..83124991f --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Custom Tool Upgrades ec9fd8.yaml @@ -0,0 +1,362 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 571500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5715': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843250613351148/00147FC5C493140AA8D07EAB3C29F7255EE2DAB3/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: '151776' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Gravedigger's Shovel (3) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.8590069 + posY: 1.29272628 + posZ: -57.17952 + rotX: 0.0208081212 + rotY: 269.992 + rotZ: 0.01677136 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 572400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '7': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716356731/7D2D3112F5CAD2C4139B4CF9A0A4D344FE205936/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: a3e12e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Hawk-Eye Folding Camera (3) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -20.8805485 + posY: 1.06699848 + posZ: 4.46579838 + rotX: 4.55159643e-08 + rotY: 180.0 + rotZ: 180.065063 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 572500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5725': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716359342/A627B404401133DAE015773705CD9E96ACDE0E51/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 68334b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Old Keyring (5) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -2.46277356 + posY: 1.04655731 + posZ: -4.19304 + rotX: -2.359239e-05 + rotY: 270.008026 + rotZ: -9.246275e-06 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 562100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5621': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716358653/5D06796F95FF304BE488C8E0B80B5619F0428BE5/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 76624c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Fingerprint Kit (5) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -2.22980332 + posY: 1.05618906 + posZ: -4.04898834 + rotX: 2.535049e-05 + rotY: 270.008 + rotZ: 6.380317e-07 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 573900 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5727': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962491804/2BC806C8A67CD1D2427758D85B7D1DCF28342484/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: f946de + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Lonnie's Wrench (4) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -5.71686268 + posY: 0.97359705 + posZ: -4.98677731 + rotX: 2.68663953e-05 + rotY: 270.005646 + rotZ: 3.53641212e-06 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 572800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5728': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962493030/DB4B97E954C2904AA58E8FAC9AA3966A934D3EC1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 1f7e08 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Tool Belt (3) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -35.94188 + posY: 1.41425025 + posZ: -48.2587624 + rotX: 0.0208062269 + rotY: 270.007874 + rotZ: 0.0167733766 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '5621': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716358653/5D06796F95FF304BE488C8E0B80B5619F0428BE5/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5715': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843250613351148/00147FC5C493140AA8D07EAB3C29F7255EE2DAB3/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5724': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716356731/7D2D3112F5CAD2C4139B4CF9A0A4D344FE205936/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5725': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716359342/A627B404401133DAE015773705CD9E96ACDE0E51/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5728': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962493030/DB4B97E954C2904AA58E8FAC9AA3966A934D3EC1/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5739': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962491804/2BC806C8A67CD1D2427758D85B7D1DCF28342484/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +DeckIDs: +- 571500 +- 572400 +- 572500 +- 562100 +- 573900 +- 572800 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ec9fd8 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Custom Tool Upgrades +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.39 + posZ: -53.44 + rotX: 0.02 + rotY: 270.01 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Rogue Starter Deck 91ab4d.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Rogue Starter Deck 91ab4d.yaml new file mode 100644 index 000000000..a5668b5d3 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Rogue Starter Deck 91ab4d.yaml @@ -0,0 +1,1554 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 430810 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4308': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b9bb2a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Fingerprint Kit + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 277607 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2776': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c7d9b5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Enchanted Blade + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 550805 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5888da + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Old Keyring + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 277813 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5ada0a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hawk-Eye Folding Camera + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 545304 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 52c686 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Flesh Ward + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226322 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 4d971e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Survival Knife + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 545308 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8d6ae6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Safeguard + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266315 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 4f3142 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Cryptographic Cipher + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 379827 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3798': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 91e53c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Daring + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 553100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 55fc3d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Riot Whistle + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 431006 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4310': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 4e1d91 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Steadfast + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 378620 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 312d38 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hallowed Mirror + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368710 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 819aee + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Sleight of Hand + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 261700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2617': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c40cb4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: '"Watch this!"' + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226332 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0e2987 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Venturer + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368829 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 3fe6de + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Gravedigger's Shovel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368827 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: e66002 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lantern + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 379829 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3798': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Too Noble for His Own Good + DragSelectable: true + GMNotes: '' + GUID: 08e5a6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tetsuo Mori + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 545313 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: '273584' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Glory + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266311 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: cc1ef3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Book of Psalms + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538603 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: cc11e4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lockpicks + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226305 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 36c0cb + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: '"Let me handle this!"' + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.49065137 + posZ: -68.62185 + rotX: -5.628951e-05 + rotY: 270.0 + rotZ: 179.99971 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 261703 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2617': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 99989c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Quick Thinking + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.427779 + posZ: -68.62184 + rotX: 0.005164078 + rotY: 270.0 + rotZ: 180.006165 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226310 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 831b6b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Prepared for the Worst + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.38448858 + posZ: -68.62185 + rotX: 359.9887 + rotY: 270.0 + rotZ: 179.928131 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368717 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b4ad29 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Contraband + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.40753615 + posZ: -68.62185 + rotX: -0.00332343369 + rotY: 270.0 + rotZ: 180.00148 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368515 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: bb1cce + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Flashlight + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.37156379 + posZ: -68.62185 + rotX: 0.007859283 + rotY: 270.0 + rotZ: 180.0502 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368421 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8cc0a6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Magnifying Glass + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.382839 + posZ: -68.62185 + rotX: 0.007859405 + rotY: 270.0 + rotZ: 180.0502 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226302 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: '889121' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Vicious Blow + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16143 + posY: 1.33686864 + posZ: -68.62187 + rotX: 359.576263 + rotY: 270.0001 + rotZ: 180.012665 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226327 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 86ee68 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Machete + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614876 + posY: 1.31268573 + posZ: -68.6218643 + rotX: 0.00982345 + rotY: 270.0005 + rotZ: 180.062744 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538607 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Feisty Mechanic + DragSelectable: true + GMNotes: '' + GUID: ad0ef0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lonnie Ritter + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -46.4995766 + posY: 1.64140809 + posZ: -48.5078468 + rotX: 0.0208082888 + rotY: 270.0 + rotZ: 0.01677013 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2617': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2776': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3798': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4308': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4310': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +DeckIDs: +- 430810 +- 277607 +- 550805 +- 277813 +- 545304 +- 226322 +- 545308 +- 266315 +- 379827 +- 553100 +- 431006 +- 378620 +- 368710 +- 261700 +- 226332 +- 368829 +- 368827 +- 379829 +- 545313 +- 266311 +- 538603 +- 226305 +- 261703 +- 226310 +- 368717 +- 368515 +- 368421 +- 226302 +- 226327 +- 538607 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 91ab4d +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Daniela Rogue Starter Deck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.5 + posZ: -53.44 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Signatures 22fe8e.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Signatures 22fe8e.yaml new file mode 100644 index 000000000..06b87a474 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Signatures 22fe8e.yaml @@ -0,0 +1,254 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 500 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716355455/64ABE116F4E4F38DDDCDBD66852E6F28A3081773/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 23e12e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Pishtaco + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -2.09317946 + posY: 0.9735895 + posZ: 2.36475658 + rotX: 9.573684e-06 + rotY: 270.0 + rotZ: 6.28475254e-06 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '8': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716357352/ED999E108BDF49A0726E662582ACBD54726CDD48/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 77856e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Lonnie's Wrench (0) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -2.29548073 + posY: 1.01264572 + posZ: 2.43853 + rotX: 8.002335e-06 + rotY: 270.0 + rotZ: -1.90463709e-06 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 572900 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5729': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962495275/97504D63B915ECA61B61255024022F3BF709320F/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 96ce5f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Gabriel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -5.737633 + posY: 0.973597944 + posZ: 3.17138433 + rotX: -1.16863578e-06 + rotY: 270.0 + rotZ: -1.540766e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 573900 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5730': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962496894/700C94A146CBBE0BF0D0D53612C3CE724E97089B/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8f959e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Tool Belt (0) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -6.11871147 + posY: 1.01558781 + posZ: 3.2291162 + rotX: 0.110023744 + rotY: 269.999329 + rotZ: -2.11109273e-06 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '5': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716355455/64ABE116F4E4F38DDDCDBD66852E6F28A3081773/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5729': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962495275/97504D63B915ECA61B61255024022F3BF709320F/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5739': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648844021962496894/700C94A146CBBE0BF0D0D53612C3CE724E97089B/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '8': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716357352/ED999E108BDF49A0726E662582ACBD54726CDD48/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +DeckIDs: +- 500 +- 800 +- 572900 +- 573900 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 22fe8e +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Daniela Signatures +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.38 + posZ: -53.44 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Starter Bonded Cards d43832.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Starter Bonded Cards d43832.yaml new file mode 100644 index 000000000..265271ede --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Starter Bonded Cards d43832.yaml @@ -0,0 +1,184 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 378621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 3ad803 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Soothing Melody + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614876 + posY: 1.313402 + posZ: -72.37818 + rotX: 0.00321589387 + rotY: 269.999054 + rotZ: 359.9842 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 378621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b88c17 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Soothing Melody + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614532 + posY: 1.34095836 + posZ: -72.37788 + rotX: 0.0226687044 + rotY: 269.996521 + rotZ: 359.173462 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 378621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 53f076 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Soothing Melody + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.383412 + posZ: -72.3781357 + rotX: 0.00257302169 + rotY: 270.0 + rotZ: 359.987366 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +DeckIDs: +- 378621 +- 378621 +- 378621 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d43832 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Daniela Starter Bonded Cards +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.37 + posZ: -53.44 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Survivor Starter Deck aff35f.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Survivor Starter Deck aff35f.yaml new file mode 100644 index 000000000..f74ccff7f --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d/Deck Daniela Survivor Starter Deck aff35f.yaml @@ -0,0 +1,1538 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 550805 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5888da + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Old Keyring + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226322 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 4d971e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Survival Knife + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538603 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: cc11e4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lockpicks + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 379827 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3798': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 91e53c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Daring + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 274607 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0bea17 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Act of Desperation + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368802 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 334f03 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Resourceful + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 277607 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2776': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c7d9b5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Enchanted Blade + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 274608 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 6fa7fa + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Track Shoes + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266315 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 4f3142 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Cryptographic Cipher + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 277813 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5ada0a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hawk-Eye Folding Camera + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 430810 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4308': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b9bb2a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Fingerprint Kit + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368827 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: e66002 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lantern + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 378620 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 312d38 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hallowed Mirror + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 545313 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: '273584' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Glory + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 545308 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8d6ae6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Safeguard + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 545304 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 52c686 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Flesh Ward + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226332 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0e2987 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Venturer + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 553100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 55fc3d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Riot Whistle + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266311 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: cc1ef3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Book of Psalms + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 379829 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3798': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Too Noble for His Own Good + DragSelectable: true + GMNotes: '' + GUID: 08e5a6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tetsuo Mori + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368829 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 3fe6de + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Gravedigger's Shovel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226305 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 36c0cb + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: '"Let me handle this!"' + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226310 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 831b6b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Prepared for the Worst + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614647 + posY: 1.49854708 + posZ: -68.6218262 + rotX: -0.00350316172 + rotY: 270.0 + rotZ: 179.977829 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368815 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 59d89b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Oops! + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.5131917 + posZ: -68.62185 + rotX: -0.00140877068 + rotY: 270.0 + rotZ: 179.991 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368515 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: bb1cce + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Flashlight + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.505561 + posZ: -68.62185 + rotX: 0.004202589 + rotY: 270.0 + rotZ: 180.026184 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368810 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: ce0dd5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lucky! + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614761 + posY: 1.43346286 + posZ: -68.62189 + rotX: 0.006925225 + rotY: 269.999939 + rotZ: 180.043167 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368421 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8cc0a6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Magnifying Glass + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.77978528 + posZ: -68.62185 + rotX: 3.24823785 + rotY: 270.276733 + rotZ: 189.736664 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226302 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: '889121' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Vicious Blow + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16129 + posY: 1.33779252 + posZ: -68.6218262 + rotX: 359.543884 + rotY: 269.999847 + rotZ: 180.0096 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 226327 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 86ee68 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Machete + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614761 + posY: 1.31282222 + posZ: -68.62193 + rotX: 0.008647865 + rotY: 269.999573 + rotZ: 180.053986 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368822 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 1b76c9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Scavenging + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -42.4573746 + posY: 1.6625545 + posZ: -48.5410042 + rotX: 0.02061682 + rotY: 269.992828 + rotZ: 1.142802 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2263': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2776': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3798': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4308': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5453': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +DeckIDs: +- 550805 +- 226322 +- 538603 +- 379827 +- 274607 +- 368802 +- 277607 +- 274608 +- 266315 +- 277813 +- 430810 +- 368827 +- 378620 +- 545313 +- 545308 +- 545304 +- 226332 +- 553100 +- 266311 +- 379829 +- 368829 +- 226305 +- 226310 +- 368815 +- 368515 +- 368810 +- 368421 +- 226302 +- 226327 +- 368822 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: aff35f +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Daniela Survivor Starter Deck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.5 + posZ: -53.44 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.ttslua new file mode 100644 index 000000000..c341fbc36 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.ttslua @@ -0,0 +1,29 @@ +function onload() + b_display = { index = 0, + click_function = 'updateDisplay', + label = self.getName(), + function_owner = self, + position = {0, 1.4, 0}, + rotation = {0, 270, 0}, + width = 500, + height = 200, + font_size = 200} + + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) + end + + self.createButton(b_display) +end + +function updateDisplay() + b_display.label = self.getName() + + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) + end + + self.editButton(b_display) +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.yaml new file mode 100644 index 000000000..6e2d4976c --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.yaml @@ -0,0 +1,51 @@ +Autoraise: true +ColorDiffuse: + b: 0.275859058 + g: 0.275859058 + r: 0.9901323 +ContainedObjects: +- !include 'Custom_Model_Bag Darrell c3e12f/Deck Darrell Starter Deck dc7a22.yaml' +- !include 'Custom_Model_Bag Darrell c3e12f/CardCustom A Glimmer of Hope (3) d01579.yaml' +- !include 'Custom_Model_Bag Darrell c3e12f/Deck Darrell Signatures af72fc.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://i.imgur.com/1ohL4YF.pnghttp://i.imgur.com/1ohL4YF.png + MaterialIndex: 1 + MeshURL: https://www.dropbox.com/s/ikgs1s70gnh9fjs/MtGdecksdeckBox001.obj?dl=1 + NormalURL: '' + TypeIndex: 6 +Description: 'font size = 90 + + ' +DragSelectable: true +GMNotes: '' +GUID: c3e12f +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Darrell c3e12f.ttslua' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Darrell +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 1.29 + posZ: -84.82 + rotX: 359.98 + rotY: 0.0 + rotZ: 0.02 + scaleX: 2.2 + scaleY: 2.2 + scaleZ: 2.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/CardCustom A Glimmer of Hope (3) d01579.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/CardCustom A Glimmer of Hope (3) d01579.yaml new file mode 100644 index 000000000..b6c40b9e5 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/CardCustom A Glimmer of Hope (3) d01579.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 571600 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5716': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843250613349394/3C4A920C6D032B95788F754497DA3A27D90B28E9/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d01579 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: A Glimmer of Hope (3) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.34 + posZ: -84.82 + rotX: 0.6 + rotY: 270.01 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/Deck Darrell Signatures af72fc.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/Deck Darrell Signatures af72fc.yaml new file mode 100644 index 000000000..2eeeb0892 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/Deck Darrell Signatures af72fc.yaml @@ -0,0 +1,200 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 571100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5711': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843250613347530/E8E1D0D090C16589F21B2D7F203068491815ADF7/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 69218d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Arkham Advertiser + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.10444 + posY: 1.31774735 + posZ: -81.62889 + rotX: 0.0208146647 + rotY: 269.97876 + rotZ: 0.0167634711 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 564400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5644': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262528361/E1A56E24C6C26AE04D7E4F4B9AF945BC235FF368/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: e13c4d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Tunnel Vision + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 5.815717 + posY: 1.35682535 + posZ: -81.85473 + rotX: 0.02081477 + rotY: 269.97876 + rotZ: 0.0167634748 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 574000 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5722': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843527264913810/6EF353EEDA1ADE8AAA1B36042677265E0C3807CE/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b475d2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Doyle Jeffries + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 6.23166 + posY: 1.39104879 + posZ: -81.184906 + rotX: 0.020814959 + rotY: 269.97876 + rotZ: 0.0167633146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '5644': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843119262528361/E1A56E24C6C26AE04D7E4F4B9AF945BC235FF368/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5711': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843250613347530/E8E1D0D090C16589F21B2D7F203068491815ADF7/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5740': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843527264913810/6EF353EEDA1ADE8AAA1B36042677265E0C3807CE/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +DeckIDs: +- 571100 +- 564400 +- 574000 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: af72fc +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Darrell Signatures +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.37 + posZ: -84.82 + rotX: 359.03 + rotY: 269.97 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/Deck Darrell Starter Deck dc7a22.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/Deck Darrell Starter Deck dc7a22.yaml new file mode 100644 index 000000000..ecc78eb9e --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f/Deck Darrell Starter Deck dc7a22.yaml @@ -0,0 +1,1514 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 368429 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d6771f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Fieldwork + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -44.012413 + posY: 1.33832753 + posZ: -89.21861 + rotX: 0.0208073761 + rotY: 269.999969 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368428 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 07a8f0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Art Student + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -43.979248 + posY: 1.297369 + posZ: -89.10761 + rotX: 0.0208080523 + rotY: 269.999939 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368802 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 334f03 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Resourceful + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368806 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: cc6e4d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Take Heart + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368504 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 679b13 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Manual Dexterity + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614647 + posY: 1.495391 + posZ: -68.62183 + rotX: -0.001782977 + rotY: 270.0 + rotZ: 179.988663 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 450621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 19b705 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Scroll of Secrets (Taboo) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 447832 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4478': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 1ac667 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Practice Makes Perfect + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 447733 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4477': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: f21109 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: A Glimmer of Hope + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 450614 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Professor of Entomology + DragSelectable: true + GMNotes: '' + GUID: 8ae314 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dr. Milan Christopher (Taboo) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16148 + posY: 1.31262577 + posZ: -68.62193 + rotX: 0.0105142528 + rotY: 269.999756 + rotZ: 180.066864 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368826 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: ee20c9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Newspaper + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368402 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b265c4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deduction + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614456 + posY: 1.33660448 + posZ: -68.6219 + rotX: 359.586151 + rotY: 270.0001 + rotZ: 180.0127 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266317 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b176fc + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deep Knowledge + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368506 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c6ac19 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Perception + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614647 + posY: 1.50733078 + posZ: -68.62183 + rotX: -0.00425279746 + rotY: 270.0 + rotZ: 179.972839 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: ffa4f9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Eureka! + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266315 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 4f3142 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Cryptographic Cipher + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 447733 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4477': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: f21109 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: A Glimmer of Hope + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 430809 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4308': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 13413d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Connect the Dots + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368821 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 215cec + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Cherished Keepsake + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 430501 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4305': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: aa3984 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Winging It + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368816 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 88d3c0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: '"Look what I found!"' + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.48423445 + posZ: -68.62185 + rotX: 0.00509365555 + rotY: 270.0 + rotZ: 180.032333 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 274608 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 6fa7fa + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Track Shoes + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368807 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 050ba1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Live and Learn + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 277813 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5ada0a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hawk-Eye Folding Camera + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368810 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: ce0dd5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lucky! + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.50136876 + posZ: -68.62185 + rotX: -0.00173745607 + rotY: 270.0 + rotZ: 179.988785 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368407 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: f69e10 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Seeking Answers + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368403 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 4167c0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: True Understanding + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368822 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 1b76c9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Scavenging + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.451553 + posZ: -68.62185 + rotX: 0.008411194 + rotY: 270.0 + rotZ: 180.053482 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368405 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d4fd4a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Shortcut + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368820 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 593deb + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Leather Coat + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.382791 + posZ: -68.62185 + rotX: 0.008411173 + rotY: 270.0 + rotZ: 180.053482 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 550805 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5888da + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Old Keyring + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4305': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4308': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4477': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4478': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +DeckIDs: +- 368429 +- 368428 +- 368802 +- 368806 +- 368504 +- 450621 +- 447832 +- 447733 +- 450614 +- 368826 +- 368402 +- 266317 +- 368506 +- 368400 +- 266315 +- 447733 +- 430809 +- 368821 +- 430501 +- 368816 +- 274608 +- 368807 +- 277813 +- 368810 +- 368407 +- 368403 +- 368822 +- 368405 +- 368820 +- 550805 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dc7a22 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Darrell Starter Deck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.49 + posZ: -84.82 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.ttslua new file mode 100644 index 000000000..c341fbc36 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.ttslua @@ -0,0 +1,29 @@ +function onload() + b_display = { index = 0, + click_function = 'updateDisplay', + label = self.getName(), + function_owner = self, + position = {0, 1.4, 0}, + rotation = {0, 270, 0}, + width = 500, + height = 200, + font_size = 200} + + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) + end + + self.createButton(b_display) +end + +function updateDisplay() + b_display.label = self.getName() + + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) + end + + self.editButton(b_display) +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.yaml new file mode 100644 index 000000000..09abcb21b --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.yaml @@ -0,0 +1,51 @@ +Autoraise: true +ColorDiffuse: + b: 0.3592119 + g: 0.7072354 + r: 0.204924911 +ContainedObjects: +- !include 'Custom_Model_Bag Jack 2bff9c/Deck Monterey Starter Bonded Cards 1d867d.yaml' +- !include 'Custom_Model_Bag Jack 2bff9c/Deck Monterey Survivor Starter Deck 775496.yaml' +- !include 'Custom_Model_Bag Jack 2bff9c/Deck Monterey Signatures c34beb.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://i.imgur.com/1ohL4YF.pnghttp://i.imgur.com/1ohL4YF.png + MaterialIndex: 1 + MeshURL: https://www.dropbox.com/s/ikgs1s70gnh9fjs/MtGdecksdeckBox001.obj?dl=1 + NormalURL: '' + TypeIndex: 6 +Description: 'font size = 90 + + ' +DragSelectable: true +GMNotes: '' +GUID: 2bff9c +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Jack 2bff9c.ttslua' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Jack +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 1.3 + posZ: -69.06 + rotX: 359.98 + rotY: 0.03 + rotZ: 0.02 + scaleX: 2.2 + scaleY: 2.2 + scaleZ: 2.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Signatures c34beb.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Signatures c34beb.yaml new file mode 100644 index 000000000..7276b00fb --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Signatures c34beb.yaml @@ -0,0 +1,200 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 1400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '14': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716432298/5A6E3CE09293A812479ACAA1E88F5F708884F7AB/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5543ad + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Price of Greed + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -1.57141948 + posY: 0.9736048 + posZ: 3.547439 + rotX: 3.84564451e-08 + rotY: 180.0 + rotZ: -1.38851036e-07 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 1200 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '12': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716431167/33C36D109B8E9760F6840D055898554B265FB244/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0c37e6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Bull Whip + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -9.558957 + posY: 0.9736048 + posZ: 4.857686 + rotX: 1.60723257e-08 + rotY: 180.0 + rotZ: -3.20575936e-07 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 573200 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5732': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843044116268156/2CA726DCFC429BE1B20C014CA55007A1EBAD7A82/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: df5de2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Excavation + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 0.07388019 + posY: 1.04656255 + posZ: -7.336608 + rotX: -5.979474e-06 + rotY: 269.999878 + rotZ: 2.86344948e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '12': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716431167/33C36D109B8E9760F6840D055898554B265FB244/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '14': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716432298/5A6E3CE09293A812479ACAA1E88F5F708884F7AB/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5732': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843044116268156/2CA726DCFC429BE1B20C014CA55007A1EBAD7A82/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +DeckIDs: +- 1400 +- 1200 +- 573200 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: c34beb +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Monterey Signatures +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.37 + posZ: -69.06 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Starter Bonded Cards 1d867d.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Starter Bonded Cards 1d867d.yaml new file mode 100644 index 000000000..8a77e4e89 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Starter Bonded Cards 1d867d.yaml @@ -0,0 +1,184 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 378621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 9075e3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Soothing Melody + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614876 + posY: 1.313402 + posZ: -72.37818 + rotX: 0.00321581843 + rotY: 269.999054 + rotZ: 359.9842 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 378621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 9bc395 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Soothing Melody + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614532 + posY: 1.34095836 + posZ: -72.37788 + rotX: 0.0226687044 + rotY: 269.996521 + rotZ: 359.173462 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 378621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 53f076 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Soothing Melody + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.383412 + posZ: -72.3781357 + rotX: 0.00257302169 + rotY: 270.0 + rotZ: 359.987366 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +DeckIDs: +- 378621 +- 378621 +- 378621 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1d867d +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Monterey Starter Bonded Cards +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.37 + posZ: -69.06 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Survivor Starter Deck 775496.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Survivor Starter Deck 775496.yaml new file mode 100644 index 000000000..a144da38e --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c/Deck Monterey Survivor Starter Deck 775496.yaml @@ -0,0 +1,1530 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 368706 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: cc6b14 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Daring Maneuver + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368432 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Mortal Reminder + DragSelectable: true + GMNotes: '' + GUID: c1a687 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tooth of Eztli + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266319 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: a5087b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: .25 Automatic + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368708 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: f6ff32 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Narrow Escape + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 274608 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 6fa7fa + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Track Shoes + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 553106 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 31cfbf + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Breaking and Entering + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538615 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b8843c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Nimble + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 261700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2617': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c40cb4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: '"Watch this!"' + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368807 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 050ba1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Live and Learn + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 378620 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 312d38 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hallowed Mirror + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 277607 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2776': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c7d9b5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Enchanted Blade + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368705 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: dcdcea + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: '"You handle this one!"' + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538608 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: dfbc13 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Leather Jacket + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538604 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: f32343 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Mauser C96 + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538607 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Feisty Mechanic + DragSelectable: true + GMNotes: '' + GUID: ad0ef0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lonnie Ritter + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266322 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 17d34b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Faustian Bargain + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538805 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Protective Amulet + DragSelectable: true + GMNotes: '' + GUID: d6c44a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Disc of Itzamna + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266321 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5ec6d0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Obfuscation + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 274607 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0bea17 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Act of Desperation + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 450618 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5a51d1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Sleight of Hand (Taboo) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 450616 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: '308967' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Quick Thinking (Taboo) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368619 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: dc3b07 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lone Wolf + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.48878753 + posZ: -68.62185 + rotX: -0.00156218151 + rotY: 270.0 + rotZ: 179.990082 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368832 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Big Man on Campus + DragSelectable: true + GMNotes: '' + GUID: ffdeb5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Peter Sylvestre + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.3977592 + posZ: -68.62185 + rotX: -0.000253417675 + rotY: 270.0 + rotZ: 179.998459 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368508 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: acb83a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unexpected Courage + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.420247 + posZ: -68.62185 + rotX: -0.003855099 + rotY: 270.0 + rotZ: 180.001617 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368504 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 679b13 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Manual Dexterity + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.371292 + posZ: -68.62186 + rotX: 0.00507058855 + rotY: 270.0 + rotZ: 180.031982 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368506 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c6ac19 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Perception + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.37151587 + posZ: -68.62185 + rotX: 0.008410829 + rotY: 270.0 + rotZ: 180.053482 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368515 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: bb1cce + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Flashlight + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.382791 + posZ: -68.62185 + rotX: 0.008411173 + rotY: 270.0 + rotZ: 180.053482 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368810 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: ce0dd5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lucky! + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614456 + posY: 1.33660448 + posZ: -68.6219 + rotX: 359.586151 + rotY: 270.0001 + rotZ: 180.0127 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368631 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: The Louisiana Lion + DragSelectable: true + GMNotes: '' + GUID: eaa415 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Leo De Luca + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16148 + posY: 1.31262577 + posZ: -68.62193 + rotX: 0.0105143161 + rotY: 269.999756 + rotZ: 180.066864 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538609 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: a973aa + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Streetwise + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -43.17588 + posY: 1.63603342 + posZ: -71.05729 + rotX: 0.0208117273 + rotY: 270.0001 + rotZ: 0.01677465 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2617': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2746': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2776': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3687': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3688': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3786': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4506': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1656721113609569419/60B1DFC7C68C406C34641A1F53078F46D610821C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +DeckIDs: +- 368706 +- 368432 +- 266319 +- 368708 +- 274608 +- 553106 +- 538615 +- 261700 +- 368807 +- 378620 +- 277607 +- 368705 +- 538608 +- 538604 +- 538607 +- 266322 +- 538805 +- 266321 +- 274607 +- 450618 +- 450616 +- 368619 +- 368832 +- 368508 +- 368504 +- 368506 +- 368515 +- 368810 +- 368631 +- 538609 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '775496' +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Monterey Survivor Starter Deck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.29 + posY: 4.52 + posZ: -69.06 + rotX: 1.33 + rotY: 270.01 + rotZ: 0.03 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.ttslua new file mode 100644 index 000000000..c341fbc36 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.ttslua @@ -0,0 +1,29 @@ +function onload() + b_display = { index = 0, + click_function = 'updateDisplay', + label = self.getName(), + function_owner = self, + position = {0, 1.4, 0}, + rotation = {0, 270, 0}, + width = 500, + height = 200, + font_size = 200} + + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) + end + + self.createButton(b_display) +end + +function updateDisplay() + b_display.label = self.getName() + + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) + end + + self.editButton(b_display) +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.yaml new file mode 100644 index 000000000..63c3da8c8 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.yaml @@ -0,0 +1,51 @@ +Autoraise: true +ColorDiffuse: + b: 0.289037645 + g: 0.7357981 + r: 0.9138992 +ContainedObjects: +- !include 'Custom_Model_Bag Kate e3a45e/Card Essence of the Dream 6ad46b.yaml' +- !include 'Custom_Model_Bag Kate e3a45e/Deck Kate Starter Deck d965e1.yaml' +- !include 'Custom_Model_Bag Kate e3a45e/Deck Kate Signatures 1cf901.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://i.imgur.com/1ohL4YF.pnghttp://i.imgur.com/1ohL4YF.png + MaterialIndex: 1 + MeshURL: https://www.dropbox.com/s/ikgs1s70gnh9fjs/MtGdecksdeckBox001.obj?dl=1 + NormalURL: '' + TypeIndex: 6 +Description: 'font size = 90 + + ' +DragSelectable: true +GMNotes: '' +GUID: e3a45e +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Kate e3a45e.ttslua' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Kate +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 1.3 + posZ: -61.24 + rotX: 359.98 + rotY: 0.0 + rotZ: 0.02 + scaleX: 2.2 + scaleY: 2.2 + scaleZ: 2.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Card Essence of the Dream 6ad46b.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Card Essence of the Dream 6ad46b.yaml new file mode 100644 index 000000000..8a806f55b --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Card Essence of the Dream 6ad46b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 379929 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3799': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6ad46b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Essence of the Dream +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.35 + posZ: -61.24 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Deck Kate Signatures 1cf901.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Deck Kate Signatures 1cf901.yaml new file mode 100644 index 000000000..6b0c8c7f3 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Deck Kate Signatures 1cf901.yaml @@ -0,0 +1,254 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 564100 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '6': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716383872/9A22FA6D7641FDFFC8CBACF098C57A8F3CB0D807/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 1deff1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Rift Walker + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -23.7370987 + posY: 1.057624 + posZ: 3.50035429 + rotX: -1.69199676e-08 + rotY: 180.0 + rotZ: 179.6864 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '7': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716384403/3284649DD6C58E8AB793BB88D3C1AD04E13A9630/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 915bba + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Dimensional Rift + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -23.00334 + posY: 1.06069243 + posZ: 3.57484674 + rotX: -1.14915838e-06 + rotY: 180.0 + rotZ: 181.223114 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 570900 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5709': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843250613342898/179BBDE1444120D21CF85207CA71E99BAC42A46F/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 57cd79 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Dimensional Study + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 21.5237942 + posY: 1.28938675 + posZ: -73.13508 + rotX: 0.0208086912 + rotY: 270.0 + rotZ: 0.0167712551 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 573800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5727': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843250613341666/CE1D2ADA26361567756E4BD656F953C2E0BE97A0/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: f458be + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: CardCustom + Nickname: Flux Stabilizer + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -1.3801142 + posY: 1.05900192 + posZ: -1.36049736 + rotX: 359.8945 + rotY: 270.0005 + rotZ: 1.95934717e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '5641': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716383872/9A22FA6D7641FDFFC8CBACF098C57A8F3CB0D807/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5709': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843250613342898/179BBDE1444120D21CF85207CA71E99BAC42A46F/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '5738': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648843250613341666/CE1D2ADA26361567756E4BD656F953C2E0BE97A0/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false + '7': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1648842893716351530/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1648842893716384403/3284649DD6C58E8AB793BB88D3C1AD04E13A9630/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +DeckIDs: +- 564100 +- 700 +- 570900 +- 573800 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1cf901 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Kate Signatures +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.37 + posZ: -61.24 + rotX: 0.58 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Deck Kate Starter Deck d965e1.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Deck Kate Starter Deck d965e1.yaml new file mode 100644 index 000000000..1f7a99936 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e/Deck Kate Starter Deck d965e1.yaml @@ -0,0 +1,1538 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 550805 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5888da + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Old Keyring + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266318 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 96fd5d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Plan of Action + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 380126 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3801': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 75eca5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Read the Signs + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266315 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 4f3142 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Cryptographic Cipher + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368504 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 679b13 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Manual Dexterity + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.49658847 + posZ: -68.62185 + rotX: 359.973022 + rotY: 270.0 + rotZ: 180.006531 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 380025 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3800': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0cc3e7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Followed + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368418 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: acd0da + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: '"I''ve got a plan!"' + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614761 + posY: 1.49522066 + posZ: -68.62185 + rotX: 0.0134339668 + rotY: 270.0 + rotZ: 179.99852 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368415 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44cf4a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: No Stone Unturned + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368432 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Mortal Reminder + DragSelectable: true + GMNotes: '' + GUID: c1a687 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tooth of Eztli + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368622 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: bc3451 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Burglary + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.44673014 + posZ: -68.62185 + rotX: 0.0214662384 + rotY: 270.0 + rotZ: 179.993347 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538603 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: cc11e4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lockpicks + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538812 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 0d29be + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Burning the Midnight Oil + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: ffa4f9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Eureka! + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266317 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b176fc + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deep Knowledge + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538808 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Untranslated + DragSelectable: true + GMNotes: '' + GUID: 0a4d22 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Forbidden Tome + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368422 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Unidentified + DragSelectable: true + GMNotes: '' + GUID: 565b6b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Strange Solution + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.50566244 + posZ: -68.62185 + rotX: -0.004472221 + rotY: 270.0 + rotZ: 180.0036 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 277812 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8dce44 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Crack the Case + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368434 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Professor of Entomology + DragSelectable: true + GMNotes: '' + GUID: 9934d2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dr. Milan Christopher + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16148 + posY: 1.339507 + posZ: -68.62183 + rotX: 0.0443883426 + rotY: 270.006317 + rotZ: 179.986191 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 379928 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3799': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Untranslated + DragSelectable: true + GMNotes: '' + GUID: b81dcf + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dream Diary + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538811 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hunter of Rare Books + DragSelectable: true + GMNotes: '' + GUID: 3c5099 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Whitton Greene + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368429 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d6771f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Fieldwork + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368506 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c6ac19 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Perception + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.1614647 + posY: 1.476393 + posZ: -68.62185 + rotX: 359.977783 + rotY: 270.0 + rotZ: 180.001343 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368408 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 8cf335 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Mind over Matter + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16148 + posY: 1.39540732 + posZ: -68.62185 + rotX: 0.0454170033 + rotY: 270.0 + rotZ: 179.954727 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 553106 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 31cfbf + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Breaking and Entering + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 441025 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4410': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 7686cb + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Astounding Revelation + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368420 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Untranslated + DragSelectable: true + GMNotes: '' + GUID: cbfc12 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Archaic Glyphs + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 368402 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b265c4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deduction + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 1.40429592 + posZ: -68.62185 + rotX: 0.03550963 + rotY: 270.0 + rotZ: 179.988953 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 430501 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4305': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: aa3984 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Winging It + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538613 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: cc9563 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Pilfer + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 447832 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4478': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 1ac667 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Practice Makes Perfect + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -63.16147 + posY: 8.66884 + posZ: -68.62185 + rotX: 0.0 + rotY: 270.0 + rotZ: 180.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '2778': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3684': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3685': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3686': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3799': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3800': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3801': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4305': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4410': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '4478': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5508': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5531': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +DeckIDs: +- 550805 +- 266318 +- 380126 +- 266315 +- 368504 +- 380025 +- 368418 +- 368415 +- 368432 +- 368622 +- 538603 +- 538812 +- 368400 +- 266317 +- 538808 +- 368422 +- 277812 +- 368434 +- 379928 +- 538811 +- 368429 +- 368506 +- 368408 +- 553106 +- 441025 +- 368420 +- 368402 +- 430501 +- 538613 +- 447832 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d965e1 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Kate Starter Deck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.3 + posY: 4.5 + posZ: -61.24 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Infinite_Bag Evidence Tokens 3068ef.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Infinite_Bag Evidence Tokens 3068ef.yaml new file mode 100644 index 000000000..ce854f9dd --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Infinite_Bag Evidence Tokens 3068ef.yaml @@ -0,0 +1,98 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + CustomImage: + CustomToken: + MergeDistancePixels: 5.0 + Stackable: true + StandUp: false + Thickness: 0.1 + ImageScalar: 1.0 + ImageSecondaryURL: '' + ImageURL: http://cloud-3.steamusercontent.com/ugc/1648844222670094150/15E605397E5F61AB2970F402CF5F5D2F9184F75C/ + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 23b140 + Grid: false + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Token + Nickname: Evidence + Snap: false + Sticky: true + Tooltip: true + Transform: + posX: 5.41285372 + posY: 1.53465641 + posZ: -51.25811 + rotX: 2.84449266e-06 + rotY: 314.9751 + rotZ: 180.0 + scaleX: 0.15222998 + scaleY: 1.0 + scaleZ: 0.15222998 + XmlUI: '' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1648844222670132435/57FEED3CAF7C0E600A581CCE278A67FEAE814FF9/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 7 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3068ef +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Infinite_Bag +Nickname: Evidence Tokens +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -22.61 + posY: 1.37 + posZ: -88.27 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.8 + scaleY: 0.8 + scaleZ: 0.8 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Tile Artifact Expansion User Guide 871d2f.yaml b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Tile Artifact Expansion User Guide 871d2f.yaml new file mode 100644 index 000000000..5f1ffb8b0 --- /dev/null +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Tile Artifact Expansion User Guide 871d2f.yaml @@ -0,0 +1,182 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.2 + Type: 0 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1648844222670802942/7235916DF2C386905A18E4CC2A896700A019786A/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1648844222670802942/7235916DF2C386905A18E4CC2A896700A019786A/ + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 871d2f +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Artifact Expansion User Guide +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.2 + Type: 0 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1648844222670809404/8FD6EF1B4D0832E6D79CFDF330E219D5381BD720/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1648844222670809404/8FD6EF1B4D0832E6D79CFDF330E219D5381BD720/ + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d46174 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: Artifact Expansion User Guide + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 1.54663408 + posY: 0.9600003 + posZ: 7.8127 + rotX: -3.93674648e-10 + rotY: 180.023651 + rotZ: -6.471604e-08 + scaleX: 4.37573433 + scaleY: 1.0 + scaleZ: 4.37573433 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.2 + Type: 0 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1648844222671510230/B2AA812E00DEBE1E7F55553CC866C4D1160FF6F8/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1648844222671510230/B2AA812E00DEBE1E7F55553CC866C4D1160FF6F8/ + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: d5a293 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: Artifact Expansion User Guide + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.44952822 + posY: 0.9600003 + posZ: 5.40980339 + rotX: -2.44964991e-08 + rotY: 180.023682 + rotZ: -1.81774844e-08 + scaleX: 4.37573433 + scaleY: 1.0 + scaleZ: 4.37573433 + XmlUI: '' + '4': + Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.2 + Type: 0 + ImageScalar: 1.0 + ImageSecondaryURL: 'http://cloud-3.steamusercontent.com/ugc/1648844222670814500/8D26772290572CD19251BFE238B84D5C40754B23/ + + ' + ImageURL: http://cloud-3.steamusercontent.com/ugc/1648844222670814500/8D26772290572CD19251BFE238B84D5C40754B23/ + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 57c3db + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: Artifact Expansion User Guide + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 1.54663408 + posY: 0.9600003 + posZ: 7.8127 + rotX: 9.711853e-09 + rotY: 180.023651 + rotZ: -1.03009157e-07 + scaleX: 4.37573433 + scaleY: 1.0 + scaleZ: 4.37573433 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -25.18 + posY: 1.49 + posZ: -43.27 + rotX: 0.0 + rotY: 270.0 + rotZ: 1.03 + scaleX: 4.38 + scaleY: 1.0 + scaleZ: 4.38 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Bless tokens afa06b.yaml b/unpacked/Custom_Model_Bag Bless tokens afa06b.yaml index 0c32c11df..c268513bc 100644 --- a/unpacked/Custom_Model_Bag Bless tokens afa06b.yaml +++ b/unpacked/Custom_Model_Bag Bless tokens afa06b.yaml @@ -53,11 +53,11 @@ Sticky: true Tooltip: true Transform: posX: -45.93 - posY: 1.75 + posY: 1.72 posZ: 4.25 - rotX: 359.92 - rotY: 270.0 - rotZ: 0.02 + rotX: 359.93 + rotY: 255.0 + rotZ: 0.04 scaleX: 0.7 scaleY: 0.7 scaleZ: 0.7 diff --git a/unpacked/Custom_Model_Bag Chaos Bag fea079.ttslua b/unpacked/Custom_Model_Bag Chaos Bag fea079.ttslua index eba7fa0dc..3d2f7ab59 100644 --- a/unpacked/Custom_Model_Bag Chaos Bag fea079.ttslua +++ b/unpacked/Custom_Model_Bag Chaos Bag fea079.ttslua @@ -1,5 +1,5 @@ -function onCollisionEnter(collision_info) - self.shuffle() - self.shuffle() - self.shuffle() +function onCollisionEnter(collision_info) + self.shuffle() + self.shuffle() + self.shuffle() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Chaos Bag fea079/Custom_Tile.yaml b/unpacked/Custom_Model_Bag Chaos Bag fea079/Custom_Tile.yaml index 346640696..89fccaef7 100644 --- a/unpacked/Custom_Model_Bag Chaos Bag fea079/Custom_Tile.yaml +++ b/unpacked/Custom_Model_Bag Chaos Bag fea079/Custom_Tile.yaml @@ -11,7 +11,7 @@ CustomImage: Type: 2 ImageScalar: 1.0 ImageSecondaryURL: '' - ImageURL: https://i.imgur.com/1plY463.png + ImageURL: https://i.imgur.com/btEtVfd.png WidthScale: 0.0 Description: '' DragSelectable: true @@ -32,9 +32,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: -3.86 + posX: -4.01 posY: 4.58 - posZ: -14.84 + posZ: -14.93 rotX: 0.0 rotY: 260.0 rotZ: 0.0 diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6.ttslua index e8a8f39de..a1bbfd97e 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,5,-2}, rotation={0,0,0}, height=250, width=600, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * 4 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={1.5,5,2}, rotation={0,0,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.2,5,2}, rotation={0,0,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-3.5,5,2}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Clicker", click_function="buttonClick_place", function_owner=self, - position={4.2,1,0}, rotation={0,0,0}, height=500, width=1100, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Counter", click_function="buttonClick_recall", function_owner=self, - position={-4.2,1,-0.1}, rotation={0,0,0}, height=500, width=1300, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-6,1,0}, rotation={0,90,0}, height=500, width=1200, --- font_size=350, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,5,-2}, rotation={0,0,0}, height=250, width=600, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * 4 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={1.5,5,2}, rotation={0,0,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.2,5,2}, rotation={0,0,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-3.5,5,2}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Clicker", click_function="buttonClick_place", function_owner=self, + position={4.2,1,0}, rotation={0,0,0}, height=500, width=1100, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Counter", click_function="buttonClick_recall", function_owner=self, + position={-4.2,1,-0.1}, rotation={0,0,0}, height=500, width=1300, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-6,1,0}, rotation={0,90,0}, height=500, width=1200, +-- font_size=350, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Doom counter 19768a.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Doom counter 19768a.ttslua index 7aacde2cb..ee5b7a827 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Doom counter 19768a.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Doom counter 19768a.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {1,1,1,95} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {1,1,1,95} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 3f22e5.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 3f22e5.ttslua index df6f93a6c..167a90f72 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 3f22e5.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 3f22e5.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 4111de.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 4111de.ttslua index df6f93a6c..167a90f72 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 4111de.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 4111de.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 891403.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 891403.ttslua index df6f93a6c..167a90f72 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 891403.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 891403.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources db85d6.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources db85d6.ttslua index df6f93a6c..167a90f72 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources db85d6.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources db85d6.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7.yaml b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7.yaml index fa273dcb8..7d00a2fc3 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7.yaml +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7.yaml @@ -8,6 +8,8 @@ ContainedObjects: Strange Aeons Custom Investigators 991ff9.yaml' - !include 'Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Pokemon Eldritch Edition Custom Investigators 1fb7ce.yaml' +- !include 'Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag + Maximillion Pegasus Custom Investigator 84be1d.yaml' - !include 'Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65.yaml' - !include 'Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Delta Green Convergence Custom Investigators 84be1d.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Delta Green Convergence Custom Investigators 84be1d.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Delta Green Convergence Custom Investigators 84be1d.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Delta Green Convergence Custom Investigators 84be1d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Gender Swapped Investigators 33272e.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Gender Swapped Investigators 33272e.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Gender Swapped Investigators 33272e.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Gender Swapped Investigators 33272e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Idol Thoughts Custom Investigators 991ff9.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Idol Thoughts Custom Investigators 991ff9.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Idol Thoughts Custom Investigators 991ff9.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Idol Thoughts Custom Investigators 991ff9.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Investigators fba392.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Investigators fba392.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Investigators fba392.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Investigators fba392.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Player Cards 64ad17.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Player Cards 64ad17.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Player Cards 64ad17.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Player Cards 64ad17.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.ttslua similarity index 96% rename from unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.ttslua rename to unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.yaml b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.yaml similarity index 97% rename from unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.yaml rename to unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.yaml index 1792f406e..01dba07f8 100644 --- a/unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.yaml +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.yaml @@ -64,10 +64,10 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 32.54 - posY: 1.43 - posZ: -16.28 - rotX: 359.92 + posX: -35.83 + posY: 3.16 + posZ: -93.11 + rotX: 0.02 rotY: 270.0 rotZ: 0.02 scaleX: 1.36 diff --git a/unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Maximillion Pegasus 16ccdc.yaml b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Maximillion Pegasus 16ccdc.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Maximillion Pegasus 16ccdc.yaml rename to unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Maximillion Pegasus 16ccdc.yaml diff --git a/unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Maximillion Pegasus 3ff7c0.yaml b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Maximillion Pegasus 3ff7c0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Maximillion Pegasus 3ff7c0.yaml rename to unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Maximillion Pegasus 3ff7c0.yaml diff --git a/unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Millennium Eye ef8ae4.yaml b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Millennium Eye ef8ae4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Millennium Eye ef8ae4.yaml rename to unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/CardCustom Millennium Eye ef8ae4.yaml diff --git a/unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/Deck 8a25c7.yaml b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/Deck 8a25c7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/Deck 8a25c7.yaml rename to unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d/Deck 8a25c7.yaml diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Pokemon Eldritch Edition Custom Investigators 1fb7ce.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Pokemon Eldritch Edition Custom Investigators 1fb7ce.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Pokemon Eldritch Edition Custom Investigators 1fb7ce.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Pokemon Eldritch Edition Custom Investigators 1fb7ce.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Strange Aeons Custom Investigators 991ff9.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Strange Aeons Custom Investigators 991ff9.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Strange Aeons Custom Investigators 991ff9.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Strange Aeons Custom Investigators 991ff9.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 2585f4.ttslua b/unpacked/Custom_Model_Bag Core 2585f4.ttslua index 4798d294b..daed6bf90 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4.ttslua +++ b/unpacked/Custom_Model_Bag Core 2585f4.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 2585f4.yaml b/unpacked/Custom_Model_Bag Core 2585f4.yaml index ed406d973..756c3c0e2 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4.yaml @@ -4,15 +4,15 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: +- !include 'Custom_Model_Bag Core 2585f4/Deck Agnes Bakers d3cab5.yaml' - !include 'Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254.yaml' - !include 'Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb.yaml' - !include 'Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 0d6388.yaml' - !include 'Custom_Model_Bag Core 2585f4/Custom_Model Turn token 0de2c4.yaml' -- !include 'Custom_Model_Bag Core 2585f4/Deck Skids O''Tooles 12cc48.yaml' - !include 'Custom_Model_Bag Core 2585f4/Deck Roland Banks 171f17.yaml' - !include 'Custom_Model_Bag Core 2585f4/Deck Daisy Walkers 1f564c.yaml' - !include 'Custom_Model_Bag Core 2585f4/Custom_Model Turn token 226716.yaml' -- !include 'Custom_Model_Bag Core 2585f4/Card Agnes Baker 25e2db.yaml' +- !include 'Custom_Model_Bag Core 2585f4/Deck Skids O''Tooles 2e7dd9.yaml' - !include 'Custom_Model_Bag Core 2585f4/Custom_Model Turn token 307044.yaml' - !include 'Custom_Model_Bag Core 2585f4/Custom_Model Turn token 3ddfeb.yaml' - !include 'Custom_Model_Bag Core 2585f4/Custom_Model Survivor turn token 41bfc7.yaml' @@ -62,7 +62,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: false LuaScript: !include 'Custom_Model_Bag Core 2585f4.ttslua' -LuaScriptState: '{"ml":{"011254":{"lock":false,"pos":{"x":-26.3001747131348,"y":1.2688113451004,"z":-76.9456329345703},"rot":{"x":359.979156494141,"y":90.0006866455078,"z":359.983215332031}},"02abdb":{"lock":false,"pos":{"x":-26.3001766204834,"y":1.27112019062042,"z":-69.0605773925781},"rot":{"x":359.979156494141,"y":90.0000305175781,"z":359.983215332031}},"0d6388":{"lock":false,"pos":{"x":-26.3001327514648,"y":1.27340865135193,"z":-61.2409515380859},"rot":{"x":359.979156494141,"y":90.0000534057617,"z":359.983215332031}},"0de2c4":{"lock":false,"pos":{"x":-16.6400833129883,"y":1.35995435714722,"z":-67.8205947875977},"rot":{"x":0.0208164975047112,"y":269.999755859375,"z":0.0167679879814386}},"12cc48":{"lock":false,"pos":{"x":-22.6156921386719,"y":1.33760368824005,"z":-69.0756149291992},"rot":{"x":0.0167714338749647,"y":179.999954223633,"z":359.979187011719}},"171f17":{"lock":false,"pos":{"x":-22.6139030456543,"y":1.33255350589752,"z":-53.4381294250488},"rot":{"x":0.0167775619775057,"y":180.016952514648,"z":359.979187011719}},"1f564c":{"lock":false,"pos":{"x":-22.6169605255127,"y":1.33989644050598,"z":-61.2413864135742},"rot":{"x":0.016771212220192,"y":179.999450683594,"z":359.979187011719}},"226716":{"lock":false,"pos":{"x":-16.640079498291,"y":1.35923135280609,"z":-70.2905960083008},"rot":{"x":0.0208167769014835,"y":269.999542236328,"z":0.0167677421122789}},"25e2db":{"lock":false,"pos":{"x":-22.6157627105713,"y":1.30871796607971,"z":-76.946044921875},"rot":{"x":0.0167755242437124,"y":180.00993347168,"z":359.979187011719}},"307044":{"lock":false,"pos":{"x":-16.6402435302734,"y":1.35497868061066,"z":-84.8182067871094},"rot":{"x":0.0208238437771797,"y":270.022247314453,"z":0.0167761370539665}},"3ddfeb":{"lock":false,"pos":{"x":-16.6394100189209,"y":1.35462772846222,"z":-86.0186004638672},"rot":{"x":0.020834669470787,"y":269.999542236328,"z":0.0167703367769718}},"41bfc7":{"lock":false,"pos":{"x":-16.6551189422607,"y":1.36187708377838,"z":-61.2331466674805},"rot":{"x":0.0208129566162825,"y":270.010894775391,"z":0.0167718883603811}},"4ad11b":{"lock":false,"pos":{"x":-16.6395988464355,"y":1.35728335380554,"z":-76.9456481933594},"rot":{"x":0.0208329018205404,"y":269.999664306641,"z":0.0167719200253487}},"543164":{"lock":false,"pos":{"x":-16.6403007507324,"y":1.35959136486053,"z":-69.0603103637695},"rot":{"x":0.0208166856318712,"y":269.999450683594,"z":0.0167680829763412}},"6330da":{"lock":false,"pos":{"x":-16.6400718688965,"y":1.36381816864014,"z":-54.6207466125488},"rot":{"x":0.0208164323121309,"y":270.000213623047,"z":0.0167676471173763}},"779aa6":{"lock":false,"pos":{"x":-16.6385726928711,"y":1.35535311698914,"z":-83.5415191650391},"rot":{"x":0.0208329558372498,"y":269.998016357422,"z":0.0167713314294815}},"7a6af2":{"lock":false,"pos":{"x":-19.2997856140137,"y":1.30761790275574,"z":-84.8181838989258},"rot":{"x":0.0208053141832352,"y":270.018859863281,"z":0.0167797952890396}},"90ea00":{"lock":false,"pos":{"x":-22.6169128417969,"y":1.30641317367554,"z":-84.8185043334961},"rot":{"x":0.016775356605649,"y":180.010208129883,"z":359.979187011719}},"965031":{"lock":false,"pos":{"x":-19.3000774383545,"y":1.3145215511322,"z":-61.2332534790039},"rot":{"x":0.020807072520256,"y":270.005187988281,"z":0.0167727041989565}},"978a0e":{"lock":false,"pos":{"x":-26.2999935150146,"y":1.27569329738617,"z":-53.4368362426758},"rot":{"x":359.979156494141,"y":90.0003509521484,"z":359.983215332031}},"9e80b9":{"lock":false,"pos":{"x":-16.6400699615479,"y":1.36417829990387,"z":-53.3904228210449},"rot":{"x":0.0208211075514555,"y":269.983795166016,"z":0.0167621057480574}},"bde4a6":{"lock":false,"pos":{"x":-16.6400680541992,"y":1.36454081535339,"z":-52.152027130127},"rot":{"x":0.0208167191594839,"y":269.999755859375,"z":0.0167679768055677}},"bed196":{"lock":false,"pos":{"x":-19.295877456665,"y":1.31223177909851,"z":-69.0607070922852},"rot":{"x":0.0207992251962423,"y":270.031768798828,"z":0.0167825538665056}},"d3b405":{"lock":false,"pos":{"x":-19.3000202178955,"y":1.33375775814056,"z":-53.4358367919922},"rot":{"x":0.0208115503191948,"y":269.99267578125,"z":0.0167677775025368}},"d6fdbf":{"lock":false,"pos":{"x":-16.6400470733643,"y":1.36152327060699,"z":-62.4609298706055},"rot":{"x":0.0208267476409674,"y":269.965209960938,"z":0.0167554561048746}},"d9fb86":{"lock":false,"pos":{"x":-16.6401386260986,"y":1.35692310333252,"z":-78.175651550293},"rot":{"x":0.0208301916718483,"y":270.008666992188,"z":0.0167755205184221}},"dc27c7":{"lock":false,"pos":{"x":-26.2995834350586,"y":1.26650702953339,"z":-84.817985534668},"rot":{"x":359.979156494141,"y":90.0029678344727,"z":359.983215332031}},"de216f":{"lock":false,"pos":{"x":-16.6551265716553,"y":1.36223697662354,"z":-60.0037269592285},"rot":{"x":0.020813399925828,"y":270.010681152344,"z":0.0167720541357994}},"e04b48":{"lock":false,"pos":{"x":-16.6403102874756,"y":1.35764622688293,"z":-75.7054443359375},"rot":{"x":0.0208364613354206,"y":269.987365722656,"z":0.016767356544733}},"e9ad05":{"lock":false,"pos":{"x":-19.2936096191406,"y":1.30992579460144,"z":-76.9415512084961},"rot":{"x":0.020811740309,"y":269.995941162109,"z":0.0167713724076748}}}}' +LuaScriptState: '{"ml":{"011254":{"lock":false,"pos":{"x":-26.3001747131348,"y":1.2687805891037,"z":-76.9456329345703},"rot":{"x":359.979156494141,"y":90.0006866455078,"z":359.983215332031}},"02abdb":{"lock":false,"pos":{"x":-26.3001766204834,"y":1.27108907699585,"z":-69.0605773925781},"rot":{"x":359.979156494141,"y":90.0000305175781,"z":359.983215332031}},"0d6388":{"lock":false,"pos":{"x":-26.3001327514648,"y":1.27337801456451,"z":-61.2409515380859},"rot":{"x":359.979156494141,"y":90.0000534057617,"z":359.983245849609}},"0de2c4":{"lock":false,"pos":{"x":-16.6400833129883,"y":1.35992395877838,"z":-67.8205947875977},"rot":{"x":0.0208168718963861,"y":269.999755859375,"z":0.0167678985744715}},"171f17":{"lock":false,"pos":{"x":-22.6139030456543,"y":1.33252310752869,"z":-53.4381294250488},"rot":{"x":0.0167775936424732,"y":180.016952514648,"z":359.979187011719}},"1f564c":{"lock":false,"pos":{"x":-22.6169605255127,"y":1.33986604213715,"z":-61.2413864135742},"rot":{"x":0.0167712848633528,"y":179.999389648438,"z":359.979187011719}},"226716":{"lock":false,"pos":{"x":-16.640079498291,"y":1.35920095443726,"z":-70.2905960083008},"rot":{"x":0.020816121250391,"y":269.999542236328,"z":0.0167678277939558}},"2e7dd9":{"lock":false,"pos":{"x":-22.6156921386719,"y":1.33757328987122,"z":-69.0756149291992},"rot":{"x":0.016772611066699,"y":180.002975463867,"z":359.979187011719}},"307044":{"lock":false,"pos":{"x":-16.6402435302734,"y":1.35494840145111,"z":-84.8182067871094},"rot":{"x":0.0208094026893377,"y":270.022247314453,"z":0.0167760271579027}},"3ddfeb":{"lock":false,"pos":{"x":-16.6394100189209,"y":1.35459744930267,"z":-86.0186004638672},"rot":{"x":0.0208168178796768,"y":269.999542236328,"z":0.0167677383869886}},"41bfc7":{"lock":false,"pos":{"x":-16.6551189422607,"y":1.36184680461884,"z":-61.2331466674805},"rot":{"x":0.0208136532455683,"y":270.010894775391,"z":0.0167719274759293}},"4ad11b":{"lock":false,"pos":{"x":-16.6395988464355,"y":1.35725319385529,"z":-76.9456481933594},"rot":{"x":0.0208164155483246,"y":269.999664306641,"z":0.0167681090533733}},"543164":{"lock":false,"pos":{"x":-16.6403007507324,"y":1.35956108570099,"z":-69.0603103637695},"rot":{"x":0.0208165682852268,"y":269.999450683594,"z":0.0167680103331804}},"6330da":{"lock":false,"pos":{"x":-16.6400718688965,"y":1.3637877702713,"z":-54.6207466125488},"rot":{"x":0.0208168029785156,"y":270.000213623047,"z":0.016768105328083}},"779aa6":{"lock":false,"pos":{"x":-16.6385726928711,"y":1.35532283782959,"z":-83.5415191650391},"rot":{"x":0.020816907286644,"y":269.998016357422,"z":0.0167672354727983}},"7a6af2":{"lock":false,"pos":{"x":-19.2997856140137,"y":1.30758762359619,"z":-84.8181838989258},"rot":{"x":0.0208030845969915,"y":270.018859863281,"z":0.0167777817696333}},"90ea00":{"lock":false,"pos":{"x":-22.6169128417969,"y":1.3063827753067,"z":-84.8185043334961},"rot":{"x":0.0167749840766191,"y":180.010162353516,"z":359.979187011719}},"965031":{"lock":false,"pos":{"x":-19.3000774383545,"y":1.31449115276337,"z":-61.2332534790039},"rot":{"x":0.0208072941750288,"y":270.005187988281,"z":0.0167727172374725}},"978a0e":{"lock":false,"pos":{"x":-26.2999935150146,"y":1.2756621837616,"z":-53.4368362426758},"rot":{"x":359.979187011719,"y":90.000358581543,"z":359.983215332031}},"9e80b9":{"lock":false,"pos":{"x":-16.6400699615479,"y":1.36414790153503,"z":-53.3904228210449},"rot":{"x":0.0208210311830044,"y":269.983795166016,"z":0.0167619772255421}},"bde4a6":{"lock":false,"pos":{"x":-16.6400680541992,"y":1.36451029777527,"z":-52.152027130127},"rot":{"x":0.0208169389516115,"y":269.999755859375,"z":0.0167679786682129}},"bed196":{"lock":false,"pos":{"x":-19.295877456665,"y":1.31220149993896,"z":-69.0607070922852},"rot":{"x":0.0207994971424341,"y":270.031768798828,"z":0.0167825259268284}},"d3b405":{"lock":false,"pos":{"x":-19.3000202178955,"y":1.33372735977173,"z":-53.4358367919922},"rot":{"x":0.0208113174885511,"y":269.99267578125,"z":0.0167684387415648}},"d3cab5":{"lock":false,"pos":{"x":-22.6157627105713,"y":1.33526945114136,"z":-76.946044921875},"rot":{"x":0.016772435978055,"y":179.999969482422,"z":359.979187011719}},"d6fdbf":{"lock":false,"pos":{"x":-16.6400470733643,"y":1.36149299144745,"z":-62.4609298706055},"rot":{"x":0.0208268687129021,"y":269.965209960938,"z":0.0167554784566164}},"d9fb86":{"lock":false,"pos":{"x":-16.6401386260986,"y":1.35689294338226,"z":-78.175651550293},"rot":{"x":0.0208142194896936,"y":270.008666992188,"z":0.0167710538953543}},"dc27c7":{"lock":false,"pos":{"x":-26.2995834350586,"y":1.26647651195526,"z":-84.817985534668},"rot":{"x":359.979156494141,"y":90.0029678344727,"z":359.983215332031}},"de216f":{"lock":false,"pos":{"x":-16.6551265716553,"y":1.36220669746399,"z":-60.0037269592285},"rot":{"x":0.020813288167119,"y":270.010681152344,"z":0.0167718790471554}},"e04b48":{"lock":false,"pos":{"x":-16.6403102874756,"y":1.35761594772339,"z":-75.7054443359375},"rot":{"x":0.0208204388618469,"y":269.987365722656,"z":0.0167635157704353}},"e9ad05":{"lock":false,"pos":{"x":-19.2936096191406,"y":1.30989539623261,"z":-76.9415512084961},"rot":{"x":0.0208097249269485,"y":269.995941162109,"z":0.0167692024260759}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Card Agnes Baker 25e2db.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Card Agnes Baker 25e2db.yaml deleted file mode 100644 index ca4a5511b..000000000 --- a/unpacked/Custom_Model_Bag Core 2585f4/Card Agnes Baker 25e2db.yaml +++ /dev/null @@ -1,45 +0,0 @@ -Autoraise: true -CardID: 535403 -ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 -CustomDeck: - '5354': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1011562618093845464/80687C9319FA2015F3D9F7CBEB4C55FBF045B27D/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093845971/A678BD374EC4DE672206B5EF7EB57DC885BC839C/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: true -Description: The Waitress -DragSelectable: true -GMNotes: '' -GUID: 25e2db -Grid: true -GridProjection: false -Hands: true -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: '' -LuaScriptState: '' -MeasureMovement: false -Name: Card -Nickname: Agnes Baker -SidewaysCard: true -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: -22.62 - posY: 1.31 - posZ: -76.95 - rotX: 0.02 - rotY: 180.01 - rotZ: 359.98 - scaleX: 1.1 - scaleY: 1.0 - scaleZ: 1.1 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Card Wendy Adams 90ea00.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Card Wendy Adams 90ea00.yaml index a4d002533..767c3042a 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Card Wendy Adams 90ea00.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Card Wendy Adams 90ea00.yaml @@ -1,11 +1,11 @@ Autoraise: true -CardID: 535404 +CardID: 535704 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '5354': + '5357': BackIsHidden: true BackURL: http://cloud-3.steamusercontent.com/ugc/1011562618093845464/80687C9319FA2015F3D9F7CBEB4C55FBF045B27D/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093845971/A678BD374EC4DE672206B5EF7EB57DC885BC839C/ diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254.yaml index 8ce05c234..9e1e03a9b 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254.yaml @@ -4,9 +4,12 @@ ColorDiffuse: g: 0.00100758043 r: 0.02148666 ContainedObjects: +- !include 'Custom_Model_Bag starter deck & cards 011254/Card Dark Memory 382dfd.yaml' +- !include 'Custom_Model_Bag starter deck & cards 011254/Card Heirloom of Hyperborea + 492fcf.yaml' +- !include 'Custom_Model_Bag starter deck & cards 011254/Card Dark Memory 7275bc.yaml' - !include 'Custom_Model_Bag starter deck & cards 011254/Card Heirloom of Hyberborea 576d70.yaml' -- !include 'Custom_Model_Bag starter deck & cards 011254/Card Dark Memory 7275bc.yaml' - !include 'Custom_Model_Bag starter deck & cards 011254/Deck 456740.yaml' CustomMesh: CastShadows: true diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Dark Memory 382dfd.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Dark Memory 382dfd.yaml new file mode 100644 index 000000000..33a77fa56 --- /dev/null +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Dark Memory 382dfd.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266201 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2662': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038865190/8B0106D5599808B6E00387C2535AC1C3F2330034/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false +Description: Advanced +DragSelectable: true +GMNotes: '' +GUID: 382dfd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dark Memory +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -24.29 + posY: 5.33 + posZ: -82.05 + rotX: 0.0 + rotY: 270.01 + rotZ: 5.25 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Dark Memory 7275bc.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Dark Memory 7275bc.yaml index b29962a09..70cef79fb 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Dark Memory 7275bc.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Dark Memory 7275bc.yaml @@ -13,7 +13,7 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false -Description: '' +Description: Signature DragSelectable: true GMNotes: '' GUID: 7275bc @@ -33,12 +33,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 78.04 - posY: 2.53 - posZ: -76.72 - rotX: 0.0 + posX: -26.04 + posY: 2.85 + posZ: -123.87 + rotX: 0.02 rotY: 270.0 - rotZ: 359.99 + rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Heirloom of Hyberborea 576d70.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Heirloom of Hyberborea 576d70.yaml index b130129d3..9592e2c80 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Heirloom of Hyberborea 576d70.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Heirloom of Hyberborea 576d70.yaml @@ -13,7 +13,7 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false -Description: '' +Description: Artifact from Another Life DragSelectable: true GMNotes: '' GUID: 576d70 @@ -33,12 +33,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 77.06 - posY: 2.53 - posZ: -77.38 - rotX: 0.0 + posX: -22.81 + posY: 2.85 + posZ: -117.42 + rotX: 0.02 rotY: 270.02 - rotZ: 359.99 + rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Heirloom of Hyperborea 492fcf.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Heirloom of Hyperborea 492fcf.yaml new file mode 100644 index 000000000..ac2a95ab3 --- /dev/null +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Card Heirloom of Hyperborea 492fcf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266200 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2662': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038865190/8B0106D5599808B6E00387C2535AC1C3F2330034/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false +Description: Artifact from Another Life (Advanced) +DragSelectable: true +GMNotes: '' +GUID: 492fcf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Heirloom of Hyperborea +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.0 + posY: 3.18 + posZ: -91.83 + rotX: 0.0 + rotY: 269.98 + rotZ: 0.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Deck 456740.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Deck 456740.yaml index 6097ee7f0..1468399df 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Deck 456740.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 011254/Deck 456740.yaml @@ -1369,10 +1369,10 @@ ContainedObjects: NumWidth: 10 Type: 0 UniqueBack: false - Description: '' + Description: Artifact from Another Life DragSelectable: true GMNotes: '' - GUID: 4791d2 + GUID: 57d017 Grid: true GridProjection: false Hands: true @@ -1389,12 +1389,12 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 61.8799744 - posY: 0.8642186 - posZ: -27.9809475 - rotX: -0.00403074874 - rotY: 270.022064 - rotZ: 359.986938 + posX: -40.8312225 + posY: 1.63653362 + posZ: -77.66544 + rotX: 0.0207983162 + rotY: 270.0215 + rotZ: 0.0168065485 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -1414,10 +1414,10 @@ ContainedObjects: NumWidth: 10 Type: 0 UniqueBack: false - Description: '' + Description: Signature DragSelectable: true GMNotes: '' - GUID: 144a66 + GUID: c107c7 Grid: true GridProjection: false Hands: true @@ -1434,12 +1434,12 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 62.4311066 - posY: 0.87170136 - posZ: -28.46531 - rotX: 359.945251 - rotY: 269.9016 - rotZ: 359.9788 + posX: -40.7064362 + posY: 1.64622319 + posZ: -77.6527557 + rotX: 0.0208045021 + rotY: 269.998718 + rotZ: 0.0167961717 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -1538,12 +1538,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 92.22 - posY: 3.55 - posZ: -83.32 + posX: -40.31 + posY: 3.33 + posZ: -87.49 rotX: 0.02 - rotY: 269.99 - rotZ: 179.99 + rotY: 270.0 + rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb.yaml index c1e70b254..77919eb57 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb.yaml @@ -8,7 +8,7 @@ ContainedObjects: 69ea79.yaml' - !include 'Custom_Model_Bag starter deck & cards 02abdb/CardCustom On the Lam 6f4e94.yaml' - !include 'Custom_Model_Bag starter deck & cards 02abdb/Card Hospital Debts 527f1c.yaml' -- !include 'Custom_Model_Bag starter deck & cards 02abdb/Card On the Lam 02777c.yaml' +- !include 'Custom_Model_Bag starter deck & cards 02abdb/Card On the Lam 2149a1.yaml' - !include 'Custom_Model_Bag starter deck & cards 02abdb/Deck 5dd52a.yaml' CustomMesh: CastShadows: true diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Card Hospital Debts 527f1c.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Card Hospital Debts 527f1c.yaml index 74d13cb9c..f855615ea 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Card Hospital Debts 527f1c.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Card Hospital Debts 527f1c.yaml @@ -1,11 +1,11 @@ Autoraise: true -CardID: 230625 +CardID: 431425 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2306': + '4314': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ @@ -13,7 +13,7 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false -Description: '' +Description: Signature DragSelectable: true GMNotes: '' GUID: 527f1c @@ -33,12 +33,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 77.27 - posY: 2.53 - posZ: -51.83 - rotX: 0.01 - rotY: 270.02 - rotZ: 0.0 + posX: -0.77 + posY: 3.33 + posZ: -84.66 + rotX: 0.0 + rotY: 270.01 + rotZ: 7.63 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Card On the Lam 02777c.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Card On the Lam 2149a1.yaml similarity index 84% rename from unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Card On the Lam 02777c.yaml rename to unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Card On the Lam 2149a1.yaml index 48815988b..c2a60e195 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Card On the Lam 02777c.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Card On the Lam 2149a1.yaml @@ -1,11 +1,11 @@ Autoraise: true -CardID: 230524 +CardID: 369424 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2305': + '3694': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ @@ -13,10 +13,10 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false -Description: '' +Description: Signature DragSelectable: true GMNotes: '' -GUID: 02777c +GUID: 2149a1 Grid: true GridProjection: false Hands: true @@ -33,12 +33,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 77.62 - posY: 2.48 - posZ: -48.81 + posX: 1.05 + posY: 3.2 + posZ: -80.35 rotX: 0.0 - rotY: 270.02 - rotZ: 357.25 + rotY: 270.01 + rotZ: 359.32 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Deck 5dd52a.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Deck 5dd52a.yaml index 3049f7efd..d126ff118 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Deck 5dd52a.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 02abdb/Deck 5dd52a.yaml @@ -5,13 +5,13 @@ ColorDiffuse: r: 0.713235259 ContainedObjects: - Autoraise: true - CardID: 230625 + CardID: 431425 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2306': + '4314': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ @@ -19,10 +19,10 @@ ContainedObjects: NumWidth: 10 Type: 0 UniqueBack: false - Description: '' + Description: Signature DragSelectable: true GMNotes: '' - GUID: a3499c + GUID: f3da5d Grid: true GridProjection: false Hands: true @@ -39,24 +39,24 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 67.850914 - posY: 0.874835432 - posZ: -31.6836681 - rotX: 359.994263 - rotY: 270.018738 - rotZ: 179.993561 + posX: -19.8511028 + posY: 1.68134236 + posZ: -46.0328941 + rotX: 359.9786 + rotY: 270.005157 + rotZ: 180.525757 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 230524 + CardID: 369424 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2305': + '3694': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ @@ -64,10 +64,10 @@ ContainedObjects: NumWidth: 10 Type: 0 UniqueBack: false - Description: '' + Description: Signature DragSelectable: true GMNotes: '' - GUID: 8e0e7d + GUID: 2149a1 Grid: true GridProjection: false Hands: true @@ -84,12 +84,12 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 67.38453 - posY: 0.867153764 - posZ: -31.5720673 - rotX: -0.003956983 - rotY: 269.999817 - rotZ: 179.9987 + posX: -19.255415 + posY: 1.67728472 + posZ: -45.8211861 + rotX: 0.04008932 + rotY: 270.008881 + rotZ: 180.947861 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -1485,7 +1485,7 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false - '2305': + '3694': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ @@ -1493,7 +1493,7 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false - '2306': + '4314': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ @@ -1502,8 +1502,8 @@ CustomDeck: Type: 0 UniqueBack: false DeckIDs: -- 230625 -- 230524 +- 431425 +- 369424 - 226326 - 226323 - 226319 @@ -1554,12 +1554,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: -26.29 - posY: 3.59 - posZ: -69.06 - rotX: 2.08 - rotY: 270.02 - rotZ: 180.03 + posX: -5.35 + posY: 3.36 + posZ: -68.08 + rotX: 0.05 + rotY: 269.99 + rotZ: 179.22 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 0d6388/Card Daisy's Tote Bag 321cb7.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 0d6388/Card Daisy's Tote Bag 321cb7.yaml index f1dfd7187..f9d20f3c8 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 0d6388/Card Daisy's Tote Bag 321cb7.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 0d6388/Card Daisy's Tote Bag 321cb7.yaml @@ -1,11 +1,11 @@ Autoraise: true -CardID: 230522 +CardID: 370422 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2305': + '3704': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ @@ -13,7 +13,7 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false -Description: '' +Description: Signature DragSelectable: true GMNotes: '' GUID: 321cb7 @@ -33,11 +33,11 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: -7.91 - posY: 3.88 - posZ: -89.49 + posX: -2.8 + posY: 3.19 + posZ: -74.15 rotX: 0.02 - rotY: 270.02 + rotY: 270.01 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 0d6388/Deck a9c187.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 0d6388/Deck a9c187.yaml index bc0d7046f..06dea8be2 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 0d6388/Deck a9c187.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Custom_Model_Bag starter deck & cards 0d6388/Deck a9c187.yaml @@ -39,12 +39,12 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 90.54532 - posY: 0.529666841 - posZ: -27.199995 - rotX: 0.032413993 - rotY: 270.047 - rotZ: 0.008115746 + posX: -23.2864571 + posY: 1.6683079 + posZ: -48.54394 + rotX: 0.0168709811 + rotY: 270.000061 + rotZ: 179.725388 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -1354,51 +1354,6 @@ ContainedObjects: scaleY: 1.0 scaleZ: 1.0 XmlUI: '' -- Autoraise: true - CardID: 230522 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2305': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: 9316b5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Daisy's Tote Bag - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 76.20382 - posY: 0.8640304 - posZ: -34.05001 - rotX: -0.0044622547 - rotY: 270.021362 - rotZ: 359.991547 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' - Autoraise: true CardID: 230623 ColorDiffuse: @@ -1444,6 +1399,51 @@ ContainedObjects: scaleY: 1.0 scaleZ: 1.0 XmlUI: '' +- Autoraise: true + CardID: 370422 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3704': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Signature + DragSelectable: true + GMNotes: '' + GUID: db604b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Daisy's Tote Bag + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -24.9536629 + posY: 5.236405 + posZ: -69.10457 + rotX: 0.0208051223 + rotY: 270.011841 + rotZ: 0.0167752225 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' CustomDeck: '2096': BackIsHidden: true @@ -1469,7 +1469,7 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false - '2305': + '2306': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ @@ -1477,7 +1477,7 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false - '2306': + '3704': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ @@ -1516,8 +1516,8 @@ DeckIDs: - 230431 - 230426 - 230421 -- 230522 - 230623 +- 370422 Description: '' DragSelectable: true GMNotes: '' @@ -1540,7 +1540,7 @@ Tooltip: true Transform: posX: -26.3 posY: 3.54 - posZ: -53.44 + posZ: -61.24 rotX: 0.02 rotY: 270.0 rotZ: 180.02 diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Deck Agnes Bakers d3cab5.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Deck Agnes Bakers d3cab5.yaml new file mode 100644 index 000000000..b8426c4ec --- /dev/null +++ b/unpacked/Custom_Model_Bag Core 2585f4/Deck Agnes Bakers d3cab5.yaml @@ -0,0 +1,238 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 266306 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true + Description: The Waitress + DragSelectable: true + GMNotes: '' + GUID: 909f30 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Agnes Baker (Parallel Back) + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -16.29803 + posY: 1.513605 + posZ: -42.5694542 + rotX: -2.94774418e-06 + rotY: 180.0 + rotZ: -1.1123092e-05 + scaleX: 1.1 + scaleY: 1.0 + scaleZ: 1.1 + XmlUI: '' +- Autoraise: true + CardID: 266305 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true + Description: The Waitress + DragSelectable: true + GMNotes: '' + GUID: 02db0a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Agnes Baker (Parallel Front) + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -16.1579666 + posY: 1.54481328 + posZ: -42.49419 + rotX: 0.00335320574 + rotY: 180.000015 + rotZ: -0.004172777 + scaleX: 1.1 + scaleY: 1.0 + scaleZ: 1.1 + XmlUI: '' +- Autoraise: true + CardID: 266304 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true + Description: The Waitress + DragSelectable: true + GMNotes: '' + GUID: 01b6ef + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Agnes Baker (Parallel) + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -16.4078121 + posY: 1.63107157 + posZ: -42.5793877 + rotX: 1.7893393 + rotY: 180.012772 + rotZ: 0.001575543 + scaleX: 1.1 + scaleY: 1.0 + scaleZ: 1.1 + XmlUI: '' +- Autoraise: true + CardID: 535603 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5356': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1011562618093845464/80687C9319FA2015F3D9F7CBEB4C55FBF045B27D/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093845971/A678BD374EC4DE672206B5EF7EB57DC885BC839C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true + Description: The Waitress + DragSelectable: true + GMNotes: '' + GUID: 25e2db + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Agnes Baker + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -16.1557674 + posY: 1.59494185 + posZ: -42.4812126 + rotX: 0.227799878 + rotY: 179.968124 + rotZ: -0.004157332 + scaleX: 1.1 + scaleY: 1.0 + scaleZ: 1.1 + XmlUI: '' +CustomDeck: + '2663': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true + '5356': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1011562618093845464/80687C9319FA2015F3D9F7CBEB4C55FBF045B27D/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093845971/A678BD374EC4DE672206B5EF7EB57DC885BC839C/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +DeckIDs: +- 266306 +- 266305 +- 266304 +- 535603 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d3cab5 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Agnes Bakers +SidewaysCard: true +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -22.62 + posY: 1.34 + posZ: -76.95 + rotX: 0.02 + rotY: 180.0 + rotZ: 359.98 + scaleX: 1.1 + scaleY: 1.0 + scaleZ: 1.1 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Deck Daisy Walkers 1f564c.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Deck Daisy Walkers 1f564c.yaml index 7d97215c6..a4d2ba33d 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Deck Daisy Walkers 1f564c.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Deck Daisy Walkers 1f564c.yaml @@ -95,24 +95,24 @@ ContainedObjects: scaleZ: 1.1 XmlUI: '' - Autoraise: true - CardID: 232000 + CardID: 270201 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2320': + '2702': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1017195287736547357/1E906AD9E4FCA8FE6C801B6C478D06484219C355/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1017195287736547182/E9E6AA92778B14BA7BFAEC97F69CEEA08D1F0A7A/ - NumHeight: 1 - NumWidth: 1 + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154537387/9BBCF9ACFA26E3C0649434C832E5681AB731A77B/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154536333/92BABC93BFBC5E1DA2C2A7B5EA5E62151E0DE3D7/ + NumHeight: 2 + NumWidth: 3 Type: 0 - UniqueBack: false + UniqueBack: true Description: The Librarian DragSelectable: true GMNotes: '' - GUID: b2d4e6 + GUID: '282857' Grid: true GridProjection: false Hands: true @@ -122,19 +122,19 @@ ContainedObjects: LuaScript: '' LuaScriptState: '' MeasureMovement: false - Name: CardCustom + Name: Card Nickname: Daisy Walker (Parallel) SidewaysCard: true Snap: true Sticky: true Tooltip: true Transform: - posX: 6.16175938 - posY: 1.72549057 - posZ: 25.9675388 - rotX: 0.01688088 - rotY: 179.9925 - rotZ: 0.07987741 + posX: -19.6710472 + posY: 1.38062072 + posZ: -57.3005066 + rotX: 0.0134165641 + rotY: 180.0 + rotZ: 359.983337 scaleX: 1.1 scaleY: 1.0 scaleZ: 1.1 @@ -174,25 +174,17 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: -22.6169472 - posY: 1.39077866 - posZ: -61.241375 - rotX: 0.013416904 - rotY: 180.0 - rotZ: 359.983368 + posX: -19.3840313 + posY: 1.3903141 + posZ: -57.45226 + rotX: 0.01677008 + rotY: 179.9994 + rotZ: 359.9792 scaleX: 1.1 scaleY: 1.0 scaleZ: 1.1 XmlUI: '' CustomDeck: - '2320': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1017195287736547357/1E906AD9E4FCA8FE6C801B6C478D06484219C355/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1017195287736547182/E9E6AA92778B14BA7BFAEC97F69CEEA08D1F0A7A/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false '2699': BackIsHidden: true BackURL: http://cloud-3.steamusercontent.com/ugc/1011562618093845464/80687C9319FA2015F3D9F7CBEB4C55FBF045B27D/ @@ -201,6 +193,14 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: true + '2702': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154537387/9BBCF9ACFA26E3C0649434C832E5681AB731A77B/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154536333/92BABC93BFBC5E1DA2C2A7B5EA5E62151E0DE3D7/ + NumHeight: 2 + NumWidth: 3 + Type: 0 + UniqueBack: true '2739': BackIsHidden: true BackURL: http://cloud-3.steamusercontent.com/ugc/1017195287736569204/9F5F294127B638FECFF0BC88A0F93387AF994431/ @@ -220,7 +220,7 @@ CustomDeck: DeckIDs: - 273901 - 535101 -- 232000 +- 270201 - 269901 Description: '' DragSelectable: true diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Deck Roland Banks d3b405.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Deck Roland Banks d3b405.yaml index 15795e980..d4e7a82f9 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Deck Roland Banks d3b405.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Deck Roland Banks d3b405.yaml @@ -5,7 +5,7 @@ ColorDiffuse: r: 0.713235259 ContainedObjects: - Autoraise: true - CardID: 535609 + CardID: 535809 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -103,7 +103,7 @@ CustomDeck: NumWidth: 7 Type: 0 UniqueBack: true - '5356': + '5358': BackIsHidden: true BackURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846975/4726098952C64103F2C211D202FFDD40D9D988BB/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869050066760/0DE2BD4589CC8C2F3D26C2900A17ED7A6483062F/ @@ -112,7 +112,7 @@ CustomDeck: Type: 0 UniqueBack: true DeckIDs: -- 535609 +- 535809 - 258600 Description: '' DragSelectable: true diff --git a/unpacked/Custom_Model_Bag Core 2585f4/Deck Skids O'Tooles 12cc48.yaml b/unpacked/Custom_Model_Bag Core 2585f4/Deck Skids O'Tooles 2e7dd9.yaml similarity index 55% rename from unpacked/Custom_Model_Bag Core 2585f4/Deck Skids O'Tooles 12cc48.yaml rename to unpacked/Custom_Model_Bag Core 2585f4/Deck Skids O'Tooles 2e7dd9.yaml index 473c264d5..62ad99846 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4/Deck Skids O'Tooles 12cc48.yaml +++ b/unpacked/Custom_Model_Bag Core 2585f4/Deck Skids O'Tooles 2e7dd9.yaml @@ -5,97 +5,7 @@ ColorDiffuse: r: 0.713235259 ContainedObjects: - Autoraise: true - CardID: 535300 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5353': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1487830597915283398/84DA212BC5846F8BF0D5E78E52FF3C040BC7FEB8/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915296505/475BBEC1DFD3BDBCC405719C2F62DDA006D341D1/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: The Ex-COn - DragSelectable: true - GMNotes: '' - GUID: 751c31 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: '"Skids" O''Toole (Parallel Back)' - SidewaysCard: true - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -46.418354 - posY: 1.30581594 - posZ: -57.32813 - rotX: 0.016771432 - rotY: 180.0 - rotZ: 359.9792 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 535200 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5352': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1487830597915295363/28B8144E012A2748EF06B2388AE702E9003081CC/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915283229/7DCBE01BDCEFB1177B453B93C6E65BFB69AE08C2/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: The Ex-COn - DragSelectable: true - GMNotes: '' - GUID: 2593ce - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: '"Skids" O''Toole (Parallel Front)' - SidewaysCard: true - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -46.0402527 - posY: 1.33715737 - posZ: -57.2330437 - rotX: 0.01677709 - rotY: 180.0 - rotZ: 359.9792 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 270200 + CardID: 270204 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -103,16 +13,16 @@ ContainedObjects: CustomDeck: '2702': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1487830597915283398/84DA212BC5846F8BF0D5E78E52FF3C040BC7FEB8/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915283229/7DCBE01BDCEFB1177B453B93C6E65BFB69AE08C2/ - NumHeight: 1 - NumWidth: 1 + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154537387/9BBCF9ACFA26E3C0649434C832E5681AB731A77B/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154536333/92BABC93BFBC5E1DA2C2A7B5EA5E62151E0DE3D7/ + NumHeight: 2 + NumWidth: 3 Type: 0 - UniqueBack: false - Description: The Ex-COn + UniqueBack: true + Description: The Ex-Con DragSelectable: true GMNotes: '' - GUID: c22487 + GUID: a03077 Grid: true GridProjection: false Hands: true @@ -122,22 +32,112 @@ ContainedObjects: LuaScript: '' LuaScriptState: '' MeasureMovement: false - Name: CardCustom + Name: Card + Nickname: '"Skids" O''Toole (Parallel Back)' + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -4.31885242 + posY: 1.35570478 + posZ: -46.8917274 + rotX: 358.942535 + rotY: 180.0034 + rotZ: 359.979462 + scaleX: 1.1 + scaleY: 1.0 + scaleZ: 1.1 + XmlUI: '' +- Autoraise: true + CardID: 270203 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2702': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154537387/9BBCF9ACFA26E3C0649434C832E5681AB731A77B/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154536333/92BABC93BFBC5E1DA2C2A7B5EA5E62151E0DE3D7/ + NumHeight: 2 + NumWidth: 3 + Type: 0 + UniqueBack: true + Description: The Ex-Con + DragSelectable: true + GMNotes: '' + GUID: 8116a6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: '"Skids" O''Toole (Parallel Front)' + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -4.676541 + posY: 1.38509345 + posZ: -46.46882 + rotX: 359.153961 + rotY: 180.001709 + rotZ: 359.9837 + scaleX: 1.1 + scaleY: 1.0 + scaleZ: 1.1 + XmlUI: '' +- Autoraise: true + CardID: 270202 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2702': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154537387/9BBCF9ACFA26E3C0649434C832E5681AB731A77B/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154536333/92BABC93BFBC5E1DA2C2A7B5EA5E62151E0DE3D7/ + NumHeight: 2 + NumWidth: 3 + Type: 0 + UniqueBack: true + Description: The Ex-Con + DragSelectable: true + GMNotes: '' + GUID: 22ebb2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card Nickname: '"Skids" O''Toole (Parallel)' SidewaysCard: true Snap: true Sticky: true Tooltip: true Transform: - posX: -46.475193 - posY: 1.37087667 - posZ: -57.7244339 - rotX: 0.0167780612 - rotY: 180.000015 - rotZ: 359.9792 - scaleX: 1.0 + posX: -4.15647268 + posY: 1.427448 + posZ: -46.9205971 + rotX: 359.152954 + rotY: 179.999786 + rotZ: 359.983429 + scaleX: 1.1 scaleY: 1.0 - scaleZ: 1.0 + scaleZ: 1.1 XmlUI: '' - Autoraise: true CardID: 535502 @@ -174,12 +174,12 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: -19.40551 - posY: 1.38776684 - posZ: -66.26952 - rotX: 0.0167726018 - rotY: 180.000031 - rotZ: 359.9792 + posX: -4.207668 + posY: 1.39875221 + posZ: -47.4201546 + rotX: 0.0134176528 + rotY: 180.0 + rotZ: 359.983337 scaleX: 1.1 scaleY: 1.0 scaleZ: 1.1 @@ -187,28 +187,12 @@ ContainedObjects: CustomDeck: '2702': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1487830597915283398/84DA212BC5846F8BF0D5E78E52FF3C040BC7FEB8/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915283229/7DCBE01BDCEFB1177B453B93C6E65BFB69AE08C2/ - NumHeight: 1 - NumWidth: 1 + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154537387/9BBCF9ACFA26E3C0649434C832E5681AB731A77B/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154536333/92BABC93BFBC5E1DA2C2A7B5EA5E62151E0DE3D7/ + NumHeight: 2 + NumWidth: 3 Type: 0 - UniqueBack: false - '5352': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1487830597915295363/28B8144E012A2748EF06B2388AE702E9003081CC/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915283229/7DCBE01BDCEFB1177B453B93C6E65BFB69AE08C2/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5353': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1487830597915283398/84DA212BC5846F8BF0D5E78E52FF3C040BC7FEB8/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915296505/475BBEC1DFD3BDBCC405719C2F62DDA006D341D1/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false + UniqueBack: true '5355': BackIsHidden: true BackURL: http://cloud-3.steamusercontent.com/ugc/1011562618093845464/80687C9319FA2015F3D9F7CBEB4C55FBF045B27D/ @@ -218,14 +202,14 @@ CustomDeck: Type: 0 UniqueBack: true DeckIDs: -- 535300 -- 535200 -- 270200 +- 270204 +- 270203 +- 270202 - 535502 Description: '' DragSelectable: true GMNotes: '' -GUID: 12cc48 +GUID: 2e7dd9 Grid: true GridProjection: false Hands: false diff --git a/unpacked/Custom_Model_Bag Core 64a613.ttslua b/unpacked/Custom_Model_Bag Core 64a613.ttslua index c99612b1a..beb7e9fed 100644 --- a/unpacked/Custom_Model_Bag Core 64a613.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111/Custom_Tile Core Difficulty 92d5f1.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111/Custom_Tile Core Difficulty 92d5f1.ttslua index ce26fb1d9..c7ea585c8 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111/Custom_Tile Core Difficulty 92d5f1.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111/Custom_Tile Core Difficulty 92d5f1.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96/Custom_Tile Core Set 8112ff.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96/Custom_Tile Core Set 8112ff.ttslua index ce26fb1d9..c7ea585c8 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96/Custom_Tile Core Set 8112ff.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96/Custom_Tile Core Set 8112ff.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0/Custom_Tile The Devourer Below 37feeb.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0/Custom_Tile The Devourer Below 37feeb.ttslua index a4eeff852..5d1d47cbd 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0/Custom_Tile The Devourer Below 37feeb.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0/Custom_Tile The Devourer Below 37feeb.ttslua @@ -1,21 +1,21 @@ -name = 'The Devourer Below' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Devourer Below' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua index 40b104bf0..a86ae03a8 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua @@ -1,679 +1,679 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First checkbox - { - pos = {-0.62,0.1,0.056}, - size = 400, - state = false - }, - --Second checkbox - { - pos = {-0.629,0.1,0.199}, - size = 400, - state = false - }, - --Third checkbox - { - pos = {-0.594,0.1,0.355}, - size = 400, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Killed Textbox - { - pos = {-0.4,0.1,0.68}, - rows = 8, - width = 3800, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {0.507,0.1,0.15}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists interrogated - { - pos = {0.507,0.1,0.509}, - rows = 4, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists got away - { - pos = {0.507,0.1,0.771}, - rows = 4, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First checkbox + { + pos = {-0.62,0.1,0.056}, + size = 400, + state = false + }, + --Second checkbox + { + pos = {-0.629,0.1,0.199}, + size = 400, + state = false + }, + --Third checkbox + { + pos = {-0.594,0.1,0.355}, + size = 400, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Killed Textbox + { + pos = {-0.4,0.1,0.68}, + rows = 8, + width = 3800, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {0.507,0.1,0.15}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists interrogated + { + pos = {0.507,0.1,0.509}, + rows = 4, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists got away + { + pos = {0.507,0.1,0.771}, + rows = 4, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Curse tokens bd0253.yaml b/unpacked/Custom_Model_Bag Curse tokens bd0253.yaml index 5fe8c9c7f..0c3896f71 100644 --- a/unpacked/Custom_Model_Bag Curse tokens bd0253.yaml +++ b/unpacked/Custom_Model_Bag Curse tokens bd0253.yaml @@ -53,11 +53,11 @@ Sticky: true Tooltip: true Transform: posX: -45.93 - posY: 1.74 + posY: 1.71 posZ: -3.94 rotX: 359.92 - rotY: 270.0 - rotZ: 0.02 + rotY: 285.0 + rotZ: 0.0 scaleX: 0.7 scaleY: 0.7 scaleZ: 0.7 diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Challenge Scenarios fa4a1a.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Challenge Scenarios fa4a1a.yaml index 9c7428621..2e36ddb1a 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Challenge Scenarios fa4a1a.yaml +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Challenge Scenarios fa4a1a.yaml @@ -4,6 +4,7 @@ ColorDiffuse: g: 0.366520882 r: 0.7058823 ContainedObjects: +- !include 'Bag Challenge Scenarios fa4a1a/Deck Bad Blood adc847.yaml' - !include 'Bag Challenge Scenarios fa4a1a/Deck All or Nothing 26a46b.yaml' - !include 'Bag Challenge Scenarios fa4a1a/Deck Read or Die d4728b.yaml' Description: '' @@ -27,12 +28,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 18.44 - posY: 3.19 - posZ: -40.51 - rotX: 359.99 + posX: 15.13 + posY: 3.13 + posZ: -38.26 + rotX: 0.0 rotY: 0.0 - rotZ: 359.97 + rotZ: 359.98 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Challenge Scenarios fa4a1a/Deck Bad Blood adc847.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Challenge Scenarios fa4a1a/Deck Bad Blood adc847.yaml new file mode 100644 index 000000000..e5ea90848 --- /dev/null +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Challenge Scenarios fa4a1a/Deck Bad Blood adc847.yaml @@ -0,0 +1,238 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 266403 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2664': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true + Description: Hyperborean Sorceress + DragSelectable: true + GMNotes: '' + GUID: 88a71f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Elspeth Baudin + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.022974 + posY: 1.47371054 + posZ: -15.7652664 + rotX: 359.920135 + rotY: 270.000031 + rotZ: 0.01687216 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266302 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true + Description: Act 1 + DragSelectable: true + GMNotes: '' + GUID: 165dac + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: A Walk Down Memory Lane + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.1692095 + posY: 1.50529575 + posZ: -15.7497053 + rotX: 359.9394 + rotY: 270.390747 + rotZ: 0.0290303845 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266301 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true + Description: Agenda 1 + DragSelectable: true + GMNotes: '' + GUID: a00323 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hyperborean Blood + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.0356474 + posY: 1.5398587 + posZ: -15.4790716 + rotX: 359.7137 + rotY: 271.0818 + rotZ: 0.365027815 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266400 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2664': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true + Description: Bad Blood + DragSelectable: true + GMNotes: '' + GUID: '847357' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Scenario + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 11.8856354 + posY: 1.54885507 + posZ: -16.2897816 + rotX: 359.920135 + rotY: 269.999878 + rotZ: 0.0168515053 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2663': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true + '2664': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true +DeckIDs: +- 266403 +- 266302 +- 266301 +- 266400 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: adc847 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Bad Blood +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 15.28 + posY: 3.41 + posZ: -43.08 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec.yaml index 17e049413..caf1082c5 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec.yaml +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec.yaml @@ -5,6 +5,7 @@ ColorDiffuse: r: 0.7058823 ContainedObjects: - !include 'Bag Standalone ce36ec/Deck The Meddling of Meowlathotep 498529.yaml' +- !include 'Bag Standalone ce36ec/Bag War of the Outer Gods a644c3.yaml' - !include 'Bag Standalone ce36ec/Bag The Blob That Ate Everything c40cac.yaml' - !include 'Bag Standalone ce36ec/Bag Murder at the Excelsior Hotel 8c5a09.yaml' - !include 'Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78.yaml' @@ -32,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 45.32 + posX: 28.5 posY: 2.97 - posZ: -71.61 + posZ: -66.91 rotX: 359.98 rotY: 270.0 rotZ: 0.0 diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547.yaml index ff2c1a10e..d4d0445c2 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547.yaml +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547.yaml @@ -27,12 +27,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 11.12 - posY: 3.35 - posZ: -17.7 - rotX: 0.42 + posX: 12.01 + posY: 3.0 + posZ: -58.56 + rotX: 359.99 rotY: 0.0 - rotZ: 359.52 + rotZ: 0.0 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547/Deck Carnevale of Horrors 5d123b.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547/Deck Carnevale of Horrors 5d123b.yaml index da3dbe956..aabfd8282 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547/Deck Carnevale of Horrors 5d123b.yaml +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547/Deck Carnevale of Horrors 5d123b.yaml @@ -1220,15 +1220,15 @@ ContainedObjects: scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 295504 + CardID: 295604 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2955': + '2956': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 @@ -1237,7 +1237,7 @@ ContainedObjects: Description: '' DragSelectable: true GMNotes: '' - GUID: da4a26 + GUID: d0e108 Grid: true GridProjection: false Hands: true @@ -1254,26 +1254,26 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 2.11427617 - posY: 3.19797754 - posZ: -50.516655 + posX: -34.61013 + posY: 3.89706135 + posZ: -60.9155 rotX: 359.920135 - rotY: 270.0 - rotZ: 0.0168702118 + rotY: 180.009354 + rotZ: 0.947015464 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 295503 + CardID: 295603 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2955': + '2956': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 @@ -1282,7 +1282,7 @@ ContainedObjects: Description: '' DragSelectable: true GMNotes: '' - GUID: 080d4a + GUID: 7f1927 Grid: true GridProjection: false Hands: true @@ -1299,26 +1299,26 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: -1.46421731 - posY: 3.38387537 - posZ: -39.9359627 - rotX: 359.983246 + posX: -37.89405 + posY: 3.18032074 + posZ: -52.2238464 + rotX: 0.000755791436 rotY: 270.0 - rotZ: 0.00353677152 + rotZ: 359.991058 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 295502 + CardID: 295602 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2955': + '2956': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 @@ -1327,7 +1327,7 @@ ContainedObjects: Description: '' DragSelectable: true GMNotes: '' - GUID: 0f54e7 + GUID: 6179d5 Grid: true GridProjection: false Hands: true @@ -1344,26 +1344,26 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: -1.38100541 - posY: 3.38387322 - posZ: -42.6147766 - rotX: 359.983246 - rotY: 270.0 - rotZ: 0.00353691331 + posX: -38.7044334 + posY: 3.179123 + posZ: -55.95162 + rotX: 359.9934 + rotY: 270.008942 + rotZ: 359.9922 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 295501 + CardID: 295601 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2955': + '2956': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 @@ -1372,7 +1372,7 @@ ContainedObjects: Description: '' DragSelectable: true GMNotes: '' - GUID: 25000a + GUID: 9c9196 Grid: true GridProjection: false Hands: true @@ -1389,12 +1389,12 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: -1.19238293 - posY: 3.196286 - posZ: -44.75184 - rotX: 359.9802 - rotY: 270.000031 - rotZ: 0.004182015 + posX: -38.6552353 + posY: 3.178589 + posZ: -57.19522 + rotX: 0.0007555263 + rotY: 270.0 + rotZ: 359.991028 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -2520,9 +2520,9 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: true - '2955': + '2956': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 @@ -2572,10 +2572,10 @@ DeckIDs: - 3702 - 3701 - 3700 -- 295504 -- 295503 -- 295502 -- 295501 +- 295604 +- 295603 +- 295602 +- 295601 - 4000 - 234622 - 234621 @@ -2620,12 +2620,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 4.72 - posY: 3.8 - posZ: -22.2 - rotX: 359.9 - rotY: 269.99 - rotZ: 356.74 + posX: -7.38 + posY: 4.16 + posZ: -58.29 + rotX: 0.0 + rotY: 270.0 + rotZ: 0.0 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547/Deck Setup Resolution 579c60.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547/Deck Setup Resolution 579c60.yaml index d3e355bbd..7ea67099f 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547/Deck Setup Resolution 579c60.yaml +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Carnevale of Horrors 418547/Deck Setup Resolution 579c60.yaml @@ -364,12 +364,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 4.98 + posX: -4.44 posY: 3.58 - posZ: -22.93 - rotX: 358.54 - rotY: 269.95 - rotZ: 2.65 + posZ: -39.3 + rotX: 357.3 + rotY: 269.94 + rotZ: 1.64 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard b7af99.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard b7af99.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard b7af99.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard b7af99.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard e19c97.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard e19c97.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard e19c97.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard e19c97.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - EasyStandard 535979.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - EasyStandard 535979.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - EasyStandard 535979.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - EasyStandard 535979.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - HardExpert 9ed124.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - HardExpert 9ed124.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - HardExpert 9ed124.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - HardExpert 9ed124.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Murder at the Excelsior Hotel 8c5a09.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Murder at the Excelsior Hotel 8c5a09.yaml index a7f3f007e..03c33a428 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Murder at the Excelsior Hotel 8c5a09.yaml +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Murder at the Excelsior Hotel 8c5a09.yaml @@ -40,12 +40,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 15.32 - posY: 3.36 - posZ: 2.13 - rotX: 0.06 + posX: 23.74 + posY: 3.19 + posZ: 40.77 + rotX: 359.98 rotY: 0.0 - rotZ: 0.3 + rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag The Blob That Ate Everything c40cac.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag The Blob That Ate Everything c40cac.yaml index a1c6221b5..e2c4f4d1a 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag The Blob That Ate Everything c40cac.yaml +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag The Blob That Ate Everything c40cac.yaml @@ -30,12 +30,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 14.15 - posY: 3.0 - posZ: -53.74 - rotX: 359.97 + posX: 23.13 + posY: 3.14 + posZ: 36.9 + rotX: 0.02 rotY: 270.0 - rotZ: 0.01 + rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3.yaml new file mode 100644 index 000000000..38a62fc87 --- /dev/null +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3.yaml @@ -0,0 +1,41 @@ +Autoraise: true +ColorDiffuse: + b: 0.0 + g: 0.366520882 + r: 0.7058823 +ContainedObjects: +- !include 'Bag War of the Outer Gods a644c3/Deck Swarm of Assimilation a5b82d.yaml' +- !include 'Bag War of the Outer Gods a644c3/Deck Children of Paradise 6f56e0.yaml' +- !include 'Bag War of the Outer Gods a644c3/Deck Death of Stars db0ac4.yaml' +- !include 'Bag War of the Outer Gods a644c3/Deck War of the Outer Gods 3111c8.yaml' +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a644c3 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Bag +Nickname: War of the Outer Gods +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 20.15 + posY: 3.15 + posZ: 35.9 + rotX: 359.98 + rotY: 0.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Children of Paradise 6f56e0.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Children of Paradise 6f56e0.yaml new file mode 100644 index 000000000..95d58745a --- /dev/null +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Children of Paradise 6f56e0.yaml @@ -0,0 +1,468 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231618 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 22dee5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunt Down + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.9655266 + posY: 1.60041463 + posZ: 15.0442657 + rotX: 359.9521 + rotY: 269.998169 + rotZ: 179.901016 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231618 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: eb6b0a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunt Down + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.9593334 + posY: 1.61029816 + posZ: 14.8629065 + rotX: 359.936066 + rotY: 270.000916 + rotZ: 179.27977 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231618 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: '931381' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunt Down + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.2444954 + posY: 1.58440363 + posZ: 15.149147 + rotX: 359.936066 + rotY: 270.0021 + rotZ: 180.383942 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231617 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Mutated. + DragSelectable: true + GMNotes: '' + GUID: bf8a7a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Bringer of Paradise + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.843523 + posY: 1.56844652 + posZ: 15.3794861 + rotX: 359.9361 + rotY: 270.001 + rotZ: 179.699875 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231617 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Mutated. + DragSelectable: true + GMNotes: '' + GUID: f77e18 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Bringer of Paradise + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.9258881 + posY: 1.60118151 + posZ: 15.200263 + rotX: 359.936035 + rotY: 270.0004 + rotZ: 181.774658 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231616 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Monster. Shoggoth. Mutated. + DragSelectable: true + GMNotes: '' + GUID: 5c0736 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Horrific Shoggoth + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.9776382 + posY: 1.54621756 + posZ: 15.2099876 + rotX: 359.9361 + rotY: 270.0021 + rotZ: 180.356964 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231615 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Grotesque Abomination + DragSelectable: true + GMNotes: '' + GUID: 97da98 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Vile Broodmaster + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.9694576 + posY: 1.51208329 + posZ: 15.1341572 + rotX: 359.936066 + rotY: 269.999847 + rotZ: 180.32933 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231614 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: The Child of Paradise + DragSelectable: true + GMNotes: '' + GUID: e733f3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: "Magh\u2019an Ark\u2019at" + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.7804813 + posY: 1.47338533 + posZ: 15.1225281 + rotX: 359.920135 + rotY: 269.999084 + rotZ: 180.016876 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231925 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c6b942 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Egg Hatches + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.6733627 + posY: 1.6006813 + posZ: 7.98546362 + rotX: 359.936127 + rotY: 270.001251 + rotZ: 0.328636825 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +DeckIDs: +- 231618 +- 231618 +- 231618 +- 231617 +- 231617 +- 231616 +- 231615 +- 231614 +- 231925 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6f56e0 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Children of Paradise +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 13.06 + posY: 3.38 + posZ: 66.19 + rotX: 357.88 + rotY: 270.09 + rotZ: 357.29 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Death of Stars db0ac4.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Death of Stars db0ac4.yaml new file mode 100644 index 000000000..e279ef32a --- /dev/null +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Death of Stars db0ac4.yaml @@ -0,0 +1,468 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231613 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: 0517b9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Inevitable End + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.8063831 + posY: 1.65103185 + posZ: 13.6350107 + rotX: 359.952057 + rotY: 269.998535 + rotZ: 178.176025 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231613 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: 68425e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Inevitable End + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.6144676 + posY: 1.59726548 + posZ: 13.729125 + rotX: 359.93576 + rotY: 270.000183 + rotZ: 180.206726 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231613 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: 5732fe + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Inevitable End + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.6001186 + posY: 1.60073757 + posZ: 13.5453 + rotX: 359.936066 + rotY: 270.00058 + rotZ: 179.281555 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231612 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Monster. + DragSelectable: true + GMNotes: '' + GUID: cdae10 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ethereal Entity + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.3919048 + posY: 1.673632 + posZ: 13.6379747 + rotX: 359.935974 + rotY: 270.001678 + rotZ: 174.2237 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231612 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Monster. + DragSelectable: true + GMNotes: '' + GUID: 5be6f1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ethereal Entity + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.5273056 + posY: 1.66287768 + posZ: 13.9757547 + rotX: 359.936035 + rotY: 270.006927 + rotZ: 174.077332 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231611 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Monster. + DragSelectable: true + GMNotes: '' + GUID: '781168' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hune-Stitched Herald + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.5908165 + posY: 1.58184993 + posZ: 14.1332388 + rotX: 359.9361 + rotY: 270.000183 + rotZ: 181.349854 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231610 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Servant of Silenus + DragSelectable: true + GMNotes: '' + GUID: 4303a1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Inescapable Maw + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.5069275 + posY: 1.54023755 + posZ: 13.8827362 + rotX: 359.9232 + rotY: 270.000946 + rotZ: 178.091782 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231609 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: The Empty Sky + DragSelectable: true + GMNotes: '' + GUID: 52f230 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Silenus + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.5073242 + posY: 1.47341692 + posZ: 13.9362888 + rotX: 359.920135 + rotY: 270.008423 + rotZ: 180.016861 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231924 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 4a08fd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Silenus Descends + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 20.066185 + posY: 1.597573 + posZ: 10.6729059 + rotX: 359.9361 + rotY: 270.0004 + rotZ: 0.1488698 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +DeckIDs: +- 231613 +- 231613 +- 231613 +- 231612 +- 231612 +- 231611 +- 231610 +- 231609 +- 231924 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: db0ac4 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Death of Stars +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 12.67 + posY: 3.4 + posZ: 66.04 + rotX: 359.28 + rotY: 270.02 + rotZ: 357.83 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Swarm of Assimilation a5b82d.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Swarm of Assimilation a5b82d.yaml new file mode 100644 index 000000000..80d8bdd29 --- /dev/null +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck Swarm of Assimilation a5b82d.yaml @@ -0,0 +1,468 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231622 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Curse. + DragSelectable: true + GMNotes: '' + GUID: 81af35 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Transmogrify + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.71407 + posY: 1.59632766 + posZ: 1.55447733 + rotX: 359.953461 + rotY: 270.002136 + rotZ: 179.576736 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231622 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Curse. + DragSelectable: true + GMNotes: '' + GUID: 7073c3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Transmogrify + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.273428 + posY: 1.58779347 + posZ: 1.13905919 + rotX: 359.935974 + rotY: 270.0004 + rotZ: 180.217773 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Creature. Insect. + DragSelectable: true + GMNotes: '' + GUID: 88099d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Trylogog + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.6186829 + posY: 1.53423321 + posZ: 2.04295731 + rotX: 359.932434 + rotY: 270.000122 + rotZ: 0.0142426938 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Creature. Insect. + DragSelectable: true + GMNotes: '' + GUID: c9d6ee + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Trylogog + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.52809 + posY: 1.54826045 + posZ: 1.86026812 + rotX: 359.932617 + rotY: 270.000061 + rotZ: 0.0128829842 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Creature. Insect. + DragSelectable: true + GMNotes: '' + GUID: cfbbf3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Trylogog + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.6171532 + posY: 1.560172 + posZ: 2.21293426 + rotX: 359.9314 + rotY: 270.000031 + rotZ: 0.0137510356 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Creature. Insect. + DragSelectable: true + GMNotes: '' + GUID: 23027c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Trylogog + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.532 + posY: 1.57031822 + posZ: 1.83674049 + rotX: 359.930542 + rotY: 270.0 + rotZ: 0.0136441989 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231620 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Monster. Insect. Servitor. Elite. + DragSelectable: true + GMNotes: '' + GUID: 41caae + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Droning Horde + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.451189 + posY: 1.572554 + posZ: 2.01011562 + rotX: 359.934937 + rotY: 269.999481 + rotZ: 0.011245654 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231619 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: The Lord of Swarms + DragSelectable: true + GMNotes: '' + GUID: 05dc30 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ezel-zen-rezl + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.6948814 + posY: 1.581778 + posZ: 1.69483256 + rotX: 359.920135 + rotY: 269.999054 + rotZ: 0.01693217 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231926 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: '' + DragSelectable: true + GMNotes: '' + GUID: e6bbf7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ezel-zen-rezl Emerges + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.59823 + posY: 1.59261811 + posZ: 5.17256975 + rotX: 359.9361 + rotY: 270.000122 + rotZ: 0.006655739 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +DeckIDs: +- 231622 +- 231622 +- 231621 +- 231621 +- 231621 +- 231621 +- 231620 +- 231619 +- 231926 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a5b82d +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Swarm of Assimilation +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 12.57 + posY: 3.41 + posZ: 65.82 + rotX: 359.76 + rotY: 270.0 + rotZ: 0.34 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck War of the Outer Gods 3111c8.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck War of the Outer Gods 3111c8.yaml new file mode 100644 index 000000000..29835f627 --- /dev/null +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag War of the Outer Gods a644c3/Deck War of the Outer Gods 3111c8.yaml @@ -0,0 +1,2424 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231727 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Mask of the Burning Pit + DragSelectable: true + GMNotes: '' + GUID: 19094d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Enchanted Skull + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.6068668 + posY: 1.56409359 + posZ: 6.4050703 + rotX: 359.9361 + rotY: 269.9999 + rotZ: 180.013474 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231726 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Shellblade Tribute + DragSelectable: true + GMNotes: '' + GUID: db8043 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Blade of Ark'at + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.42172 + posY: 1.55489719 + posZ: 7.265634 + rotX: 359.9361 + rotY: 270.0 + rotZ: 180.013489 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231725 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Gift of the Void + DragSelectable: true + GMNotes: '' + GUID: 4b2e72 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dreaded End + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.3120546 + posY: 1.5454216 + posZ: 7.39382029 + rotX: 359.9361 + rotY: 270.0 + rotZ: 180.013489 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231724 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Doorway to Another World + DragSelectable: true + GMNotes: '' + GUID: 1ab785 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Pocket Portal + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.5625467 + posY: 1.51114023 + posZ: 6.992935 + rotX: 359.9361 + rotY: 269.999969 + rotZ: 180.013474 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231723 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Interwoven Distortion + DragSelectable: true + GMNotes: '' + GUID: 4e1e79 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Cloak of the Outer Realm + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.63796 + posY: 1.479493 + posZ: 6.78365946 + rotX: 359.920135 + rotY: 270.000031 + rotZ: 180.016861 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232602 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2326': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038742847/1870E45DD453FA9A0D717AA5DA617B2ECCE4E881/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false + Description: Creature. Insect. + DragSelectable: true + GMNotes: '' + GUID: f18934 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Trylogog + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -1.32409549 + posY: 3.50145769 + posZ: 5.059613 + rotX: 359.920135 + rotY: 269.9997 + rotZ: 0.0168731268 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232601 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2326': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038742847/1870E45DD453FA9A0D717AA5DA617B2ECCE4E881/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false + Description: Humanoid. Mutated. + DragSelectable: true + GMNotes: '' + GUID: 0ed2e7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Bringer of Paradise + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -1.63098741 + posY: 3.50143 + posZ: 5.06057835 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168735068 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232600 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2326': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038742847/1870E45DD453FA9A0D717AA5DA617B2ECCE4E881/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false + Description: Monster. + DragSelectable: true + GMNotes: '' + GUID: 2c7560 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ethereal Entity + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -1.18974459 + posY: 3.371097 + posZ: 4.92624569 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168716535 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231608 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Omen. + DragSelectable: true + GMNotes: '' + GUID: 64c3c1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: While They Sleep + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.2225637 + posY: 1.9361347 + posZ: 8.048464 + rotX: 359.952057 + rotY: 270.0005 + rotZ: 180.33223 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231608 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Omen. + DragSelectable: true + GMNotes: '' + GUID: 9219b2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: While They Sleep + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.4261475 + posY: 1.51713014 + posZ: 11.57154 + rotX: 359.920135 + rotY: 269.9998 + rotZ: 0.0168739036 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231607 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: 14ab95 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ravages of War + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.6831646 + posY: 1.47502732 + posZ: 10.7695866 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.016873138 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231607 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: 8eca8b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ravages of War + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.5168781 + posY: 1.51862109 + posZ: 10.9656143 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168732442 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231606 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: '235782' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hellfire + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.1113815 + posY: 1.475746 + posZ: 10.503335 + rotX: 359.920135 + rotY: 270.0 + rotZ: 0.0168730672 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231606 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 4a7753 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hellfire + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.11085 + posY: 1.519193 + posZ: 10.498147 + rotX: 359.920135 + rotY: 270.0 + rotZ: 0.01687311 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231606 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 5c6869 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hellfire + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.1108189 + posY: 1.55837166 + posZ: 10.4981527 + rotX: 359.9214 + rotY: 270.0 + rotZ: 0.0162979662 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231605 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 6bb1ce + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Feast of Locusts + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.4059544 + posY: 1.47543192 + posZ: 10.83146 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168757513 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231605 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 25bc9c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Feast of Locusts + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.5708752 + posY: 1.51862586 + posZ: 10.9630184 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168756321 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231604 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 677a88 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Disciple of the Swarm + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.919323 + posY: 1.47466767 + posZ: 10.6666031 + rotX: 359.920135 + rotY: 269.999969 + rotZ: 0.0168734826 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231604 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 97aad7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Disciple of the Swarm + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.74577 + posY: 1.518173 + posZ: 10.7725534 + rotX: 359.920135 + rotY: 269.999969 + rotZ: 0.0168734342 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231603 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: eda2a9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Predator's Call + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.2519188 + posY: 1.4755851 + posZ: 10.6223869 + rotX: 359.920135 + rotY: 270.0 + rotZ: 0.01687459 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231603 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: f5b3a8 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Predator's Call + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.2710571 + posY: 1.51897573 + posZ: 10.6280336 + rotX: 359.920135 + rotY: 270.0 + rotZ: 0.0168745946 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231602 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: f2b1dd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Zealot of Paradise + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.19944 + posY: 1.47554815 + posZ: 10.24861 + rotX: 359.920135 + rotY: 270.000031 + rotZ: 0.0168746319 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231602 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 821dbc + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Zealot of Paradise + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.15257 + posY: 1.51912189 + posZ: 10.5883894 + rotX: 359.920135 + rotY: 270.000031 + rotZ: 0.0168749318 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231601 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: a85a25 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Death and Decay + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.5927639 + posY: 1.47310853 + posZ: 8.559571 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.01687484 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231601 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: 1dc235 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Death and Decay + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.8280926 + posY: 1.51572108 + posZ: 8.628544 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168744847 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231600 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 033e76 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Nihilistic Stargazer + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.5937958 + posY: 1.47531354 + posZ: 11.3187151 + rotX: 359.920135 + rotY: 269.999756 + rotZ: 0.016874034 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231600 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 7f901e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Nihilistic Stargazer + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.41717 + posY: 1.50716019 + posZ: 11.11027 + rotX: 359.920135 + rotY: 270.0 + rotZ: 0.0168653466 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231823 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Portal. + DragSelectable: true + GMNotes: '' + GUID: 377fcf + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hub Dimension + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.0063305 + posY: 1.75118327 + posZ: 8.007245 + rotX: 359.952057 + rotY: 270.0001 + rotZ: 180.196625 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231822 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: New York City. + DragSelectable: true + GMNotes: '' + GUID: d9e9ca + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Penthouse + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.7836723 + posY: 1.73626316 + posZ: 8.09670448 + rotX: 359.920135 + rotY: 270.0001 + rotZ: 180.01683 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231821 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Ritual Site. New York City. + DragSelectable: true + GMNotes: '' + GUID: f52a2e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Burning Pit + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.4225254 + posY: 1.72569406 + posZ: 7.47253656 + rotX: 359.919556 + rotY: 270.000061 + rotZ: 180.017044 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231820 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: New York City. + DragSelectable: true + GMNotes: '' + GUID: 473d21 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Streets of New York City + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.2132835 + posY: 1.71751785 + posZ: 7.56757069 + rotX: 359.9361 + rotY: 270.000061 + rotZ: 180.013489 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231819 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: "Ritual Site. Montr\xE9al." + DragSelectable: true + GMNotes: '' + GUID: b57f26 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: "Shrine of Magh\u2019an Ark\u2019at" + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.5681944 + posY: 1.70635581 + posZ: 7.92865038 + rotX: 359.920135 + rotY: 269.999939 + rotZ: 180.016922 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231818 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: "Montr\xE9al." + DragSelectable: true + GMNotes: '' + GUID: 790c3a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Chateau Ramezay + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.8283787 + posY: 1.69744372 + posZ: 7.283435 + rotX: 359.9361 + rotY: 269.999878 + rotZ: 180.01355 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231817 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: "Montr\xE9al." + DragSelectable: true + GMNotes: '' + GUID: '262233' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: "Streets of Montr\xE9al" + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.1339464 + posY: 1.68764877 + posZ: 7.94823 + rotX: 359.920135 + rotY: 270.000366 + rotZ: 180.016922 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231816 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Providence. + DragSelectable: true + GMNotes: '' + GUID: b976f6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Arcade + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.9629011 + posY: 1.6781143 + posZ: 7.655038 + rotX: 359.9361 + rotY: 269.999878 + rotZ: 180.013535 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231815 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Ritual Site. Providence. + DragSelectable: true + GMNotes: '' + GUID: fa15cd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Athenaeum of the Empty Sky + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.5505047 + posY: 1.67044008 + posZ: 7.81444263 + rotX: 359.952057 + rotY: 270.0003 + rotZ: 179.995148 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231814 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Providence. + DragSelectable: true + GMNotes: '' + GUID: be7797 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Streets of Providence + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.364131 + posY: 1.658441 + posZ: 8.168573 + rotX: 359.9361 + rotY: 270.000031 + rotZ: 180.013458 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231813 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Ritual Site. Town. + DragSelectable: true + GMNotes: '' + GUID: c21137 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Arkham + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.5251808 + posY: 1.71835732 + posZ: 7.469922 + rotX: 359.9194 + rotY: 269.985931 + rotZ: 176.353821 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231912 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Act 3 + DragSelectable: true + GMNotes: '' + GUID: d552f6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Close All Portals + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.8090019 + posY: 1.63978875 + posZ: 7.61249065 + rotX: 359.935974 + rotY: 270.509857 + rotZ: 180.01297 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231911 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Act 2 + DragSelectable: true + GMNotes: '' + GUID: e8a8f4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Close the Portal + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.9400578 + posY: 1.63004637 + posZ: 7.776327 + rotX: 359.936035 + rotY: 270.2895 + rotZ: 180.013214 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231910 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Act 1 + DragSelectable: true + GMNotes: '' + GUID: 78ec38 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: War of the Outer Gods + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.2831259 + posY: 1.61997926 + posZ: 7.92389965 + rotX: 359.936 + rotY: 270.509918 + rotZ: 180.01297 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231909 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 3 + DragSelectable: true + GMNotes: '' + GUID: 0d5c1c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Proliferation Nears Completion + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.03127 + posY: 1.6109401 + posZ: 7.77805138 + rotX: 359.939453 + rotY: 270.171875 + rotZ: 180.029343 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231908 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 2 + DragSelectable: true + GMNotes: '' + GUID: 07021f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Proliferation Progresses + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.8672314 + posY: 1.60126233 + posZ: 7.64087439 + rotX: 359.9361 + rotY: 269.999878 + rotZ: 180.01355 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231907 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 1 + DragSelectable: true + GMNotes: '' + GUID: 9da423 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Proliferation of the Swarm + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.9264479 + posY: 1.59151316 + posZ: 7.63588858 + rotX: 359.9363 + rotY: 269.1395 + rotZ: 180.014465 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231906 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 3 + DragSelectable: true + GMNotes: '' + GUID: d54e23 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Incubation Nears Completion + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.7642555 + posY: 1.57769477 + posZ: 6.88696146 + rotX: 359.936035 + rotY: 270.245941 + rotZ: 180.013245 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231905 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 2 + DragSelectable: true + GMNotes: '' + GUID: 97e6e2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Incubation Progresses + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.7556057 + posY: 1.56819344 + posZ: 7.288212 + rotX: 359.9359 + rotY: 270.858154 + rotZ: 180.012573 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231904 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 1 + DragSelectable: true + GMNotes: '' + GUID: cb3fbd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Incubation of the Egg + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 15.9597206 + posY: 1.559897 + posZ: 7.68328142 + rotX: 359.939636 + rotY: 268.905518 + rotZ: 180.030029 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231903 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 3 + DragSelectable: true + GMNotes: '' + GUID: eb72a0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Summoning Nears Completion + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.4699764 + posY: 1.54923594 + posZ: 6.956948 + rotX: 359.935974 + rotY: 270.5755 + rotZ: 180.012848 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231902 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 2 + DragSelectable: true + GMNotes: '' + GUID: 2b1d57 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Summoning Progresses + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.1582413 + posY: 1.54005766 + posZ: 7.30879927 + rotX: 359.9361 + rotY: 270.0184 + rotZ: 180.013474 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231901 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 1 + DragSelectable: true + GMNotes: '' + GUID: 67ab8f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Summoning of Silenus + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.9082928 + posY: 1.505535 + posZ: 7.482427 + rotX: 359.939484 + rotY: 269.9947 + rotZ: 180.029526 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: War of the Outer Gods + DragSelectable: true + GMNotes: '' + GUID: 1ade36 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Scenario + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.0803623 + posY: 1.97363234 + posZ: 7.45378 + rotX: 359.9201 + rotY: 269.999817 + rotZ: 0.0169471614 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + '2326': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038742847/1870E45DD453FA9A0D717AA5DA617B2ECCE4E881/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false +DeckIDs: +- 231727 +- 231726 +- 231725 +- 231724 +- 231723 +- 232602 +- 232601 +- 232600 +- 231608 +- 231608 +- 231607 +- 231607 +- 231606 +- 231606 +- 231606 +- 231605 +- 231605 +- 231604 +- 231604 +- 231603 +- 231603 +- 231602 +- 231602 +- 231601 +- 231601 +- 231600 +- 231600 +- 231823 +- 231822 +- 231821 +- 231820 +- 231819 +- 231818 +- 231817 +- 231816 +- 231815 +- 231814 +- 231813 +- 231912 +- 231911 +- 231910 +- 231909 +- 231908 +- 231907 +- 231906 +- 231905 +- 231904 +- 231903 +- 231902 +- 231901 +- 231800 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3111c8 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: War of the Outer Gods +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 13.33 + posY: 3.56 + posZ: 65.11 + rotX: 358.37 + rotY: 269.85 + rotZ: 2.8 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario 2da146.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario 2da146.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario 2da146.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario 2da146.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario dd61f1.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario dd61f1.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario dd61f1.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario dd61f1.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Innsmouth Conspiracy 2e936e.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Innsmouth Conspiracy 2e936e.yaml index c03299670..dcbccdb0f 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Innsmouth Conspiracy 2e936e.yaml +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Innsmouth Conspiracy 2e936e.yaml @@ -14,6 +14,7 @@ ContainedObjects: - !include 'Bag The Innsmouth Conspiracy 2e936e/Deck Creatures of the Deep 0326ec.yaml' - !include 'Bag The Innsmouth Conspiracy 2e936e/Deck Agents of Hydra b909c7.yaml' - !include 'Bag The Innsmouth Conspiracy 2e936e/Deck Agents of Dagon e18dd7.yaml' +- !include 'Bag The Innsmouth Conspiracy 2e936e/Deck Devil Reef 8cbe29.yaml' - !include 'Bag The Innsmouth Conspiracy 2e936e/Deck In Too Deep 60643c.yaml' - !include 'Bag The Innsmouth Conspiracy 2e936e/Deck The Vanishing of Elina Harper 6af1d0.yaml' @@ -40,12 +41,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 30.94 - posY: 2.96 - posZ: -80.02 - rotX: -0.01 + posX: 46.92 + posY: 2.97 + posZ: -82.93 + rotX: 359.99 rotY: 0.0 - rotZ: 359.98 + rotZ: 359.97 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Innsmouth Conspiracy 2e936e/Deck Devil Reef 8cbe29.yaml b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Innsmouth Conspiracy 2e936e/Deck Devil Reef 8cbe29.yaml new file mode 100644 index 000000000..f99f20ee4 --- /dev/null +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Innsmouth Conspiracy 2e936e/Deck Devil Reef 8cbe29.yaml @@ -0,0 +1,1810 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 232021 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. Terror. + DragSelectable: true + GMNotes: '' + GUID: dfa5b7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dragged Under + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.8649445 + posY: 1.47201884 + posZ: -17.524004 + rotX: 359.920135 + rotY: 270.0078 + rotZ: 0.0168617032 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232021 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. Terror. + DragSelectable: true + GMNotes: '' + GUID: 4184dd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dragged Under + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.3046083 + posY: 1.51424038 + posZ: -17.0757847 + rotX: 359.920135 + rotY: 270.0078 + rotZ: 0.0168617684 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232021 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. Terror. + DragSelectable: true + GMNotes: '' + GUID: e31e2d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dragged Under + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.3120108 + posY: 1.54163218 + posZ: -17.0931187 + rotX: 359.9205 + rotY: 270.0078 + rotZ: 0.0146849984 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232020 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: 60aa0a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Stowaway + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.3418608 + posY: 1.4713161 + posZ: -17.6525478 + rotX: 359.920135 + rotY: 270.0016 + rotZ: 0.0168722328 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232020 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: de54a6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Stowaway + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.5574188 + posY: 1.51349068 + posZ: -17.94746 + rotX: 359.920135 + rotY: 270.0016 + rotZ: 0.0168725736 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232019 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: '624899' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Horrors from the Deep + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.0593338 + posY: 1.47028339 + posZ: -17.76294 + rotX: 359.920135 + rotY: 270.001953 + rotZ: 0.0168720391 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232019 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: 1ebe41 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Horrors from the Deep + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.9074125 + posY: 1.51288879 + posZ: -17.6325779 + rotX: 359.920135 + rotY: 270.001953 + rotZ: 0.0168719124 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232018 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: 12c0dc + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Aquatic Ambush + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.9020071 + posY: 1.47029841 + posZ: -18.4567814 + rotX: 359.920135 + rotY: 270.001953 + rotZ: 0.0168716721 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232018 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: 4332ea + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Aquatic Ambush + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.7664824 + posY: 1.51284909 + posZ: -18.4450951 + rotX: 359.920135 + rotY: 270.001953 + rotZ: 0.0168717 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232017 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: 332a7b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Shapes in the Water + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.6778173 + posY: 1.47092509 + posZ: -17.3899632 + rotX: 359.920135 + rotY: 270.0016 + rotZ: 0.0168718155 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232017 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: 4b921b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Shapes in the Water + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.464777 + posY: 1.513677 + posZ: -17.487709 + rotX: 359.920135 + rotY: 270.0016 + rotZ: 0.01687151 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232016 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: e1f2b7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunting Deep One + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.3397713 + posY: 1.47116244 + posZ: -18.18435 + rotX: 359.920135 + rotY: 270.0017 + rotZ: 0.0168714728 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232016 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: ab11fd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunting Deep One + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.2316246 + posY: 1.513883 + posZ: -18.0531616 + rotX: 359.920135 + rotY: 270.0017 + rotZ: 0.01687119 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232015 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: 2d3d4c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deep One Predator + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.8241434 + posY: 1.47183311 + posZ: -18.34785 + rotX: 359.920135 + rotY: 270.001465 + rotZ: 0.016870765 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232015 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: c3156c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deep One Predator + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.0599527 + posY: 1.51415682 + posZ: -18.3916016 + rotX: 359.920135 + rotY: 270.001465 + rotZ: 0.016870901 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232014 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: a4271e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: "Headdress of Y\u2019ha-nthlei" + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.1242924 + posY: 1.72403562 + posZ: -12.88458 + rotX: 359.9361 + rotY: 270.000061 + rotZ: 180.013474 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232013 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 2afb4a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Awakened Mantle + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.0318 + posY: 1.71442187 + posZ: -13.2251606 + rotX: 359.9361 + rotY: 269.999939 + rotZ: 180.013474 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232012 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 54fd3f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Waveworn Idol + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.0023727 + posY: 1.704825 + posZ: -13.2293158 + rotX: 359.9361 + rotY: 270.000061 + rotZ: 180.013489 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232011 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 1b4fad + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Fishing Vessel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.7760735 + posY: 1.69538653 + posZ: -13.4466019 + rotX: 359.9361 + rotY: 270.000061 + rotZ: 180.013489 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232718 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: dfc9b4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.8917484 + posY: 1.68571162 + posZ: -13.1730547 + rotX: 359.9361 + rotY: 270.000061 + rotZ: 180.0135 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232717 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: 086743 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.0301876 + posY: 1.6759696 + posZ: -13.0338078 + rotX: 359.9361 + rotY: 270.000031 + rotZ: 180.0135 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232716 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: fdf43f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.79796 + posY: 1.666555 + posZ: -13.1796045 + rotX: 359.9361 + rotY: 270.000061 + rotZ: 180.0135 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232715 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: 431ca2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.4054527 + posY: 1.65624332 + posZ: -12.8803682 + rotX: 359.9361 + rotY: 270.000061 + rotZ: 180.013458 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232714 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: cb5e3e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.0996475 + posY: 1.64690888 + posZ: -13.3545322 + rotX: 359.9361 + rotY: 269.999878 + rotZ: 180.013519 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232713 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: 7d180e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.6571922 + posY: 1.63790655 + posZ: -13.1861858 + rotX: 359.920135 + rotY: 269.999878 + rotZ: 180.016846 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232712 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Cave. + DragSelectable: true + GMNotes: '' + GUID: 081d87 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tidal Tunnel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.3226089 + posY: 1.62795389 + posZ: -12.8183231 + rotX: 359.9521 + rotY: 269.9998 + rotZ: 180.0101 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232711 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Cave. + DragSelectable: true + GMNotes: '' + GUID: '653549' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tidal Tunnel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.372036 + posY: 1.61772227 + posZ: -13.08631 + rotX: 359.9361 + rotY: 269.999939 + rotZ: 180.013519 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232710 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Ocean. Island. + DragSelectable: true + GMNotes: '' + GUID: '344016' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Devil Reef + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.0987873 + posY: 1.60839641 + posZ: -13.403018 + rotX: 359.920135 + rotY: 269.999847 + rotZ: 180.016891 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232709 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Ocean. Island. + DragSelectable: true + GMNotes: '' + GUID: f82316 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Devil Reef + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.3892651 + posY: 1.59859979 + posZ: -12.6780663 + rotX: 359.920135 + rotY: 270.0008 + rotZ: 180.016846 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232708 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Ocean. Island. + DragSelectable: true + GMNotes: '' + GUID: 0340ea + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Devil Reef + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.5355473 + posY: 1.59260845 + posZ: -12.68415 + rotX: 359.920227 + rotY: 269.997437 + rotZ: 179.830612 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232707 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Ocean. Island. + DragSelectable: true + GMNotes: '' + GUID: 0ac37d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Devil Reef + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.5996857 + posY: 1.57909632 + posZ: -12.5940237 + rotX: 359.920135 + rotY: 270.0001 + rotZ: 180.01683 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232706 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Ocean. Island. + DragSelectable: true + GMNotes: '' + GUID: ceb95b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Devil Reef + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.781168 + posY: 1.57038355 + posZ: -13.0552473 + rotX: 359.920135 + rotY: 269.999939 + rotZ: 180.01683 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232705 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Ocean. + DragSelectable: true + GMNotes: '' + GUID: 863c96 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Churning Waters + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.33509 + posY: 1.56002235 + posZ: -13.2764053 + rotX: 359.920135 + rotY: 269.999847 + rotZ: 180.016937 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232804 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2325': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Act 1 + DragSelectable: true + GMNotes: '' + GUID: fff4bf + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Reef of Mysteries + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.9551659 + posY: 1.55080044 + posZ: -13.3286486 + rotX: 359.9361 + rotY: 270.0 + rotZ: 180.013489 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232803 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2325': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Agenda 2 + DragSelectable: true + GMNotes: '' + GUID: 1b46b6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Devil of the Depths + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.0661068 + posY: 1.54107273 + posZ: -13.2502708 + rotX: 359.9361 + rotY: 269.999939 + rotZ: 180.013474 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232702 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Agenda 1 + DragSelectable: true + GMNotes: '' + GUID: c32d6a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Secrets of the Sea (v. II) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.05132 + posY: 1.53813112 + posZ: -13.368536 + rotX: 359.95163 + rotY: 270.059479 + rotZ: 180.247757 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232701 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Agenda 1 + DragSelectable: true + GMNotes: '' + GUID: 2273df + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Secrets of the Sea (v. I) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.1644688 + posY: 1.497987 + posZ: -12.9252329 + rotX: 359.952057 + rotY: 269.999969 + rotZ: 180.023087 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232700 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2324': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Devil Reef + DragSelectable: true + GMNotes: '' + GUID: f724f6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Scenario + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.2242355 + posY: 1.868303 + posZ: -12.9898977 + rotX: 359.920135 + rotY: 269.999847 + rotZ: 0.01694071 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + '2328': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true +DeckIDs: +- 232021 +- 232021 +- 232021 +- 232020 +- 232020 +- 232019 +- 232019 +- 232018 +- 232018 +- 232017 +- 232017 +- 232016 +- 232016 +- 232015 +- 232015 +- 232014 +- 232013 +- 232012 +- 232011 +- 232718 +- 232717 +- 232716 +- 232715 +- 232714 +- 232713 +- 232712 +- 232711 +- 232710 +- 232709 +- 232708 +- 232707 +- 232706 +- 232705 +- 232804 +- 232803 +- 232702 +- 232701 +- 232700 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8cbe29 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Devil Reef +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 26.85 + posY: 3.57 + posZ: -47.12 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b.ttslua b/unpacked/Custom_Model_Bag Guardian 1d802b.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b.ttslua +++ b/unpacked/Custom_Model_Bag Guardian 1d802b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b.yaml index 1db91d16e..e7ad164f3 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b.yaml @@ -4,8 +4,8 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210.yaml' -- !include 'Custom_Model_Bag Guardian 1d802b/Card Riot Whistle 55fc3d.yaml' +- !include 'Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.yaml' +- !include 'Custom_Model_Bag Guardian 1d802b/Card Keen Eye 0dc75e.yaml' - !include 'Custom_Model_Bag Guardian 1d802b/Card .35 Winchester 0a7642.yaml' - !include 'Custom_Model_Bag Guardian 1d802b/Card First Watch 0da344.yaml' - !include 'Custom_Model_Bag Guardian 1d802b/Card Self-Sacrifice 184380.yaml' @@ -23,6 +23,7 @@ ContainedObjects: - !include 'Custom_Model_Bag Guardian 1d802b/Card .45 Thompson 4f6ede.yaml' - !include 'Custom_Model_Bag Guardian 1d802b/Card Flesh Ward 52c686.yaml' - !include 'Custom_Model_Bag Guardian 1d802b/Card Teamwork 55ce00.yaml' +- !include 'Custom_Model_Bag Guardian 1d802b/Card Riot Whistle 55fc3d.yaml' - !include 'Custom_Model_Bag Guardian 1d802b/Card Beat Cop 591f6f.yaml' - !include 'Custom_Model_Bag Guardian 1d802b/Card Blessed Blade 59390b.yaml' - !include 'Custom_Model_Bag Guardian 1d802b/Card Get over here! 5b0f86.yaml' @@ -100,7 +101,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: true LuaScript: !include 'Custom_Model_Bag Guardian 1d802b.ttslua' -LuaScriptState: '{"ml":{"03367f":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30557024478912,"z":87.8527908325195},"rot":{"x":0.0208070911467075,"y":270.004760742188,"z":0.0167728867381811}},"037dc7":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30151224136353,"z":69.4412155151367},"rot":{"x":0.0208070278167725,"y":270.005157470703,"z":0.016772884875536}},"0a7642":{"lock":false,"pos":{"x":40.960205078125,"y":1.30311810970306,"z":90.1487045288086},"rot":{"x":0.0208136718720198,"y":269.982269287109,"z":0.0167649462819099}},"0da344":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30285882949829,"z":74.0412216186523},"rot":{"x":0.0208069160580635,"y":270.005218505859,"z":0.0167732164263725}},"184380":{"lock":false,"pos":{"x":58.3838386535645,"y":1.30740916728973,"z":83.1903610229492},"rot":{"x":0.0208060517907143,"y":270.008636474609,"z":0.0167742259800434}},"19507d":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29881930351257,"z":60.2411842346191},"rot":{"x":0.0208068899810314,"y":270.005187988281,"z":0.0167731214314699}},"195b7f":{"lock":false,"pos":{"x":53.2284660339355,"y":1.2974728345871,"z":55.641185760498},"rot":{"x":0.0208070483058691,"y":270.005126953125,"z":0.0167729463428259}},"20645e":{"lock":false,"pos":{"x":53.2285690307617,"y":1.3075715303421,"z":90.141242980957},"rot":{"x":0.0208143573254347,"y":269.980102539063,"z":0.0167639069259167}},"22bb1e":{"lock":false,"pos":{"x":53.2126159667969,"y":1.29544854164124,"z":48.7452774047852},"rot":{"x":0.0208145808428526,"y":269.979919433594,"z":0.0167638100683689}},"22c65b":{"lock":false,"pos":{"x":53.228572845459,"y":1.30555176734924,"z":83.2412338256836},"rot":{"x":0.0208071786910295,"y":270.004638671875,"z":0.0167727079242468}},"273584":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30151224136353,"z":69.4412231445313},"rot":{"x":0.0208144839853048,"y":269.979858398438,"z":0.0167638082057238}},"273797":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29167747497559,"z":51.0597610473633},"rot":{"x":0.0208138637244701,"y":269.981811523438,"z":0.0167645085602999}},"293e8d":{"lock":false,"pos":{"x":37.4159774780273,"y":1.2957751750946,"z":69.4607086181641},"rot":{"x":0.0208194348961115,"y":269.96630859375,"z":0.0167593434453011}},"310d95":{"lock":false,"pos":{"x":53.2284660339355,"y":1.29747271537781,"z":55.641185760498},"rot":{"x":0.0208068396896124,"y":270.005554199219,"z":0.0167730785906315}},"3319be":{"lock":false,"pos":{"x":53.2285690307617,"y":1.3082447052002,"z":92.4412307739258},"rot":{"x":0.0208146441727877,"y":269.979644775391,"z":0.0167635250836611}},"3a4576":{"lock":false,"pos":{"x":40.9601860046387,"y":1.29571235179901,"z":64.8486633300781},"rot":{"x":0.0208133514970541,"y":269.981994628906,"z":0.0167643446475267}},"45a012":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29100215435028,"z":48.7527389526367},"rot":{"x":0.0208139382302761,"y":269.981750488281,"z":0.0167645905166864}},"460cb8":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302084445953,"z":55.6492195129395},"rot":{"x":0.0208137258887291,"y":269.98193359375,"z":0.016764797270298}},"4719d3":{"lock":false,"pos":{"x":40.960205078125,"y":1.29638564586639,"z":67.1486892700195},"rot":{"x":0.0208132304251194,"y":269.981994628906,"z":0.0167643893510103}},"493908":{"lock":false,"pos":{"x":40.9634284973145,"y":1.2916773557663,"z":51.0597648620605},"rot":{"x":0.0208142362535,"y":269.981781005859,"z":0.0167653206735849}},"4b1e76":{"lock":false,"pos":{"x":40.9634170532227,"y":1.29100203514099,"z":48.7527351379395},"rot":{"x":0.020814212039113,"y":269.981750488281,"z":0.0167643204331398}},"4f6ede":{"lock":false,"pos":{"x":40.960205078125,"y":1.30177164077759,"z":85.5486907958984},"rot":{"x":0.0208136234432459,"y":269.982269287109,"z":0.016764622181654}},"52c686":{"lock":false,"pos":{"x":40.9601783752441,"y":1.29503917694092,"z":62.5487480163574},"rot":{"x":0.02081448584795,"y":269.979675292969,"z":0.0167636964470148}},"55ce00":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30355060100555,"z":80.9527740478516},"rot":{"x":0.0208069998770952,"y":270.005187988281,"z":0.0167731419205666}},"55fc3d":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30183446407318,"z":90.1607437133789},"rot":{"x":0.020808320492506,"y":269.998931884766,"z":0.0167705565690994}},"591f6f":{"lock":false,"pos":{"x":40.9601898193359,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208139047026634,"y":269.981811523438,"z":0.0167643539607525}},"59390b":{"lock":false,"pos":{"x":40.9602088928223,"y":1.29840540885925,"z":74.048698425293},"rot":{"x":0.0208086222410202,"y":269.999328613281,"z":0.0167710185050964}},"5b0f86":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30218553543091,"z":71.7412261962891},"rot":{"x":0.0208142660558224,"y":269.980529785156,"z":0.0167641099542379}},"5ec2d2":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29907858371735,"z":76.3486785888672},"rot":{"x":0.0208143461495638,"y":269.982147216797,"z":0.0167657192796469}},"5fa99a":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30557036399841,"z":87.8527908325195},"rot":{"x":0.0208068955689669,"y":270.005157470703,"z":0.0167733505368233}},"60acf8":{"lock":false,"pos":{"x":53.2305908203125,"y":1.29814684391022,"z":57.9409637451172},"rot":{"x":0.0208073649555445,"y":270.004699707031,"z":0.0167727395892143}},"63b3e5":{"lock":false,"pos":{"x":53.2285957336426,"y":1.296799659729,"z":53.3411674499512},"rot":{"x":0.0208146069198847,"y":269.979583740234,"z":0.0167639888823032}},"660d08":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29981470108032,"z":83.2607269287109},"rot":{"x":0.0208135545253754,"y":269.981781005859,"z":0.0167634300887585}},"6aa477":{"lock":false,"pos":{"x":49.5628395080566,"y":1.30691683292389,"z":92.4527816772461},"rot":{"x":0.020806921645999,"y":270.005432128906,"z":0.0167733915150166}},"6d3fdf":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29949259757996,"z":62.5411834716797},"rot":{"x":0.0208067242056131,"y":270.006042480469,"z":0.0167733654379845}},"724c85":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30016577243805,"z":64.8410797119141},"rot":{"x":0.0208067856729031,"y":270.006134033203,"z":0.0167732369154692}},"7646d6":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30622494220734,"z":85.5412216186523},"rot":{"x":0.0208070110529661,"y":270.005859375,"z":0.0167735200375319}},"7b6fd8":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30420529842377,"z":78.6412200927734},"rot":{"x":0.020807096734643,"y":270.0048828125,"z":0.0167731232941151}},"7db258":{"lock":false,"pos":{"x":37.4159851074219,"y":1.3011611700058,"z":87.860725402832},"rot":{"x":0.0208097919821739,"y":269.999328613281,"z":0.0167713314294815}},"7dc5e1":{"lock":false,"pos":{"x":58.3838424682617,"y":1.30808234214783,"z":85.490364074707},"rot":{"x":0.0208050832152367,"y":270.011932373047,"z":0.0167753808200359}},"7dce77":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.0208137426525354,"y":269.981811523438,"z":0.0167646948248148}},"7ec473":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30489706993103,"z":85.5527801513672},"rot":{"x":0.0208145100623369,"y":269.979675292969,"z":0.0167635511606932}},"826897":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29914140701294,"z":80.9607162475586},"rot":{"x":0.0208148453384638,"y":269.981719970703,"z":0.0167649444192648}},"82ee35":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29779493808746,"z":76.360710144043},"rot":{"x":0.0208145175129175,"y":269.981689453125,"z":0.0167654789984226}},"840b3d":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29846811294556,"z":78.6607131958008},"rot":{"x":0.0208146180957556,"y":269.981689453125,"z":0.0167655181139708}},"8475cc":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30353200435638,"z":76.3412170410156},"rot":{"x":0.0208068881183863,"y":270.006164550781,"z":0.0167732499539852}},"86cf73":{"lock":false,"pos":{"x":58.3838310241699,"y":1.31010210514069,"z":92.3903579711914},"rot":{"x":0.020816283300519,"y":269.973419189453,"z":0.0167614966630936}},"88cd33":{"lock":false,"pos":{"x":58.3843688964844,"y":1.30875587463379,"z":87.7903823852539},"rot":{"x":0.0208063516765833,"y":270.007446289063,"z":0.0167740974575281}},"8a25a0":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30422389507294,"z":83.2527770996094},"rot":{"x":0.0208070613443851,"y":270.005126953125,"z":0.0167729742825031}},"8b7da2":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30042517185211,"z":80.9486999511719},"rot":{"x":0.0208137836307287,"y":269.982177734375,"z":0.0167644713073969}},"8c5d4c":{"lock":false,"pos":{"x":53.212776184082,"y":1.29612362384796,"z":51.0517272949219},"rot":{"x":0.020806884393096,"y":270.005615234375,"z":0.0167731009423733}},"8d6ae6":{"lock":false,"pos":{"x":37.4159851074219,"y":1.30048787593842,"z":85.5607223510742},"rot":{"x":0.020815335214138,"y":269.980072021484,"z":0.0167642217129469}},"9230a8":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29773223400116,"z":71.7486801147461},"rot":{"x":0.0208087638020515,"y":269.999298095703,"z":0.0167709235101938}},"92c7df":{"lock":false,"pos":{"x":58.3838233947754,"y":1.32234311103821,"z":76.2903518676758},"rot":{"x":0.0208156257867813,"y":269.980285644531,"z":0.0167646165937185}},"930b6b":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30083906650543,"z":67.1411056518555},"rot":{"x":0.0208088103681803,"y":269.999389648438,"z":0.0167707744985819}},"99765a":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3082447052002,"z":92.4412155151367},"rot":{"x":0.0208069384098053,"y":270.006042480469,"z":0.0167734976857901}},"9eeca1":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30220413208008,"z":76.3527679443359},"rot":{"x":0.0208071004599333,"y":270.004974365234,"z":0.0167730562388897}},"a88e8d":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30606269836426,"z":78.5903549194336},"rot":{"x":0.0208041407167912,"y":270.014892578125,"z":0.0167764984071255}},"ad73d9":{"lock":false,"pos":{"x":44.5133094787598,"y":1.3067045211792,"z":92.4607315063477},"rot":{"x":0.0208088736981153,"y":269.998962402344,"z":0.0167707800865173}},"af3efd":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30250763893127,"z":92.4607162475586},"rot":{"x":0.020814435556531,"y":269.980285644531,"z":0.0167641080915928}},"af4c03":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30689823627472,"z":87.8412399291992},"rot":{"x":0.0208071358501911,"y":270.0048828125,"z":0.0167728383094072}},"b2fedd":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30109834671021,"z":83.2486877441406},"rot":{"x":0.0208136811852455,"y":269.982238769531,"z":0.0167647060006857}},"b58038":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30487847328186,"z":80.9412231445313},"rot":{"x":0.0208067949861288,"y":270.006042480469,"z":0.0167733337730169}},"b789ac":{"lock":false,"pos":{"x":58.3838272094727,"y":1.3094288110733,"z":90.0903625488281},"rot":{"x":0.020805262029171,"y":270.011291503906,"z":0.0167752914130688}},"bd34f2":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638576507568,"z":67.1486740112305},"rot":{"x":0.0208139177411795,"y":269.981567382813,"z":0.01676463522017}},"bf3261":{"lock":false,"pos":{"x":53.212776184082,"y":1.29612374305725,"z":51.0517272949219},"rot":{"x":0.0208069682121277,"y":270.005340576172,"z":0.0167731642723084}},"c021fd":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30757141113281,"z":90.141242980957},"rot":{"x":0.0208068154752254,"y":270.006042480469,"z":0.0167733337730169}},"c634a0":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208052285015583,"y":270.011688232422,"z":0.0167755782604218}},"ca17b8":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.0208072159439325,"y":270.004486083984,"z":0.0167728140950203}},"ca8448":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29712164402008,"z":74.0607147216797},"rot":{"x":0.0208148509263992,"y":269.981536865234,"z":0.0167648028582335}},"cc23ea":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30287742614746,"z":78.6527709960938},"rot":{"x":0.0208071172237396,"y":270.005035400391,"z":0.0167727582156658}},"ce4f97":{"lock":false,"pos":{"x":40.9602012634277,"y":1.30244481563568,"z":87.8486938476563},"rot":{"x":0.0208135992288589,"y":269.982330322266,"z":0.0167646650224924}},"db2e8d":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369390010834,"z":57.9485626220703},"rot":{"x":0.0208137389272451,"y":269.98193359375,"z":0.0167646091431379}},"db4a43":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705893993378,"z":69.4486770629883},"rot":{"x":0.0208143647760153,"y":269.980041503906,"z":0.0167637933045626}},"e29603":{"lock":false,"pos":{"x":40.9601745605469,"y":1.2957124710083,"z":64.8486557006836},"rot":{"x":0.020813837647438,"y":269.982055664063,"z":0.0167643800377846}},"e4c7c9":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29907858371735,"z":76.3486785888672},"rot":{"x":0.0208138786256313,"y":269.981994628906,"z":0.0167646780610085}},"ea9ad0":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30538940429688,"z":76.2903518676758},"rot":{"x":0.0208039283752441,"y":270.015808105469,"z":0.0167768690735102}},"edd051":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30218553543091,"z":71.7412185668945},"rot":{"x":0.0208070613443851,"y":270.004791259766,"z":0.0167730432003737}},"f2f912":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29644846916199,"z":71.7607116699219},"rot":{"x":0.0208147224038839,"y":269.981842041016,"z":0.0167650356888771}},"f6dfe5":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436612129211,"z":60.2487869262695},"rot":{"x":0.0208144374191761,"y":269.979736328125,"z":0.0167638752609491}},"f8d22e":{"lock":false,"pos":{"x":40.9602012634277,"y":1.30379140377045,"z":92.4486923217773},"rot":{"x":0.0208144206553698,"y":269.979888916016,"z":0.016763923689723}}}}' +LuaScriptState: '{"ml":{"03367f":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30557024478912,"z":87.8527908325195},"rot":{"x":0.0208070911467075,"y":270.004760742188,"z":0.0167728867381811}},"037dc7":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30151224136353,"z":69.4412155151367},"rot":{"x":0.0208070278167725,"y":270.005157470703,"z":0.016772884875536}},"0a7642":{"lock":false,"pos":{"x":40.960205078125,"y":1.30311810970306,"z":90.1487045288086},"rot":{"x":0.0208138488233089,"y":269.982269287109,"z":0.0167646799236536}},"0da344":{"lock":false,"pos":{"x":53.2285614013672,"y":1.302858710289,"z":74.0412216186523},"rot":{"x":0.0208070911467075,"y":270.005218505859,"z":0.0167732313275337}},"0dc75e":{"lock":false,"pos":{"x":40.9633750915527,"y":1.29167747497559,"z":51.0597686767578},"rot":{"x":0.0208078417927027,"y":270.000793457031,"z":0.0167702063918114}},"184380":{"lock":false,"pos":{"x":58.3838386535645,"y":1.30740904808044,"z":83.1903610229492},"rot":{"x":0.0208061337471008,"y":270.008636474609,"z":0.0167743898928165}},"19507d":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29881930351257,"z":60.2411842346191},"rot":{"x":0.0208070985972881,"y":270.005187988281,"z":0.0167730413377285}},"195b7f":{"lock":false,"pos":{"x":53.2284660339355,"y":1.29747271537781,"z":55.641185760498},"rot":{"x":0.0208070389926434,"y":270.005126953125,"z":0.0167730897665024}},"20645e":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30757141113281,"z":90.141242980957},"rot":{"x":0.0208145175129175,"y":269.980102539063,"z":0.0167639441788197}},"22bb1e":{"lock":false,"pos":{"x":53.2126159667969,"y":1.29544842243195,"z":48.7452774047852},"rot":{"x":0.0208143312484026,"y":269.979919433594,"z":0.0167638622224331}},"22c65b":{"lock":false,"pos":{"x":53.228572845459,"y":1.30555176734924,"z":83.2412338256836},"rot":{"x":0.0208071675151587,"y":270.004638671875,"z":0.0167727284133434}},"273584":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30151224136353,"z":69.4412231445313},"rot":{"x":0.0208143703639507,"y":269.979858398438,"z":0.0167638529092073}},"273797":{"lock":false,"pos":{"x":40.9634170532227,"y":1.29100203514099,"z":48.7527351379395},"rot":{"x":0.0208137631416321,"y":269.981781005859,"z":0.0167645271867514}},"293e8d":{"lock":false,"pos":{"x":37.4159698486328,"y":1.29510188102722,"z":67.1606750488281},"rot":{"x":0.0208192318677902,"y":269.966217041016,"z":0.0167592242360115}},"310d95":{"lock":false,"pos":{"x":53.2284660339355,"y":1.29747271537781,"z":55.641185760498},"rot":{"x":0.0208068396896124,"y":270.005554199219,"z":0.0167730785906315}},"3319be":{"lock":false,"pos":{"x":53.2285690307617,"y":1.3082447052002,"z":92.4412307739258},"rot":{"x":0.0208143629133701,"y":269.979644775391,"z":0.0167638659477234}},"3a4576":{"lock":false,"pos":{"x":40.9601860046387,"y":1.29571235179901,"z":64.8486633300781},"rot":{"x":0.0208133514970541,"y":269.981994628906,"z":0.0167643446475267}},"45a012":{"lock":false,"pos":{"x":37.4159927368164,"y":1.30250763893127,"z":92.4607315063477},"rot":{"x":0.0208132322877645,"y":269.981750488281,"z":0.0167642869055271}},"460cb8":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302072525024,"z":55.6492195129395},"rot":{"x":0.0208138767629862,"y":269.98193359375,"z":0.0167645458132029}},"4719d3":{"lock":false,"pos":{"x":40.960205078125,"y":1.29638564586639,"z":67.1486892700195},"rot":{"x":0.0208132304251194,"y":269.981994628906,"z":0.0167643893510103}},"493908":{"lock":false,"pos":{"x":40.9634284973145,"y":1.2916773557663,"z":51.0597648620605},"rot":{"x":0.0208142362535,"y":269.981781005859,"z":0.0167653206735849}},"4b1e76":{"lock":false,"pos":{"x":40.9634170532227,"y":1.29100203514099,"z":48.7527351379395},"rot":{"x":0.020814212039113,"y":269.981750488281,"z":0.0167643204331398}},"4f6ede":{"lock":false,"pos":{"x":40.960205078125,"y":1.30177164077759,"z":85.5486907958984},"rot":{"x":0.0208138786256313,"y":269.982269287109,"z":0.016764722764492}},"52c686":{"lock":false,"pos":{"x":40.9601783752441,"y":1.29503917694092,"z":62.5487480163574},"rot":{"x":0.0208144839853048,"y":269.979675292969,"z":0.0167638193815947}},"55ce00":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30355060100555,"z":80.9527740478516},"rot":{"x":0.0208072625100613,"y":270.005187988281,"z":0.0167730990797281}},"55fc3d":{"lock":false,"pos":{"x":37.4159851074219,"y":1.3011611700058,"z":87.8607330322266},"rot":{"x":0.020808182656765,"y":269.998992919922,"z":0.0167704448103905}},"591f6f":{"lock":false,"pos":{"x":40.9601898193359,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208138674497604,"y":269.981811523438,"z":0.0167644452303648}},"59390b":{"lock":false,"pos":{"x":40.9602088928223,"y":1.29840540885925,"z":74.048698425293},"rot":{"x":0.0208088085055351,"y":269.999328613281,"z":0.0167708918452263}},"5b0f86":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30218553543091,"z":71.7412261962891},"rot":{"x":0.0208141338080168,"y":269.980529785156,"z":0.0167641341686249}},"5ec2d2":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29907858371735,"z":76.3486785888672},"rot":{"x":0.0208143461495638,"y":269.982147216797,"z":0.0167657192796469}},"5fa99a":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30557024478912,"z":87.8527908325195},"rot":{"x":0.0208070501685143,"y":270.005157470703,"z":0.0167731717228889}},"60acf8":{"lock":false,"pos":{"x":53.2305908203125,"y":1.29814672470093,"z":57.9409637451172},"rot":{"x":0.020807147026062,"y":270.004699707031,"z":0.0167727023363113}},"63b3e5":{"lock":false,"pos":{"x":53.2285957336426,"y":1.29679954051971,"z":53.3411674499512},"rot":{"x":0.0208144653588533,"y":269.979583740234,"z":0.0167637001723051}},"660d08":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29914140701294,"z":80.9607162475586},"rot":{"x":0.0208150614053011,"y":269.981719970703,"z":0.0167647656053305}},"6aa477":{"lock":false,"pos":{"x":49.5628395080566,"y":1.3069167137146,"z":92.4527816772461},"rot":{"x":0.0208068080246449,"y":270.005432128906,"z":0.0167732276022434}},"6d3fdf":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29949247837067,"z":62.5411834716797},"rot":{"x":0.0208065714687109,"y":270.006042480469,"z":0.0167734231799841}},"724c85":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30016577243805,"z":64.8410797119141},"rot":{"x":0.0208068042993546,"y":270.006134033203,"z":0.0167733114212751}},"7646d6":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30622494220734,"z":85.5412216186523},"rot":{"x":0.0208069067448378,"y":270.005859375,"z":0.0167733952403069}},"7b6fd8":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30420517921448,"z":78.6412200927734},"rot":{"x":0.0208073277026415,"y":270.0048828125,"z":0.0167729947715998}},"7db258":{"lock":false,"pos":{"x":37.4159851074219,"y":1.30048787593842,"z":85.5607223510742},"rot":{"x":0.020809568464756,"y":269.999237060547,"z":0.0167712271213531}},"7dc5e1":{"lock":false,"pos":{"x":58.3838424682617,"y":1.30808234214783,"z":85.490364074707},"rot":{"x":0.0208050291985273,"y":270.011932373047,"z":0.0167757626622915}},"7dce77":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.0208139028400183,"y":269.981811523438,"z":0.0167644955217838}},"7ec473":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30489706993103,"z":85.5527801513672},"rot":{"x":0.0208144672214985,"y":269.979675292969,"z":0.0167637318372726}},"826897":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29846811294556,"z":78.6607131958008},"rot":{"x":0.0208148825913668,"y":269.981689453125,"z":0.0167648438364267}},"82ee35":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29712176322937,"z":74.0607223510742},"rot":{"x":0.0208132453262806,"y":269.981750488281,"z":0.0167642626911402}},"840b3d":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29779493808746,"z":76.360710144043},"rot":{"x":0.0208148956298828,"y":269.981597900391,"z":0.0167648028582335}},"8475cc":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30353200435638,"z":76.3412170410156},"rot":{"x":0.0208068694919348,"y":270.006164550781,"z":0.0167733952403069}},"86cf73":{"lock":false,"pos":{"x":58.3838310241699,"y":1.31010210514069,"z":92.3903579711914},"rot":{"x":0.0208162926137447,"y":269.973419189453,"z":0.016761502251029}},"88cd33":{"lock":false,"pos":{"x":58.3843688964844,"y":1.3087557554245,"z":87.7903823852539},"rot":{"x":0.0208063907921314,"y":270.007446289063,"z":0.0167739409953356}},"8a25a0":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30422377586365,"z":83.2527770996094},"rot":{"x":0.0208070240914822,"y":270.005126953125,"z":0.016773272305727}},"8b7da2":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30042505264282,"z":80.9486999511719},"rot":{"x":0.020813625305891,"y":269.982177734375,"z":0.0167646203190088}},"8c5d4c":{"lock":false,"pos":{"x":53.212776184082,"y":1.29612362384796,"z":51.0517272949219},"rot":{"x":0.020806884393096,"y":270.005615234375,"z":0.0167731009423733}},"8d6ae6":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29981470108032,"z":83.2607269287109},"rot":{"x":0.0208138823509216,"y":269.980102539063,"z":0.0167629085481167}},"9230a8":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29773211479187,"z":71.7486801147461},"rot":{"x":0.0208088699728251,"y":269.999298095703,"z":0.0167710203677416}},"92c7df":{"lock":false,"pos":{"x":58.3838233947754,"y":1.32234311103821,"z":76.2903518676758},"rot":{"x":0.0208156257867813,"y":269.980285644531,"z":0.0167646165937185}},"930b6b":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30083894729614,"z":67.1411056518555},"rot":{"x":0.0208088103681803,"y":269.999389648438,"z":0.0167709551751614}},"99765a":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3082447052002,"z":92.4412155151367},"rot":{"x":0.0208069384098053,"y":270.006042480469,"z":0.0167734976857901}},"9eeca1":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30220401287079,"z":76.3527679443359},"rot":{"x":0.020806921645999,"y":270.004974365234,"z":0.0167729165405035}},"a88e8d":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30606257915497,"z":78.5903549194336},"rot":{"x":0.0208042599260807,"y":270.014892578125,"z":0.0167765431106091}},"ad73d9":{"lock":false,"pos":{"x":44.5133094787598,"y":1.3067045211792,"z":92.4607315063477},"rot":{"x":0.0208088736981153,"y":269.998962402344,"z":0.0167707800865173}},"af3efd":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30183446407318,"z":90.1607360839844},"rot":{"x":0.0208141878247261,"y":269.980316162109,"z":0.0167620554566383}},"af4c03":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30689823627472,"z":87.8412399291992},"rot":{"x":0.0208071786910295,"y":270.0048828125,"z":0.0167728960514069}},"b2fedd":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30109834671021,"z":83.2486877441406},"rot":{"x":0.0208136364817619,"y":269.982238769531,"z":0.0167648512870073}},"b58038":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30487847328186,"z":80.9412231445313},"rot":{"x":0.0208068005740643,"y":270.006042480469,"z":0.0167733076959848}},"b789ac":{"lock":false,"pos":{"x":58.3838272094727,"y":1.3094288110733,"z":90.0903625488281},"rot":{"x":0.0208050962537527,"y":270.011291503906,"z":0.0167752541601658}},"bd34f2":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638564586639,"z":67.1486740112305},"rot":{"x":0.0208139475435019,"y":269.981567382813,"z":0.0167643986642361}},"bf3261":{"lock":false,"pos":{"x":53.212776184082,"y":1.29612350463867,"z":51.0517272949219},"rot":{"x":0.0208070650696754,"y":270.005340576172,"z":0.016773259267211}},"c021fd":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30757141113281,"z":90.141242980957},"rot":{"x":0.0208068154752254,"y":270.006042480469,"z":0.0167733337730169}},"c634a0":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208051167428494,"y":270.011688232422,"z":0.0167754329741001}},"ca17b8":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.0208071954548359,"y":270.004486083984,"z":0.0167728140950203}},"ca8448":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29644846916199,"z":71.7607116699219},"rot":{"x":0.020815072581172,"y":269.9814453125,"z":0.0167647711932659}},"cc23ea":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30287730693817,"z":78.6527709960938},"rot":{"x":0.0208073202520609,"y":270.005035400391,"z":0.0167729705572128}},"ce4f97":{"lock":false,"pos":{"x":40.9602012634277,"y":1.30244481563568,"z":87.8486938476563},"rot":{"x":0.0208136923611164,"y":269.982330322266,"z":0.0167649239301682}},"db2e8d":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369378089905,"z":57.9485626220703},"rot":{"x":0.0208139270544052,"y":269.98193359375,"z":0.0167646314948797}},"db4a43":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705882072449,"z":69.4486770629883},"rot":{"x":0.0208144653588533,"y":269.980041503906,"z":0.0167638566344976}},"e29603":{"lock":false,"pos":{"x":40.9601745605469,"y":1.29571235179901,"z":64.8486557006836},"rot":{"x":0.0208137929439545,"y":269.982055664063,"z":0.0167645253241062}},"e4c7c9":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29907858371735,"z":76.3486785888672},"rot":{"x":0.0208136811852455,"y":269.981994628906,"z":0.0167646426707506}},"ea9ad0":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30538940429688,"z":76.2903518676758},"rot":{"x":0.0208039563149214,"y":270.015808105469,"z":0.0167770106345415}},"edd051":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30218553543091,"z":71.7412185668945},"rot":{"x":0.0208070613443851,"y":270.004791259766,"z":0.0167730432003737}},"f2f912":{"lock":false,"pos":{"x":37.4159774780273,"y":1.2957751750946,"z":69.4607162475586},"rot":{"x":0.0208132546395063,"y":269.981872558594,"z":0.0167641490697861}},"f6dfe5":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436600208282,"z":60.2487869262695},"rot":{"x":0.0208143796771765,"y":269.979736328125,"z":0.0167637951672077}},"f8d22e":{"lock":false,"pos":{"x":40.9602012634277,"y":1.30379128456116,"z":92.4486923217773},"rot":{"x":0.0208142455667257,"y":269.979888916016,"z":0.0167639404535294}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Keen Eye 0dc75e.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Keen Eye 0dc75e.yaml new file mode 100644 index 000000000..65d7fe894 --- /dev/null +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Keen Eye 0dc75e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0dc75e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Keen Eye +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 40.96 + posY: 1.29 + posZ: 51.06 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Machete 273797.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Machete 273797.yaml index c7f05ca26..06ca52a4c 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Machete 273797.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Machete 273797.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.29 - posZ: 51.06 + posZ: 48.75 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Physical Training 45a012.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Physical Training 45a012.yaml index 305c9136d..e550e9977 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Physical Training 45a012.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Physical Training 45a012.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 40.96 - posY: 1.29 - posZ: 48.75 + posX: 37.42 + posY: 1.3 + posZ: 92.46 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Relentless af3efd.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Relentless af3efd.yaml index aa66d0de9..0f2d94bd9 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Relentless af3efd.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Relentless af3efd.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 92.46 + posZ: 90.16 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Riot Whistle 55fc3d.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Riot Whistle 55fc3d.yaml index 952b71f73..7ae75eaf2 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Riot Whistle 55fc3d.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Riot Whistle 55fc3d.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 90.16 + posZ: 87.86 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Rite of Sanctification 7db258.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Rite of Sanctification 7db258.yaml index 999070477..046008397 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Rite of Sanctification 7db258.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Rite of Sanctification 7db258.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 87.86 + posZ: 85.56 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Safeguard 8d6ae6.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Safeguard 8d6ae6.yaml index 638429484..1054b440a 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Safeguard 8d6ae6.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Safeguard 8d6ae6.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 85.56 + posZ: 83.26 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Solemn Vow 660d08.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Solemn Vow 660d08.yaml index 87b146efa..53bf0246d 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Solemn Vow 660d08.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Solemn Vow 660d08.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 83.26 + posZ: 80.96 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Something Worth Fighting For 826897.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Something Worth Fighting For 826897.yaml index c233f41c6..b85642885 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Something Worth Fighting For 826897.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Something Worth Fighting For 826897.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 80.96 + posZ: 78.66 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Survival Knife 840b3d.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Survival Knife 840b3d.yaml index 340dc3d9b..61acb3619 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Survival Knife 840b3d.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Survival Knife 840b3d.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 78.66 + posZ: 76.36 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Tetsuo Mori 82ee35.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Tetsuo Mori 82ee35.yaml index 062e65e62..0ad4a4b24 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Tetsuo Mori 82ee35.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Tetsuo Mori 82ee35.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 76.36 + posZ: 74.06 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Trench Knife ca8448.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Trench Knife ca8448.yaml index e8c393360..709a9db63 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Trench Knife ca8448.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Trench Knife ca8448.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 74.06 + posZ: 71.76 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card True Grit f2f912.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card True Grit f2f912.yaml index 319898af6..13ac73ee3 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card True Grit f2f912.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card True Grit f2f912.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 71.76 + posZ: 69.46 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Venturer 293e8d.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Venturer 293e8d.yaml index 009e537cf..a3a84dba0 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Card Venturer 293e8d.yaml +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Card Venturer 293e8d.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 69.46 + posZ: 67.16 rotX: 0.02 rotY: 269.97 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210.ttslua b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.ttslua similarity index 96% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210.ttslua rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210.ttslua +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.yaml new file mode 100644 index 000000000..44df84d0a --- /dev/null +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.yaml @@ -0,0 +1,122 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag Guardian 626787/Card Keen Eye 0dc75e.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card .35 Winchester 0a7642.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card First Watch 0da344.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Self-Sacrifice 184380.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card I''ll see you in hell! 19507d.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Let me handle this! 195b7f.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Counterpunch 20645e.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card One-Two Punch 22bb1e.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Dynamite Blast 22c65b.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Glory 273584.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Machete 273797.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Venturer 293e8d.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Clean Them Out 3319be.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Physical Training 45a012.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Hallowed Mirror 460cb8.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card .45 Thompson 4f6ede.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Flesh Ward 52c686.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Teamwork 55ce00.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Riot Whistle 55fc3d.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Beat Cop 591f6f.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Blessed Blade 59390b.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Get over here! 5b0f86.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Second Wind 5fa99a.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Interrogate 60acf8.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Monster Slayer 63b3e5.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Solemn Vow 660d08.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Prepared for the Worst 6aa477.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card If it bleeds... 6d3fdf.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Heroic Rescue 724c85.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Dodge 7646d6.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Emergency Aid 7b6fd8.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Rite of Sanctification 7db258.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Leadership 7dc5e1.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Handcuffs 7dce77.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Stand Together 7ec473.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Something Worth Fighting For 826897.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Tetsuo Mori 82ee35.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Survival Knife 840b3d.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Evidence! 8475cc.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Daring 86cf73.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Intrepid 88cd33.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Taunt 8a25a0.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Bandolier 8b7da2.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Safeguard 8d6ae6.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Book of Psalms 9230a8.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Hand of Fate 930b6b.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Warning Shot 9eeca1.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Take the Initiative a88e8d.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Relentless af3efd.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Delay the Inevitable af4c03.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Alice Luxley b2fedd.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Eat lead! b58038.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Inspiring Presence b789ac.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Enchanted Blade bd34f2.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card On The Hunt bf3261.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Steadfast c634a0.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Scene of the Crime ca17b8.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Trench Knife ca8448.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Trusted cc23ea.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card .45 Automatic ce4f97.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Guard Dog db2e8d.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Boxing Gloves db4a43.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card First Aid e29603.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Blackjack e4c7c9.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Vicious Blow ea9ad0.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card True Grit f2f912.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card Grete Wagner f6dfe5.yaml' +- !include 'Custom_Model_Bag Guardian 626787/Card .32 Colt f8d22e.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516201848/72B3B9E2B59F25FEC82412AC22245D03655A4558/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '626787' +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Guardian 626787.ttslua' +LuaScriptState: '{"ml":{"03367f":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30557024478912,"z":87.8527908325195},"rot":{"x":0.0208070911467075,"y":270.004760742188,"z":0.0167728867381811}},"037dc7":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30151224136353,"z":69.4412155151367},"rot":{"x":0.0208070278167725,"y":270.005157470703,"z":0.016772884875536}},"0a7642":{"lock":false,"pos":{"x":40.960205078125,"y":1.30311810970306,"z":90.1487045288086},"rot":{"x":0.0208138488233089,"y":269.982269287109,"z":0.0167646799236536}},"0da344":{"lock":false,"pos":{"x":53.2285614013672,"y":1.302858710289,"z":74.0412216186523},"rot":{"x":0.0208070911467075,"y":270.005218505859,"z":0.0167732313275337}},"0dc75e":{"lock":false,"pos":{"x":40.9633750915527,"y":1.29167747497559,"z":51.0597686767578},"rot":{"x":0.0208078417927027,"y":270.000793457031,"z":0.0167702063918114}},"184380":{"lock":false,"pos":{"x":58.3838386535645,"y":1.30740904808044,"z":83.1903610229492},"rot":{"x":0.0208061337471008,"y":270.008636474609,"z":0.0167743898928165}},"19507d":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29881930351257,"z":60.2411842346191},"rot":{"x":0.0208070985972881,"y":270.005187988281,"z":0.0167730413377285}},"195b7f":{"lock":false,"pos":{"x":53.2284660339355,"y":1.29747271537781,"z":55.641185760498},"rot":{"x":0.0208070389926434,"y":270.005126953125,"z":0.0167730897665024}},"20645e":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30757141113281,"z":90.141242980957},"rot":{"x":0.0208145175129175,"y":269.980102539063,"z":0.0167639441788197}},"22bb1e":{"lock":false,"pos":{"x":53.2126159667969,"y":1.29544842243195,"z":48.7452774047852},"rot":{"x":0.0208143312484026,"y":269.979919433594,"z":0.0167638622224331}},"22c65b":{"lock":false,"pos":{"x":53.228572845459,"y":1.30555176734924,"z":83.2412338256836},"rot":{"x":0.0208071675151587,"y":270.004638671875,"z":0.0167727284133434}},"273584":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30151224136353,"z":69.4412231445313},"rot":{"x":0.0208143703639507,"y":269.979858398438,"z":0.0167638529092073}},"273797":{"lock":false,"pos":{"x":40.9634170532227,"y":1.29100203514099,"z":48.7527351379395},"rot":{"x":0.0208137631416321,"y":269.981781005859,"z":0.0167645271867514}},"293e8d":{"lock":false,"pos":{"x":37.4159698486328,"y":1.29510188102722,"z":67.1606750488281},"rot":{"x":0.0208192318677902,"y":269.966217041016,"z":0.0167592242360115}},"310d95":{"lock":false,"pos":{"x":53.2284660339355,"y":1.29747271537781,"z":55.641185760498},"rot":{"x":0.0208068396896124,"y":270.005554199219,"z":0.0167730785906315}},"3319be":{"lock":false,"pos":{"x":53.2285690307617,"y":1.3082447052002,"z":92.4412307739258},"rot":{"x":0.0208143629133701,"y":269.979644775391,"z":0.0167638659477234}},"3a4576":{"lock":false,"pos":{"x":40.9601860046387,"y":1.29571235179901,"z":64.8486633300781},"rot":{"x":0.0208133514970541,"y":269.981994628906,"z":0.0167643446475267}},"45a012":{"lock":false,"pos":{"x":37.4159927368164,"y":1.30250763893127,"z":92.4607315063477},"rot":{"x":0.0208132322877645,"y":269.981750488281,"z":0.0167642869055271}},"460cb8":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302072525024,"z":55.6492195129395},"rot":{"x":0.0208138767629862,"y":269.98193359375,"z":0.0167645458132029}},"4719d3":{"lock":false,"pos":{"x":40.960205078125,"y":1.29638564586639,"z":67.1486892700195},"rot":{"x":0.0208132304251194,"y":269.981994628906,"z":0.0167643893510103}},"493908":{"lock":false,"pos":{"x":40.9634284973145,"y":1.2916773557663,"z":51.0597648620605},"rot":{"x":0.0208142362535,"y":269.981781005859,"z":0.0167653206735849}},"4b1e76":{"lock":false,"pos":{"x":40.9634170532227,"y":1.29100203514099,"z":48.7527351379395},"rot":{"x":0.020814212039113,"y":269.981750488281,"z":0.0167643204331398}},"4f6ede":{"lock":false,"pos":{"x":40.960205078125,"y":1.30177164077759,"z":85.5486907958984},"rot":{"x":0.0208138786256313,"y":269.982269287109,"z":0.016764722764492}},"52c686":{"lock":false,"pos":{"x":40.9601783752441,"y":1.29503917694092,"z":62.5487480163574},"rot":{"x":0.0208144839853048,"y":269.979675292969,"z":0.0167638193815947}},"55ce00":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30355060100555,"z":80.9527740478516},"rot":{"x":0.0208072625100613,"y":270.005187988281,"z":0.0167730990797281}},"55fc3d":{"lock":false,"pos":{"x":37.4159851074219,"y":1.3011611700058,"z":87.8607330322266},"rot":{"x":0.020808182656765,"y":269.998992919922,"z":0.0167704448103905}},"591f6f":{"lock":false,"pos":{"x":40.9601898193359,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208138674497604,"y":269.981811523438,"z":0.0167644452303648}},"59390b":{"lock":false,"pos":{"x":40.9602088928223,"y":1.29840540885925,"z":74.048698425293},"rot":{"x":0.0208088085055351,"y":269.999328613281,"z":0.0167708918452263}},"5b0f86":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30218553543091,"z":71.7412261962891},"rot":{"x":0.0208141338080168,"y":269.980529785156,"z":0.0167641341686249}},"5ec2d2":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29907858371735,"z":76.3486785888672},"rot":{"x":0.0208143461495638,"y":269.982147216797,"z":0.0167657192796469}},"5fa99a":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30557024478912,"z":87.8527908325195},"rot":{"x":0.0208070501685143,"y":270.005157470703,"z":0.0167731717228889}},"60acf8":{"lock":false,"pos":{"x":53.2305908203125,"y":1.29814672470093,"z":57.9409637451172},"rot":{"x":0.020807147026062,"y":270.004699707031,"z":0.0167727023363113}},"63b3e5":{"lock":false,"pos":{"x":53.2285957336426,"y":1.29679954051971,"z":53.3411674499512},"rot":{"x":0.0208144653588533,"y":269.979583740234,"z":0.0167637001723051}},"660d08":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29914140701294,"z":80.9607162475586},"rot":{"x":0.0208150614053011,"y":269.981719970703,"z":0.0167647656053305}},"6aa477":{"lock":false,"pos":{"x":49.5628395080566,"y":1.3069167137146,"z":92.4527816772461},"rot":{"x":0.0208068080246449,"y":270.005432128906,"z":0.0167732276022434}},"6d3fdf":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29949247837067,"z":62.5411834716797},"rot":{"x":0.0208065714687109,"y":270.006042480469,"z":0.0167734231799841}},"724c85":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30016577243805,"z":64.8410797119141},"rot":{"x":0.0208068042993546,"y":270.006134033203,"z":0.0167733114212751}},"7646d6":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30622494220734,"z":85.5412216186523},"rot":{"x":0.0208069067448378,"y":270.005859375,"z":0.0167733952403069}},"7b6fd8":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30420517921448,"z":78.6412200927734},"rot":{"x":0.0208073277026415,"y":270.0048828125,"z":0.0167729947715998}},"7db258":{"lock":false,"pos":{"x":37.4159851074219,"y":1.30048787593842,"z":85.5607223510742},"rot":{"x":0.020809568464756,"y":269.999237060547,"z":0.0167712271213531}},"7dc5e1":{"lock":false,"pos":{"x":58.3838424682617,"y":1.30808234214783,"z":85.490364074707},"rot":{"x":0.0208050291985273,"y":270.011932373047,"z":0.0167757626622915}},"7dce77":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.0208139028400183,"y":269.981811523438,"z":0.0167644955217838}},"7ec473":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30489706993103,"z":85.5527801513672},"rot":{"x":0.0208144672214985,"y":269.979675292969,"z":0.0167637318372726}},"826897":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29846811294556,"z":78.6607131958008},"rot":{"x":0.0208148825913668,"y":269.981689453125,"z":0.0167648438364267}},"82ee35":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29712176322937,"z":74.0607223510742},"rot":{"x":0.0208132453262806,"y":269.981750488281,"z":0.0167642626911402}},"840b3d":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29779493808746,"z":76.360710144043},"rot":{"x":0.0208148956298828,"y":269.981597900391,"z":0.0167648028582335}},"8475cc":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30353200435638,"z":76.3412170410156},"rot":{"x":0.0208068694919348,"y":270.006164550781,"z":0.0167733952403069}},"86cf73":{"lock":false,"pos":{"x":58.3838310241699,"y":1.31010210514069,"z":92.3903579711914},"rot":{"x":0.0208162926137447,"y":269.973419189453,"z":0.016761502251029}},"88cd33":{"lock":false,"pos":{"x":58.3843688964844,"y":1.3087557554245,"z":87.7903823852539},"rot":{"x":0.0208063907921314,"y":270.007446289063,"z":0.0167739409953356}},"8a25a0":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30422377586365,"z":83.2527770996094},"rot":{"x":0.0208070240914822,"y":270.005126953125,"z":0.016773272305727}},"8b7da2":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30042505264282,"z":80.9486999511719},"rot":{"x":0.020813625305891,"y":269.982177734375,"z":0.0167646203190088}},"8c5d4c":{"lock":false,"pos":{"x":53.212776184082,"y":1.29612362384796,"z":51.0517272949219},"rot":{"x":0.020806884393096,"y":270.005615234375,"z":0.0167731009423733}},"8d6ae6":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29981470108032,"z":83.2607269287109},"rot":{"x":0.0208138823509216,"y":269.980102539063,"z":0.0167629085481167}},"9230a8":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29773211479187,"z":71.7486801147461},"rot":{"x":0.0208088699728251,"y":269.999298095703,"z":0.0167710203677416}},"92c7df":{"lock":false,"pos":{"x":58.3838233947754,"y":1.32234311103821,"z":76.2903518676758},"rot":{"x":0.0208156257867813,"y":269.980285644531,"z":0.0167646165937185}},"930b6b":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30083894729614,"z":67.1411056518555},"rot":{"x":0.0208088103681803,"y":269.999389648438,"z":0.0167709551751614}},"99765a":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3082447052002,"z":92.4412155151367},"rot":{"x":0.0208069384098053,"y":270.006042480469,"z":0.0167734976857901}},"9eeca1":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30220401287079,"z":76.3527679443359},"rot":{"x":0.020806921645999,"y":270.004974365234,"z":0.0167729165405035}},"a88e8d":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30606257915497,"z":78.5903549194336},"rot":{"x":0.0208042599260807,"y":270.014892578125,"z":0.0167765431106091}},"ad73d9":{"lock":false,"pos":{"x":44.5133094787598,"y":1.3067045211792,"z":92.4607315063477},"rot":{"x":0.0208088736981153,"y":269.998962402344,"z":0.0167707800865173}},"af3efd":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30183446407318,"z":90.1607360839844},"rot":{"x":0.0208141878247261,"y":269.980316162109,"z":0.0167620554566383}},"af4c03":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30689823627472,"z":87.8412399291992},"rot":{"x":0.0208071786910295,"y":270.0048828125,"z":0.0167728960514069}},"b2fedd":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30109834671021,"z":83.2486877441406},"rot":{"x":0.0208136364817619,"y":269.982238769531,"z":0.0167648512870073}},"b58038":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30487847328186,"z":80.9412231445313},"rot":{"x":0.0208068005740643,"y":270.006042480469,"z":0.0167733076959848}},"b789ac":{"lock":false,"pos":{"x":58.3838272094727,"y":1.3094288110733,"z":90.0903625488281},"rot":{"x":0.0208050962537527,"y":270.011291503906,"z":0.0167752541601658}},"bd34f2":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638564586639,"z":67.1486740112305},"rot":{"x":0.0208139475435019,"y":269.981567382813,"z":0.0167643986642361}},"bf3261":{"lock":false,"pos":{"x":53.212776184082,"y":1.29612350463867,"z":51.0517272949219},"rot":{"x":0.0208070650696754,"y":270.005340576172,"z":0.016773259267211}},"c021fd":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30757141113281,"z":90.141242980957},"rot":{"x":0.0208068154752254,"y":270.006042480469,"z":0.0167733337730169}},"c634a0":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208051167428494,"y":270.011688232422,"z":0.0167754329741001}},"ca17b8":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.0208071954548359,"y":270.004486083984,"z":0.0167728140950203}},"ca8448":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29644846916199,"z":71.7607116699219},"rot":{"x":0.020815072581172,"y":269.9814453125,"z":0.0167647711932659}},"cc23ea":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30287730693817,"z":78.6527709960938},"rot":{"x":0.0208073202520609,"y":270.005035400391,"z":0.0167729705572128}},"ce4f97":{"lock":false,"pos":{"x":40.9602012634277,"y":1.30244481563568,"z":87.8486938476563},"rot":{"x":0.0208136923611164,"y":269.982330322266,"z":0.0167649239301682}},"db2e8d":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369378089905,"z":57.9485626220703},"rot":{"x":0.0208139270544052,"y":269.98193359375,"z":0.0167646314948797}},"db4a43":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705882072449,"z":69.4486770629883},"rot":{"x":0.0208144653588533,"y":269.980041503906,"z":0.0167638566344976}},"e29603":{"lock":false,"pos":{"x":40.9601745605469,"y":1.29571235179901,"z":64.8486557006836},"rot":{"x":0.0208137929439545,"y":269.982055664063,"z":0.0167645253241062}},"e4c7c9":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29907858371735,"z":76.3486785888672},"rot":{"x":0.0208136811852455,"y":269.981994628906,"z":0.0167646426707506}},"ea9ad0":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30538940429688,"z":76.2903518676758},"rot":{"x":0.0208039563149214,"y":270.015808105469,"z":0.0167770106345415}},"edd051":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30218553543091,"z":71.7412185668945},"rot":{"x":0.0208070613443851,"y":270.004791259766,"z":0.0167730432003737}},"f2f912":{"lock":false,"pos":{"x":37.4159774780273,"y":1.2957751750946,"z":69.4607162475586},"rot":{"x":0.0208132546395063,"y":269.981872558594,"z":0.0167641490697861}},"f6dfe5":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436600208282,"z":60.2487869262695},"rot":{"x":0.0208143796771765,"y":269.979736328125,"z":0.0167637951672077}},"f8d22e":{"lock":false,"pos":{"x":40.9602012634277,"y":1.30379128456116,"z":92.4486923217773},"rot":{"x":0.0208142455667257,"y":269.979888916016,"z":0.0167639404535294}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Guardian +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.61 + posY: 1.67 + posZ: 75.88 + rotX: 0.02 + rotY: 270.02 + rotZ: 0.02 + scaleX: 1.2 + scaleY: 1.2 + scaleZ: 1.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card .32 Colt f8d22e.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card .32 Colt f8d22e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card .32 Colt f8d22e.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card .32 Colt f8d22e.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card .35 Winchester 0a7642.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card .35 Winchester 0a7642.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card .35 Winchester 0a7642.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card .35 Winchester 0a7642.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card .45 Automatic ce4f97.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card .45 Automatic ce4f97.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card .45 Automatic ce4f97.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card .45 Automatic ce4f97.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card .45 Thompson 4f6ede.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card .45 Thompson 4f6ede.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card .45 Thompson 4f6ede.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card .45 Thompson 4f6ede.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Alice Luxley b2fedd.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Alice Luxley b2fedd.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Alice Luxley b2fedd.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Alice Luxley b2fedd.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Bandolier 8b7da2.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Bandolier 8b7da2.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Bandolier 8b7da2.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Bandolier 8b7da2.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Beat Cop 591f6f.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Beat Cop 591f6f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Beat Cop 591f6f.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Beat Cop 591f6f.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Blackjack e4c7c9.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Blackjack e4c7c9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Blackjack e4c7c9.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Blackjack e4c7c9.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Blessed Blade 59390b.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Blessed Blade 59390b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Blessed Blade 59390b.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Blessed Blade 59390b.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Book of Psalms 9230a8.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Book of Psalms 9230a8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Book of Psalms 9230a8.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Book of Psalms 9230a8.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Boxing Gloves db4a43.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Boxing Gloves db4a43.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Boxing Gloves db4a43.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Boxing Gloves db4a43.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Clean Them Out 3319be.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Clean Them Out 3319be.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Clean Them Out 3319be.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Clean Them Out 3319be.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Counterpunch 20645e.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Counterpunch 20645e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Counterpunch 20645e.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Counterpunch 20645e.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Daring 86cf73.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Daring 86cf73.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Daring 86cf73.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Daring 86cf73.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Delay the Inevitable af4c03.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Delay the Inevitable af4c03.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Delay the Inevitable af4c03.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Delay the Inevitable af4c03.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Dodge 7646d6.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Dodge 7646d6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Dodge 7646d6.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Dodge 7646d6.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Dynamite Blast 22c65b.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Dynamite Blast 22c65b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Dynamite Blast 22c65b.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Dynamite Blast 22c65b.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Eat lead! b58038.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Eat lead! b58038.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Eat lead! b58038.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Eat lead! b58038.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Emergency Aid 7b6fd8.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Emergency Aid 7b6fd8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Emergency Aid 7b6fd8.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Emergency Aid 7b6fd8.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Enchanted Blade bd34f2.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Enchanted Blade bd34f2.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Enchanted Blade bd34f2.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Enchanted Blade bd34f2.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Evidence! 8475cc.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Evidence! 8475cc.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Evidence! 8475cc.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Evidence! 8475cc.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card First Aid e29603.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card First Aid e29603.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card First Aid e29603.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card First Aid e29603.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card First Watch 0da344.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card First Watch 0da344.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card First Watch 0da344.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card First Watch 0da344.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Flesh Ward 52c686.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Flesh Ward 52c686.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Flesh Ward 52c686.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Flesh Ward 52c686.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Get over here! 5b0f86.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Get over here! 5b0f86.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Get over here! 5b0f86.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Get over here! 5b0f86.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Glory 273584.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Glory 273584.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Glory 273584.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Glory 273584.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Grete Wagner f6dfe5.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Grete Wagner f6dfe5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Grete Wagner f6dfe5.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Grete Wagner f6dfe5.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Guard Dog db2e8d.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Guard Dog db2e8d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Guard Dog db2e8d.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Guard Dog db2e8d.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Hallowed Mirror 460cb8.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Hallowed Mirror 460cb8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Hallowed Mirror 460cb8.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Hallowed Mirror 460cb8.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Hand of Fate 930b6b.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Hand of Fate 930b6b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Hand of Fate 930b6b.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Hand of Fate 930b6b.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Handcuffs 7dce77.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Handcuffs 7dce77.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Handcuffs 7dce77.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Handcuffs 7dce77.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Heroic Rescue 724c85.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Heroic Rescue 724c85.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Heroic Rescue 724c85.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Heroic Rescue 724c85.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card I'll see you in hell! 19507d.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card I'll see you in hell! 19507d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card I'll see you in hell! 19507d.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card I'll see you in hell! 19507d.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card If it bleeds... 6d3fdf.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card If it bleeds... 6d3fdf.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card If it bleeds... 6d3fdf.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card If it bleeds... 6d3fdf.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Inspiring Presence b789ac.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Inspiring Presence b789ac.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Inspiring Presence b789ac.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Inspiring Presence b789ac.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Interrogate 60acf8.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Interrogate 60acf8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Interrogate 60acf8.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Interrogate 60acf8.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Intrepid 88cd33.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Intrepid 88cd33.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Intrepid 88cd33.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Intrepid 88cd33.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Keen Eye 0dc75e.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Keen Eye 0dc75e.yaml new file mode 100644 index 000000000..4412a7851 --- /dev/null +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Keen Eye 0dc75e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232100 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0dc75e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Keen Eye +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.62 + posY: 1.41 + posZ: 75.88 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Leadership 7dc5e1.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Leadership 7dc5e1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Leadership 7dc5e1.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Leadership 7dc5e1.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Let me handle this! 195b7f.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Let me handle this! 195b7f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Let me handle this! 195b7f.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Let me handle this! 195b7f.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Machete 273797.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Machete 273797.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Machete 273797.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Machete 273797.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Monster Slayer 63b3e5.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Monster Slayer 63b3e5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Monster Slayer 63b3e5.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Monster Slayer 63b3e5.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card On The Hunt bf3261.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card On The Hunt bf3261.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card On The Hunt bf3261.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card On The Hunt bf3261.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card One-Two Punch 22bb1e.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card One-Two Punch 22bb1e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card One-Two Punch 22bb1e.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card One-Two Punch 22bb1e.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Physical Training 45a012.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Physical Training 45a012.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Physical Training 45a012.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Physical Training 45a012.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Prepared for the Worst 6aa477.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Prepared for the Worst 6aa477.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Prepared for the Worst 6aa477.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Prepared for the Worst 6aa477.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Relentless af3efd.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Relentless af3efd.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Relentless af3efd.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Relentless af3efd.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Riot Whistle 55fc3d.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Riot Whistle 55fc3d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Riot Whistle 55fc3d.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Riot Whistle 55fc3d.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Rite of Sanctification 7db258.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Rite of Sanctification 7db258.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Rite of Sanctification 7db258.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Rite of Sanctification 7db258.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Safeguard 8d6ae6.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Safeguard 8d6ae6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Safeguard 8d6ae6.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Safeguard 8d6ae6.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Scene of the Crime ca17b8.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Scene of the Crime ca17b8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Scene of the Crime ca17b8.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Scene of the Crime ca17b8.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Second Wind 5fa99a.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Second Wind 5fa99a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Second Wind 5fa99a.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Second Wind 5fa99a.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Self-Sacrifice 184380.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Self-Sacrifice 184380.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Self-Sacrifice 184380.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Self-Sacrifice 184380.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Solemn Vow 660d08.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Solemn Vow 660d08.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Solemn Vow 660d08.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Solemn Vow 660d08.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Something Worth Fighting For 826897.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Something Worth Fighting For 826897.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Something Worth Fighting For 826897.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Something Worth Fighting For 826897.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Stand Together 7ec473.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Stand Together 7ec473.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Stand Together 7ec473.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Stand Together 7ec473.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Steadfast c634a0.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Steadfast c634a0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Steadfast c634a0.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Steadfast c634a0.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Survival Knife 840b3d.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Survival Knife 840b3d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Survival Knife 840b3d.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Survival Knife 840b3d.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Take the Initiative a88e8d.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Take the Initiative a88e8d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Take the Initiative a88e8d.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Take the Initiative a88e8d.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Taunt 8a25a0.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Taunt 8a25a0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Taunt 8a25a0.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Taunt 8a25a0.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Teamwork 55ce00.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Teamwork 55ce00.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Teamwork 55ce00.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Teamwork 55ce00.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Tetsuo Mori 82ee35.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Tetsuo Mori 82ee35.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Tetsuo Mori 82ee35.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Tetsuo Mori 82ee35.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Trench Knife ca8448.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Trench Knife ca8448.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Trench Knife ca8448.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Trench Knife ca8448.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card True Grit f2f912.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card True Grit f2f912.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card True Grit f2f912.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card True Grit f2f912.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Trusted cc23ea.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Trusted cc23ea.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Trusted cc23ea.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Trusted cc23ea.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Venturer 293e8d.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Venturer 293e8d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Venturer 293e8d.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Venturer 293e8d.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Vicious Blow ea9ad0.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Vicious Blow ea9ad0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Vicious Blow ea9ad0.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Vicious Blow ea9ad0.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Warning Shot 9eeca1.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Warning Shot 9eeca1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210/Card Warning Shot 9eeca1.yaml rename to unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787/Card Warning Shot 9eeca1.yaml diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210.yaml b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210.yaml deleted file mode 100644 index e9998773c..000000000 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian bc3210.yaml +++ /dev/null @@ -1,121 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 -ContainedObjects: -- !include 'Custom_Model_Bag Guardian bc3210/Card Riot Whistle 55fc3d.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card .35 Winchester 0a7642.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card First Watch 0da344.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Self-Sacrifice 184380.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card I''ll see you in hell! 19507d.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Let me handle this! 195b7f.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Counterpunch 20645e.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card One-Two Punch 22bb1e.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Dynamite Blast 22c65b.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Glory 273584.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Machete 273797.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Venturer 293e8d.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Clean Them Out 3319be.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Physical Training 45a012.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Hallowed Mirror 460cb8.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card .45 Thompson 4f6ede.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Flesh Ward 52c686.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Teamwork 55ce00.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Beat Cop 591f6f.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Blessed Blade 59390b.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Get over here! 5b0f86.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Second Wind 5fa99a.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Interrogate 60acf8.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Monster Slayer 63b3e5.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Solemn Vow 660d08.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Prepared for the Worst 6aa477.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card If it bleeds... 6d3fdf.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Heroic Rescue 724c85.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Dodge 7646d6.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Emergency Aid 7b6fd8.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Rite of Sanctification 7db258.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Leadership 7dc5e1.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Handcuffs 7dce77.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Stand Together 7ec473.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Something Worth Fighting For 826897.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Tetsuo Mori 82ee35.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Survival Knife 840b3d.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Evidence! 8475cc.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Daring 86cf73.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Intrepid 88cd33.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Taunt 8a25a0.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Bandolier 8b7da2.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Safeguard 8d6ae6.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Book of Psalms 9230a8.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Hand of Fate 930b6b.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Warning Shot 9eeca1.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Take the Initiative a88e8d.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Relentless af3efd.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Delay the Inevitable af4c03.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Alice Luxley b2fedd.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Eat lead! b58038.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Inspiring Presence b789ac.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Enchanted Blade bd34f2.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card On The Hunt bf3261.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Steadfast c634a0.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Scene of the Crime ca17b8.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Trench Knife ca8448.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Trusted cc23ea.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card .45 Automatic ce4f97.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Guard Dog db2e8d.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Boxing Gloves db4a43.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card First Aid e29603.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Blackjack e4c7c9.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Vicious Blow ea9ad0.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card True Grit f2f912.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card Grete Wagner f6dfe5.yaml' -- !include 'Custom_Model_Bag Guardian bc3210/Card .32 Colt f8d22e.yaml' -CustomMesh: - CastShadows: true - ColliderURL: '' - Convex: true - CustomShader: - FresnelStrength: 0.0 - SpecularColor: - b: 1.0 - g: 1.0 - r: 1.0 - SpecularIntensity: 0.0 - SpecularSharpness: 2.0 - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516201848/72B3B9E2B59F25FEC82412AC22245D03655A4558/ - MaterialIndex: 3 - MeshURL: https://pastebin.com/raw/ALrYhQGb - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: bc3210 -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: !include 'Custom_Model_Bag Guardian bc3210.ttslua' -LuaScriptState: '{"ml":{"03367f":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30557024478912,"z":87.8527908325195},"rot":{"x":0.0208070911467075,"y":270.004760742188,"z":0.0167728867381811}},"037dc7":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30151224136353,"z":69.4412155151367},"rot":{"x":0.0208070278167725,"y":270.005157470703,"z":0.016772884875536}},"0a7642":{"lock":false,"pos":{"x":40.960205078125,"y":1.30311810970306,"z":90.1487045288086},"rot":{"x":0.0208136718720198,"y":269.982269287109,"z":0.0167649462819099}},"0da344":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30285882949829,"z":74.0412216186523},"rot":{"x":0.0208069160580635,"y":270.005218505859,"z":0.0167732164263725}},"184380":{"lock":false,"pos":{"x":58.3838386535645,"y":1.30740916728973,"z":83.1903610229492},"rot":{"x":0.0208060517907143,"y":270.008636474609,"z":0.0167742259800434}},"19507d":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29881930351257,"z":60.2411842346191},"rot":{"x":0.0208068899810314,"y":270.005187988281,"z":0.0167731214314699}},"195b7f":{"lock":false,"pos":{"x":53.2284660339355,"y":1.2974728345871,"z":55.641185760498},"rot":{"x":0.0208070483058691,"y":270.005126953125,"z":0.0167729463428259}},"20645e":{"lock":false,"pos":{"x":53.2285690307617,"y":1.3075715303421,"z":90.141242980957},"rot":{"x":0.0208143573254347,"y":269.980102539063,"z":0.0167639069259167}},"22bb1e":{"lock":false,"pos":{"x":53.2126159667969,"y":1.29544854164124,"z":48.7452774047852},"rot":{"x":0.0208145808428526,"y":269.979919433594,"z":0.0167638100683689}},"22c65b":{"lock":false,"pos":{"x":53.228572845459,"y":1.30555176734924,"z":83.2412338256836},"rot":{"x":0.0208071786910295,"y":270.004638671875,"z":0.0167727079242468}},"273584":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30151224136353,"z":69.4412231445313},"rot":{"x":0.0208144839853048,"y":269.979858398438,"z":0.0167638082057238}},"273797":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29167747497559,"z":51.0597610473633},"rot":{"x":0.0208138637244701,"y":269.981811523438,"z":0.0167645085602999}},"293e8d":{"lock":false,"pos":{"x":37.4159774780273,"y":1.2957751750946,"z":69.4607086181641},"rot":{"x":0.0208194348961115,"y":269.96630859375,"z":0.0167593434453011}},"310d95":{"lock":false,"pos":{"x":53.2284660339355,"y":1.29747271537781,"z":55.641185760498},"rot":{"x":0.0208068396896124,"y":270.005554199219,"z":0.0167730785906315}},"3319be":{"lock":false,"pos":{"x":53.2285690307617,"y":1.3082447052002,"z":92.4412307739258},"rot":{"x":0.0208146441727877,"y":269.979644775391,"z":0.0167635250836611}},"3a4576":{"lock":false,"pos":{"x":40.9601860046387,"y":1.29571235179901,"z":64.8486633300781},"rot":{"x":0.0208133514970541,"y":269.981994628906,"z":0.0167643446475267}},"45a012":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29100215435028,"z":48.7527389526367},"rot":{"x":0.0208139382302761,"y":269.981750488281,"z":0.0167645905166864}},"460cb8":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302084445953,"z":55.6492195129395},"rot":{"x":0.0208137258887291,"y":269.98193359375,"z":0.016764797270298}},"4719d3":{"lock":false,"pos":{"x":40.960205078125,"y":1.29638564586639,"z":67.1486892700195},"rot":{"x":0.0208132304251194,"y":269.981994628906,"z":0.0167643893510103}},"493908":{"lock":false,"pos":{"x":40.9634284973145,"y":1.2916773557663,"z":51.0597648620605},"rot":{"x":0.0208142362535,"y":269.981781005859,"z":0.0167653206735849}},"4b1e76":{"lock":false,"pos":{"x":40.9634170532227,"y":1.29100203514099,"z":48.7527351379395},"rot":{"x":0.020814212039113,"y":269.981750488281,"z":0.0167643204331398}},"4f6ede":{"lock":false,"pos":{"x":40.960205078125,"y":1.30177164077759,"z":85.5486907958984},"rot":{"x":0.0208136234432459,"y":269.982269287109,"z":0.016764622181654}},"52c686":{"lock":false,"pos":{"x":40.9601783752441,"y":1.29503917694092,"z":62.5487480163574},"rot":{"x":0.02081448584795,"y":269.979675292969,"z":0.0167636964470148}},"55ce00":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30355060100555,"z":80.9527740478516},"rot":{"x":0.0208069998770952,"y":270.005187988281,"z":0.0167731419205666}},"55fc3d":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30183446407318,"z":90.1607437133789},"rot":{"x":0.020808320492506,"y":269.998931884766,"z":0.0167705565690994}},"591f6f":{"lock":false,"pos":{"x":40.9601898193359,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208139047026634,"y":269.981811523438,"z":0.0167643539607525}},"59390b":{"lock":false,"pos":{"x":40.9602088928223,"y":1.29840540885925,"z":74.048698425293},"rot":{"x":0.0208086222410202,"y":269.999328613281,"z":0.0167710185050964}},"5b0f86":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30218553543091,"z":71.7412261962891},"rot":{"x":0.0208142660558224,"y":269.980529785156,"z":0.0167641099542379}},"5ec2d2":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29907858371735,"z":76.3486785888672},"rot":{"x":0.0208143461495638,"y":269.982147216797,"z":0.0167657192796469}},"5fa99a":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30557036399841,"z":87.8527908325195},"rot":{"x":0.0208068955689669,"y":270.005157470703,"z":0.0167733505368233}},"60acf8":{"lock":false,"pos":{"x":53.2305908203125,"y":1.29814684391022,"z":57.9409637451172},"rot":{"x":0.0208073649555445,"y":270.004699707031,"z":0.0167727395892143}},"63b3e5":{"lock":false,"pos":{"x":53.2285957336426,"y":1.296799659729,"z":53.3411674499512},"rot":{"x":0.0208146069198847,"y":269.979583740234,"z":0.0167639888823032}},"660d08":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29981470108032,"z":83.2607269287109},"rot":{"x":0.0208135545253754,"y":269.981781005859,"z":0.0167634300887585}},"6aa477":{"lock":false,"pos":{"x":49.5628395080566,"y":1.30691683292389,"z":92.4527816772461},"rot":{"x":0.020806921645999,"y":270.005432128906,"z":0.0167733915150166}},"6d3fdf":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29949259757996,"z":62.5411834716797},"rot":{"x":0.0208067242056131,"y":270.006042480469,"z":0.0167733654379845}},"724c85":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30016577243805,"z":64.8410797119141},"rot":{"x":0.0208067856729031,"y":270.006134033203,"z":0.0167732369154692}},"7646d6":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30622494220734,"z":85.5412216186523},"rot":{"x":0.0208070110529661,"y":270.005859375,"z":0.0167735200375319}},"7b6fd8":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30420529842377,"z":78.6412200927734},"rot":{"x":0.020807096734643,"y":270.0048828125,"z":0.0167731232941151}},"7db258":{"lock":false,"pos":{"x":37.4159851074219,"y":1.3011611700058,"z":87.860725402832},"rot":{"x":0.0208097919821739,"y":269.999328613281,"z":0.0167713314294815}},"7dc5e1":{"lock":false,"pos":{"x":58.3838424682617,"y":1.30808234214783,"z":85.490364074707},"rot":{"x":0.0208050832152367,"y":270.011932373047,"z":0.0167753808200359}},"7dce77":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.0208137426525354,"y":269.981811523438,"z":0.0167646948248148}},"7ec473":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30489706993103,"z":85.5527801513672},"rot":{"x":0.0208145100623369,"y":269.979675292969,"z":0.0167635511606932}},"826897":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29914140701294,"z":80.9607162475586},"rot":{"x":0.0208148453384638,"y":269.981719970703,"z":0.0167649444192648}},"82ee35":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29779493808746,"z":76.360710144043},"rot":{"x":0.0208145175129175,"y":269.981689453125,"z":0.0167654789984226}},"840b3d":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29846811294556,"z":78.6607131958008},"rot":{"x":0.0208146180957556,"y":269.981689453125,"z":0.0167655181139708}},"8475cc":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30353200435638,"z":76.3412170410156},"rot":{"x":0.0208068881183863,"y":270.006164550781,"z":0.0167732499539852}},"86cf73":{"lock":false,"pos":{"x":58.3838310241699,"y":1.31010210514069,"z":92.3903579711914},"rot":{"x":0.020816283300519,"y":269.973419189453,"z":0.0167614966630936}},"88cd33":{"lock":false,"pos":{"x":58.3843688964844,"y":1.30875587463379,"z":87.7903823852539},"rot":{"x":0.0208063516765833,"y":270.007446289063,"z":0.0167740974575281}},"8a25a0":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30422389507294,"z":83.2527770996094},"rot":{"x":0.0208070613443851,"y":270.005126953125,"z":0.0167729742825031}},"8b7da2":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30042517185211,"z":80.9486999511719},"rot":{"x":0.0208137836307287,"y":269.982177734375,"z":0.0167644713073969}},"8c5d4c":{"lock":false,"pos":{"x":53.212776184082,"y":1.29612362384796,"z":51.0517272949219},"rot":{"x":0.020806884393096,"y":270.005615234375,"z":0.0167731009423733}},"8d6ae6":{"lock":false,"pos":{"x":37.4159851074219,"y":1.30048787593842,"z":85.5607223510742},"rot":{"x":0.020815335214138,"y":269.980072021484,"z":0.0167642217129469}},"9230a8":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29773223400116,"z":71.7486801147461},"rot":{"x":0.0208087638020515,"y":269.999298095703,"z":0.0167709235101938}},"92c7df":{"lock":false,"pos":{"x":58.3838233947754,"y":1.32234311103821,"z":76.2903518676758},"rot":{"x":0.0208156257867813,"y":269.980285644531,"z":0.0167646165937185}},"930b6b":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30083906650543,"z":67.1411056518555},"rot":{"x":0.0208088103681803,"y":269.999389648438,"z":0.0167707744985819}},"99765a":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3082447052002,"z":92.4412155151367},"rot":{"x":0.0208069384098053,"y":270.006042480469,"z":0.0167734976857901}},"9eeca1":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30220413208008,"z":76.3527679443359},"rot":{"x":0.0208071004599333,"y":270.004974365234,"z":0.0167730562388897}},"a88e8d":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30606269836426,"z":78.5903549194336},"rot":{"x":0.0208041407167912,"y":270.014892578125,"z":0.0167764984071255}},"ad73d9":{"lock":false,"pos":{"x":44.5133094787598,"y":1.3067045211792,"z":92.4607315063477},"rot":{"x":0.0208088736981153,"y":269.998962402344,"z":0.0167707800865173}},"af3efd":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30250763893127,"z":92.4607162475586},"rot":{"x":0.020814435556531,"y":269.980285644531,"z":0.0167641080915928}},"af4c03":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30689823627472,"z":87.8412399291992},"rot":{"x":0.0208071358501911,"y":270.0048828125,"z":0.0167728383094072}},"b2fedd":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30109834671021,"z":83.2486877441406},"rot":{"x":0.0208136811852455,"y":269.982238769531,"z":0.0167647060006857}},"b58038":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30487847328186,"z":80.9412231445313},"rot":{"x":0.0208067949861288,"y":270.006042480469,"z":0.0167733337730169}},"b789ac":{"lock":false,"pos":{"x":58.3838272094727,"y":1.3094288110733,"z":90.0903625488281},"rot":{"x":0.020805262029171,"y":270.011291503906,"z":0.0167752914130688}},"bd34f2":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638576507568,"z":67.1486740112305},"rot":{"x":0.0208139177411795,"y":269.981567382813,"z":0.01676463522017}},"bf3261":{"lock":false,"pos":{"x":53.212776184082,"y":1.29612374305725,"z":51.0517272949219},"rot":{"x":0.0208069682121277,"y":270.005340576172,"z":0.0167731642723084}},"c021fd":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30757141113281,"z":90.141242980957},"rot":{"x":0.0208068154752254,"y":270.006042480469,"z":0.0167733337730169}},"c634a0":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208052285015583,"y":270.011688232422,"z":0.0167755782604218}},"ca17b8":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.0208072159439325,"y":270.004486083984,"z":0.0167728140950203}},"ca8448":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29712164402008,"z":74.0607147216797},"rot":{"x":0.0208148509263992,"y":269.981536865234,"z":0.0167648028582335}},"cc23ea":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30287742614746,"z":78.6527709960938},"rot":{"x":0.0208071172237396,"y":270.005035400391,"z":0.0167727582156658}},"ce4f97":{"lock":false,"pos":{"x":40.9602012634277,"y":1.30244481563568,"z":87.8486938476563},"rot":{"x":0.0208135992288589,"y":269.982330322266,"z":0.0167646650224924}},"db2e8d":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369390010834,"z":57.9485626220703},"rot":{"x":0.0208137389272451,"y":269.98193359375,"z":0.0167646091431379}},"db4a43":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705893993378,"z":69.4486770629883},"rot":{"x":0.0208143647760153,"y":269.980041503906,"z":0.0167637933045626}},"e29603":{"lock":false,"pos":{"x":40.9601745605469,"y":1.2957124710083,"z":64.8486557006836},"rot":{"x":0.020813837647438,"y":269.982055664063,"z":0.0167643800377846}},"e4c7c9":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29907858371735,"z":76.3486785888672},"rot":{"x":0.0208138786256313,"y":269.981994628906,"z":0.0167646780610085}},"ea9ad0":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30538940429688,"z":76.2903518676758},"rot":{"x":0.0208039283752441,"y":270.015808105469,"z":0.0167768690735102}},"edd051":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30218553543091,"z":71.7412185668945},"rot":{"x":0.0208070613443851,"y":270.004791259766,"z":0.0167730432003737}},"f2f912":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29644846916199,"z":71.7607116699219},"rot":{"x":0.0208147224038839,"y":269.981842041016,"z":0.0167650356888771}},"f6dfe5":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436612129211,"z":60.2487869262695},"rot":{"x":0.0208144374191761,"y":269.979736328125,"z":0.0167638752609491}},"f8d22e":{"lock":false,"pos":{"x":40.9602012634277,"y":1.30379140377045,"z":92.4486923217773},"rot":{"x":0.0208144206553698,"y":269.979888916016,"z":0.016763923689723}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Guardian -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 66.61 - posY: 1.66 - posZ: 75.88 - rotX: 0.02 - rotY: 270.02 - rotZ: 0.02 - scaleX: 1.2 - scaleY: 1.2 - scaleZ: 1.2 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Guardian cd002a.ttslua b/unpacked/Custom_Model_Bag Guardian cd002a.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a.ttslua +++ b/unpacked/Custom_Model_Bag Guardian cd002a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Guardian cd002a.yaml b/unpacked/Custom_Model_Bag Guardian cd002a.yaml index 9cff7b252..25fbae4b0 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a.yaml @@ -4,9 +4,8 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d.yaml' -- !include 'Custom_Model_Bag Guardian cd002a/Card Sacred Covenant (2) 87226d.yaml' -- !include 'Custom_Model_Bag Guardian cd002a/Card Righteous Hunt (1) 491c09.yaml' +- !include 'Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.yaml' +- !include 'Custom_Model_Bag Guardian cd002a/Card Radiant Smite (1) 3a726b.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Overpower (2) 017e1f.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Lesson Learned (2) 037b2e.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Empty Vessel (4) 043971.yaml' @@ -34,6 +33,7 @@ ContainedObjects: - !include 'Custom_Model_Bag Guardian cd002a/Card Springfield M1903 (4) 3b042e.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Evidence! (1) 3df5fb.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Get over here! (2) 415ca2.yaml' +- !include 'Custom_Model_Bag Guardian cd002a/Card Righteous Hunt (1) 491c09.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Blood Eclipse (3) 537351.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Boxing Gloves (3) 54293e.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Extra Ammunition (1) 5761c7.yaml' @@ -52,6 +52,7 @@ ContainedObjects: - !include 'Custom_Model_Bag Guardian cd002a/Card First Aid (3) 80d5e3.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Leadership (2) 80fafa.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Taunt (3) 85fe46.yaml' +- !include 'Custom_Model_Bag Guardian cd002a/Card Sacred Covenant (2) 87226d.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Mano a Mano (1) 88d2ba.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Combat Training (1) 88fdeb.yaml' - !include 'Custom_Model_Bag Guardian cd002a/Card Vicious Blow (2) 8f5533.yaml' @@ -100,7 +101,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: true LuaScript: !include 'Custom_Model_Bag Guardian cd002a.ttslua' -LuaScriptState: '{"ml":{"017e1f":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950927734375,"z":-49.7709617614746},"rot":{"x":0.0208088755607605,"y":269.999145507813,"z":0.016770975664258}},"037b2e":{"lock":false,"pos":{"x":52.9284248352051,"y":1.29620385169983,"z":-88.8097076416016},"rot":{"x":0.0208103228360415,"y":269.997467041016,"z":0.0167707335203886}},"043971":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208090879023075,"y":269.998962402344,"z":0.0167703498154879}},"066c18":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083892822266},"rot":{"x":0.0208123717457056,"y":269.986083984375,"z":0.0167650487273932}},"0c278c":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30565047264099,"z":-52.0087776184082},"rot":{"x":0.0208090078085661,"y":269.998718261719,"z":0.0167703367769718}},"0c2f37":{"lock":false,"pos":{"x":52.944206237793,"y":1.30091917514801,"z":-72.7202529907227},"rot":{"x":0.0208148881793022,"y":269.978485107422,"z":0.016765171661973}},"1408ad":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293905735016,"z":-65.8202209472656},"rot":{"x":0.0208152998238802,"y":269.977447509766,"z":0.0167627055197954}},"14424c":{"lock":false,"pos":{"x":52.9282646179199,"y":1.29552865028381,"z":-91.1161499023438},"rot":{"x":0.0208097212016582,"y":269.998962402344,"z":0.0167710948735476}},"14dcc4":{"lock":false,"pos":{"x":49.2784881591797,"y":1.3049772977829,"z":-54.3087882995605},"rot":{"x":0.0208089277148247,"y":269.998748779297,"z":0.0167703647166491}},"15fa11":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036318302155,"z":-58.9200057983398},"rot":{"x":0.020808819681406,"y":269.999755859375,"z":0.0167711116373539}},"17f807":{"lock":false,"pos":{"x":40.2899856567383,"y":1.30103969573975,"z":-56.6086387634277},"rot":{"x":0.0208087936043739,"y":269.999176025391,"z":0.0167708341032267}},"187591":{"lock":false,"pos":{"x":52.9419898986816,"y":1.30221998691559,"z":-68.2735443115234},"rot":{"x":0.0208150614053011,"y":269.977355957031,"z":0.0167630184441805}},"1c0bcd":{"lock":false,"pos":{"x":36.624340057373,"y":1.29566895961761,"z":-70.4083023071289},"rot":{"x":0.0208125542849302,"y":269.985961914063,"z":0.0167640633881092}},"1e7f9a":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208088736981153,"y":269.999542236328,"z":0.0167710650712252}},"1fc1f4":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363143444061,"z":-81.9201202392578},"rot":{"x":0.020816495642066,"y":269.974792480469,"z":0.0167621523141861}},"218e04":{"lock":false,"pos":{"x":40.2900657653809,"y":1.30170965194702,"z":-54.3199005126953},"rot":{"x":0.0208080559968948,"y":270.001770019531,"z":0.0167718771845102}},"22256f":{"lock":false,"pos":{"x":36.6243362426758,"y":1.3017281293869,"z":-49.7084617614746},"rot":{"x":0.0208039414137602,"y":270.016357421875,"z":0.0167766492813826}},"2901ee":{"lock":false,"pos":{"x":40.2900657653809,"y":1.29632365703583,"z":-72.7199859619141},"rot":{"x":0.0208085346966982,"y":270.000122070313,"z":0.0167713034898043}},"2b76c6":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957270622253,"z":-77.3202514648438},"rot":{"x":0.0208099894225597,"y":269.997833251953,"z":0.0167708452790976}},"2badf6":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30295753479004,"z":-61.208797454834},"rot":{"x":0.0208091717213392,"y":269.998718261719,"z":0.0167704578489065}},"32b458":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372941493988,"z":-47.4200057983398},"rot":{"x":0.0208088271319866,"y":269.999206542969,"z":0.0167707689106464}},"33fb3a":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30091917514801,"z":-72.720344543457},"rot":{"x":0.0208096783608198,"y":269.997863769531,"z":0.0167707931250334}},"36ffa9":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208149626851082,"y":269.977416992188,"z":0.0167627148330212}},"390a86":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30565047264099,"z":-52.0087776184082},"rot":{"x":0.0208108201622963,"y":269.992736816406,"z":0.0167682971805334}},"3a622d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768872261047,"z":-63.5084495544434},"rot":{"x":0.0208085216581821,"y":269.998962402344,"z":0.0167698040604591}},"3accaf":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30430400371552,"z":-56.6087913513184},"rot":{"x":0.0208089966326952,"y":269.998718261719,"z":0.0167704094201326}},"3b042e":{"lock":false,"pos":{"x":36.624340057373,"y":1.29701554775238,"z":-65.8082962036133},"rot":{"x":0.0208088364452124,"y":269.9990234375,"z":0.0167689267545938}},"3df5fb":{"lock":false,"pos":{"x":52.9442176818848,"y":1.3063051700592,"z":-54.3203392028809},"rot":{"x":0.0208085998892784,"y":270,"z":0.0167711991816759}},"415ca2":{"lock":false,"pos":{"x":52.9462394714355,"y":1.2982269525528,"z":-81.9204711914063},"rot":{"x":0.0208098273724318,"y":269.999084472656,"z":0.0167713314294815}},"43b3a5":{"lock":false,"pos":{"x":49.278491973877,"y":1.30161106586456,"z":-65.8086547851563},"rot":{"x":0.0208033956587315,"y":270.020324707031,"z":0.0167789477854967}},"467460":{"lock":false,"pos":{"x":52.9189834594727,"y":1.29620051383972,"z":-88.809700012207},"rot":{"x":0.0208094883710146,"y":269.997192382813,"z":0.016770800575614}},"491c09":{"lock":false,"pos":{"x":52.9442749023438,"y":1.31542873382568,"z":-70.4270629882813},"rot":{"x":0.0204385947436094,"y":269.998352050781,"z":0.740688383579254}},"537351":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30632376670837,"z":-49.708812713623},"rot":{"x":0.0208090860396624,"y":269.998718261719,"z":0.0167703609913588}},"54293e":{"lock":false,"pos":{"x":40.2900886535645,"y":1.29228413105011,"z":-86.5199127197266},"rot":{"x":0.0208098310977221,"y":269.998840332031,"z":0.0167711600661278}},"5761c7":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30563199520111,"z":-56.6203498840332},"rot":{"x":0.0208150781691074,"y":269.977386474609,"z":0.0167628582566977}},"596620":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208152439445257,"y":269.977416992188,"z":0.0167629644274712}},"59bdfb":{"lock":false,"pos":{"x":49.278491973877,"y":1.30430400371552,"z":-56.6087875366211},"rot":{"x":0.0208091381937265,"y":269.998748779297,"z":0.0167705006897449}},"5a4bb5":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30228424072266,"z":-63.5088005065918},"rot":{"x":0.020809318870306,"y":269.999725341797,"z":0.0167710520327091}},"5a7137":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208089090883732,"y":269.999206542969,"z":0.0167707856744528}},"5cfb72":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.0208044424653053,"y":270.016387939453,"z":0.016777578741312}},"5efc92":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765175819397,"z":-49.7203407287598},"rot":{"x":0.0208153259009123,"y":269.977416992188,"z":0.0167629905045033}},"62392c":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29699695110321,"z":-70.4198760986328},"rot":{"x":0.0208086017519236,"y":269.999450683594,"z":0.0167710743844509}},"639a09":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208124220371246,"y":269.986022949219,"z":0.0167647935450077}},"650903":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208045095205307,"y":270.016479492188,"z":0.0167774986475706}},"661c3f":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30161106586456,"z":-65.8086547851563},"rot":{"x":0.0208096783608198,"y":269.998992919922,"z":0.0167713351547718}},"6b130d":{"lock":false,"pos":{"x":52.9442100524902,"y":1.3063051700592,"z":-54.3203468322754},"rot":{"x":0.0208151154220104,"y":269.977416992188,"z":0.0167628526687622}},"6c6340":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208090525120497,"y":269.998962402344,"z":0.0167704243212938}},"7ab680":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.0208120439201593,"y":269.986083984375,"z":0.0167658980935812}},"7dc42a":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208012778311968,"y":270.027709960938,"z":0.01678173430264}},"80d5e3":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093313217163,"z":-91.1157989501953},"rot":{"x":0.0208045020699501,"y":270.016418457031,"z":0.0167775489389896}},"80fafa":{"lock":false,"pos":{"x":58.0996551513672,"y":1.31018245220184,"z":-47.4709815979004},"rot":{"x":0.020808020606637,"y":270.001251220703,"z":0.0167717840522528}},"85fe46":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30363070964813,"z":-58.9087944030762},"rot":{"x":0.0208090357482433,"y":269.998809814453,"z":0.0167705006897449}},"87226d":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208084043115377,"y":269.998931884766,"z":0.0167704615741968}},"88d2ba":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30361223220825,"z":-63.5203590393066},"rot":{"x":0.0208151657134295,"y":269.977447509766,"z":0.0167629681527615}},"88fdeb":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3023829460144,"z":-52.0199966430664},"rot":{"x":0.0208087898790836,"y":269.999206542969,"z":0.0167708527296782}},"8f5533":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30883598327637,"z":-52.070972442627},"rot":{"x":0.0208084378391504,"y":270.000335693359,"z":0.0167712084949017}},"8ffa44":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30093789100647,"z":-68.1086578369141},"rot":{"x":0.0208092238754034,"y":269.998657226563,"z":0.0167708266526461}},"92436b":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30024588108063,"z":-75.0203475952148},"rot":{"x":0.0208097212016582,"y":269.999176025391,"z":0.0167709644883871}},"93381d":{"lock":false,"pos":{"x":52.9441146850586,"y":1.29755306243896,"z":-84.2202453613281},"rot":{"x":0.0208101253956556,"y":269.997680664063,"z":0.016770726069808}},"9e7f6a":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428552627563,"z":-61.2203521728516},"rot":{"x":0.0208087041974068,"y":270,"z":0.0167711563408375}},"a0e05d":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208150893449783,"y":269.977416992188,"z":0.0167628861963749}},"a26425":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208039581775665,"y":270.016357421875,"z":0.0167769305408001}},"ab51ce":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208092499524355,"y":269.998748779297,"z":0.0167703740298748}},"ab620e":{"lock":false,"pos":{"x":52.944206237793,"y":1.3069783449173,"z":-52.0203437805176},"rot":{"x":0.0208152066916227,"y":269.977416992188,"z":0.0167629551142454}},"afef79":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.0208090748637915,"y":269.998962402344,"z":0.0167701914906502}},"b39b78":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208090748637915,"y":269.998901367188,"z":0.0167702604085207}},"b7c4cb":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30737829208374,"z":-54.3203010559082},"rot":{"x":0.0208084303885698,"y":270.000091552734,"z":0.016771150752902}},"bdffae":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901671409607,"z":-63.5200119018555},"rot":{"x":0.0208086129277945,"y":269.999633789063,"z":0.0167709868401289}},"c1d796":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.020809443667531,"y":269.999877929688,"z":0.0167715139687061}},"c4018c":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.6202545166016},"rot":{"x":0.0208098012953997,"y":269.997680664063,"z":0.0167713686823845}},"c5aa89":{"lock":false,"pos":{"x":52.9284706115723,"y":1.29687416553497,"z":-86.5200881958008},"rot":{"x":0.0208092648535967,"y":269.99755859375,"z":0.0167701691389084}},"cdb540":{"lock":false,"pos":{"x":40.2899551391602,"y":1.29295742511749,"z":-84.2199020385742},"rot":{"x":0.0208042934536934,"y":270.016510009766,"z":0.0167777873575687}},"d93397":{"lock":false,"pos":{"x":49.2784996032715,"y":1.30699694156647,"z":-47.4087791442871},"rot":{"x":0.0208096392452717,"y":269.997406005859,"z":0.0167709272354841}},"ddc9f8":{"lock":false,"pos":{"x":40.2741050720215,"y":1.29093313217163,"z":-91.1158065795898},"rot":{"x":0.0208043809980154,"y":270.016479492188,"z":0.0167777389287949}},"dddd59":{"lock":false,"pos":{"x":44.2289009094238,"y":1.30152595043182,"z":-63.5009002685547},"rot":{"x":0.0208084173500538,"y":270,"z":0.016771262511611}},"de2d0a":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30950915813446,"z":-49.7709693908691},"rot":{"x":0.0208082906901836,"y":270.001678466797,"z":0.0167713053524494}},"e1748c":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29903519153595,"z":-58.908447265625},"rot":{"x":0.0208088457584381,"y":269.998962402344,"z":0.0167707521468401}},"e1ef43":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208086017519236,"y":269.999664306641,"z":0.0167709570378065}},"e3ae5c":{"lock":false,"pos":{"x":52.9442443847656,"y":1.29687976837158,"z":-86.5202560424805},"rot":{"x":0.0208088513463736,"y":269.997375488281,"z":0.0167687926441431}},"e55fe0":{"lock":false,"pos":{"x":52.9441986083984,"y":1.29889953136444,"z":-79.6202621459961},"rot":{"x":0.0208096522837877,"y":269.997619628906,"z":0.0167706999927759}},"e56d1d":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29767024517059,"z":-68.119873046875},"rot":{"x":0.0208087209612131,"y":269.999420166016,"z":0.0167708974331617}},"f54b74":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29634237289429,"z":-68.1082992553711},"rot":{"x":0.0208123158663511,"y":269.986083984375,"z":0.0167655292898417}}}}' +LuaScriptState: '{"ml":{"017e1f":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950915813446,"z":-49.7709617614746},"rot":{"x":0.0208089724183083,"y":269.999145507813,"z":0.0167708583176136}},"037b2e":{"lock":false,"pos":{"x":52.9282646179199,"y":1.29552865028381,"z":-91.1161499023438},"rot":{"x":0.0208104196935892,"y":269.997436523438,"z":0.0167705845087767}},"043971":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.020808968693018,"y":269.998962402344,"z":0.0167707521468401}},"066c18":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083892822266},"rot":{"x":0.020812626928091,"y":269.986083984375,"z":0.0167662296444178}},"0c278c":{"lock":false,"pos":{"x":49.278491973877,"y":1.3049772977829,"z":-54.3087844848633},"rot":{"x":0.0208091493695974,"y":269.998687744141,"z":0.0167702194303274}},"0c2f37":{"lock":false,"pos":{"x":52.9472045898438,"y":1.30024075508118,"z":-75.0420989990234},"rot":{"x":0.0209247656166554,"y":269.602203369141,"z":0.016626076772809}},"1408ad":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293893814087,"z":-65.8202209472656},"rot":{"x":0.0208150576800108,"y":269.977447509766,"z":0.0167630221694708}},"14424c":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30699694156647,"z":-47.4087867736816},"rot":{"x":0.0208089277148247,"y":269.998962402344,"z":0.0167705770581961}},"14dcc4":{"lock":false,"pos":{"x":49.278491973877,"y":1.30430400371552,"z":-56.6087875366211},"rot":{"x":0.0208093151450157,"y":269.998718261719,"z":0.0167702306061983}},"15fa11":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208084601908922,"y":269.999755859375,"z":0.0167710669338703}},"17f807":{"lock":false,"pos":{"x":40.2899856567383,"y":1.30103969573975,"z":-56.6086387634277},"rot":{"x":0.0208088047802448,"y":269.999176025391,"z":0.0167707391083241}},"187591":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30159246921539,"z":-70.4202194213867},"rot":{"x":0.0208160076290369,"y":269.977325439453,"z":0.0167633928358555}},"1c0bcd":{"lock":false,"pos":{"x":36.624340057373,"y":1.2956690788269,"z":-70.4083023071289},"rot":{"x":0.02081248909235,"y":269.985961914063,"z":0.0167661421000957}},"1e7f9a":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208087954670191,"y":269.999542236328,"z":0.016770925372839}},"1fc1f4":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363143444061,"z":-81.9201202392578},"rot":{"x":0.0208159051835537,"y":269.974792480469,"z":0.0167620293796062}},"218e04":{"lock":false,"pos":{"x":40.2900657653809,"y":1.30170965194702,"z":-54.3199005126953},"rot":{"x":0.0208078660070896,"y":270.001770019531,"z":0.0167719591408968}},"22256f":{"lock":false,"pos":{"x":36.6243362426758,"y":1.3017281293869,"z":-49.7084617614746},"rot":{"x":0.0208037253469229,"y":270.016357421875,"z":0.0167770385742188}},"2901ee":{"lock":false,"pos":{"x":40.2900657653809,"y":1.29632365703583,"z":-72.7199859619141},"rot":{"x":0.0208086483180523,"y":270.000122070313,"z":0.016771225258708}},"2b76c6":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.6202545166016},"rot":{"x":0.0208100248128176,"y":269.997833251953,"z":0.0167707558721304}},"2badf6":{"lock":false,"pos":{"x":49.278491973877,"y":1.30228424072266,"z":-63.5087966918945},"rot":{"x":0.0208089631050825,"y":269.998748779297,"z":0.0167696662247181}},"32b458":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208086911588907,"y":269.999206542969,"z":0.0167708061635494}},"33fb3a":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30091917514801,"z":-72.720344543457},"rot":{"x":0.0208096783608198,"y":269.997863769531,"z":0.0167707931250334}},"36ffa9":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208151955157518,"y":269.977416992188,"z":0.0167629327625036}},"390a86":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30565047264099,"z":-52.0087776184082},"rot":{"x":0.0208108201622963,"y":269.992736816406,"z":0.0167682971805334}},"3a622d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768872261047,"z":-63.5084495544434},"rot":{"x":0.0208088792860508,"y":269.998962402344,"z":0.0167709123343229}},"3a726b":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30226576328278,"z":-68.1202011108398},"rot":{"x":0.020808020606637,"y":269.999877929688,"z":0.0167709402740002}},"3accaf":{"lock":false,"pos":{"x":49.278491973877,"y":1.30363070964813,"z":-58.9087905883789},"rot":{"x":0.0208091828972101,"y":269.998687744141,"z":0.0167701672762632}},"3b042e":{"lock":false,"pos":{"x":36.624340057373,"y":1.29701554775238,"z":-65.8082962036133},"rot":{"x":0.0208088587969542,"y":269.9990234375,"z":0.01677081361413}},"3df5fb":{"lock":false,"pos":{"x":52.9442176818848,"y":1.3063051700592,"z":-54.3203392028809},"rot":{"x":0.0208084564656019,"y":270,"z":0.0167711935937405}},"415ca2":{"lock":false,"pos":{"x":52.9441146850586,"y":1.29755294322968,"z":-84.2202453613281},"rot":{"x":0.0208096839487553,"y":269.998962402344,"z":0.016771275550127}},"43b3a5":{"lock":false,"pos":{"x":49.278491973877,"y":1.30161106586456,"z":-65.8086547851563},"rot":{"x":0.0208033956587315,"y":270.020324707031,"z":0.0167789477854967}},"467460":{"lock":false,"pos":{"x":52.9189834594727,"y":1.29620051383972,"z":-88.809700012207},"rot":{"x":0.0208094883710146,"y":269.997192382813,"z":0.016770800575614}},"491c09":{"lock":false,"pos":{"x":52.9478187561035,"y":1.30091607570648,"z":-72.7354354858398},"rot":{"x":0.0208525024354458,"y":269.853607177734,"z":0.0167173054069281}},"537351":{"lock":false,"pos":{"x":49.278491973877,"y":1.30565047264099,"z":-52.0087738037109},"rot":{"x":0.0208092723041773,"y":269.998687744141,"z":0.0167702157050371}},"54293e":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208088587969542,"y":269.998840332031,"z":0.016770763322711}},"5761c7":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30563187599182,"z":-56.6203498840332},"rot":{"x":0.0208150446414948,"y":269.977386474609,"z":0.0167629532516003}},"596620":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208150427788496,"y":269.977416992188,"z":0.0167630184441805}},"59bdfb":{"lock":false,"pos":{"x":49.278491973877,"y":1.30430400371552,"z":-56.6087875366211},"rot":{"x":0.0208091381937265,"y":269.998748779297,"z":0.0167705006897449}},"5a4bb5":{"lock":false,"pos":{"x":49.278491973877,"y":1.30161106586456,"z":-65.8086547851563},"rot":{"x":0.0208096411079168,"y":269.999664306641,"z":0.0167712420225143}},"5a7137":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208086129277945,"y":269.999206542969,"z":0.0167710352689028}},"5cfb72":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.0208035744726658,"y":270.016387939453,"z":0.0167771279811859}},"5efc92":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208151396363974,"y":269.977416992188,"z":0.0167629700154066}},"62392c":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29699695110321,"z":-70.4198760986328},"rot":{"x":0.020808681845665,"y":269.999450683594,"z":0.0167710911482573}},"639a09":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208126436918974,"y":269.986022949219,"z":0.0167660526931286}},"650903":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208036005496979,"y":270.016479492188,"z":0.0167772565037012}},"661c3f":{"lock":false,"pos":{"x":49.278491973877,"y":1.30093789100647,"z":-68.1086578369141},"rot":{"x":0.0208098758012056,"y":269.998962402344,"z":0.0167711712419987}},"6b130d":{"lock":false,"pos":{"x":52.9442100524902,"y":1.3063051700592,"z":-54.3203468322754},"rot":{"x":0.0208151154220104,"y":269.977416992188,"z":0.0167628526687622}},"6c6340":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208087097853422,"y":269.998962402344,"z":0.0167707800865173}},"7ab680":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.0208126306533813,"y":269.986083984375,"z":0.016766207292676}},"7dc42a":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208006426692009,"y":270.027709960938,"z":0.016781147569418}},"80d5e3":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093313217163,"z":-91.1157989501953},"rot":{"x":0.020803663879633,"y":270.016418457031,"z":0.0167771056294441}},"80fafa":{"lock":false,"pos":{"x":58.0996551513672,"y":1.31018245220184,"z":-47.4709815979004},"rot":{"x":0.0208080839365721,"y":270.001251220703,"z":0.0167716089636087}},"85fe46":{"lock":false,"pos":{"x":49.278491973877,"y":1.30295753479004,"z":-61.2087936401367},"rot":{"x":0.0208091791719198,"y":269.998779296875,"z":0.0167701710015535}},"87226d":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208086557686329,"y":269.998931884766,"z":0.0167708061635494}},"88d2ba":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30361223220825,"z":-63.5203590393066},"rot":{"x":0.0208151284605265,"y":269.977447509766,"z":0.0167629942297935}},"88fdeb":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208087954670191,"y":269.999206542969,"z":0.0167709030210972}},"8f5533":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30883586406708,"z":-52.070972442627},"rot":{"x":0.0208084601908922,"y":270.000335693359,"z":0.0167711600661278}},"8ffa44":{"lock":false,"pos":{"x":49.278491973877,"y":1.30026459693909,"z":-70.4086608886719},"rot":{"x":0.020809905603528,"y":269.998657226563,"z":0.0167710687965155}},"92436b":{"lock":false,"pos":{"x":52.9441833496094,"y":1.29957211017609,"z":-77.322395324707},"rot":{"x":0.0208980534225702,"y":269.693969726563,"z":0.0166597347706556}},"93381d":{"lock":false,"pos":{"x":52.9442443847656,"y":1.29687976837158,"z":-86.520263671875},"rot":{"x":0.0208102446049452,"y":269.997619628906,"z":0.0167707484215498}},"9e7f6a":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208085421472788,"y":270,"z":0.0167714152485132}},"a0e05d":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208150893449783,"y":269.977416992188,"z":0.0167628861963749}},"a26425":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208036657422781,"y":270.016357421875,"z":0.0167771633714437}},"ab51ce":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208088811486959,"y":269.998748779297,"z":0.0167705714702606}},"ab620e":{"lock":false,"pos":{"x":52.944206237793,"y":1.3069783449173,"z":-52.0203437805176},"rot":{"x":0.0208151675760746,"y":269.977416992188,"z":0.0167629010975361}},"afef79":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.020808931440115,"y":269.998962402344,"z":0.016770776361227}},"b39b78":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208086874336004,"y":269.998901367188,"z":0.0167708266526461}},"b7c4cb":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30737829208374,"z":-54.3203010559082},"rot":{"x":0.0208084303885698,"y":270.000091552734,"z":0.016771150752902}},"bdffae":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.020808719098568,"y":269.999633789063,"z":0.0167711302638054}},"c1d796":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.0208085849881172,"y":269.999877929688,"z":0.0167710352689028}},"c4018c":{"lock":false,"pos":{"x":52.9462394714355,"y":1.2982269525528,"z":-81.9204711914063},"rot":{"x":0.0208102688193321,"y":269.997650146484,"z":0.0167708490043879}},"c5aa89":{"lock":false,"pos":{"x":52.9284706115723,"y":1.29687416553497,"z":-86.5200881958008},"rot":{"x":0.0208092648535967,"y":269.99755859375,"z":0.0167701691389084}},"cdb540":{"lock":false,"pos":{"x":40.2899551391602,"y":1.29295742511749,"z":-84.2199020385742},"rot":{"x":0.0208042934536934,"y":270.016510009766,"z":0.0167777873575687}},"d93397":{"lock":false,"pos":{"x":49.278491973877,"y":1.30632376670837,"z":-49.7088088989258},"rot":{"x":0.0208095759153366,"y":269.997375488281,"z":0.0167696420103312}},"ddc9f8":{"lock":false,"pos":{"x":40.2741050720215,"y":1.29093313217163,"z":-91.1158065795898},"rot":{"x":0.0208043809980154,"y":270.016479492188,"z":0.0167777389287949}},"dddd59":{"lock":false,"pos":{"x":44.2289009094238,"y":1.30152595043182,"z":-63.5009002685547},"rot":{"x":0.0208084173500538,"y":270,"z":0.016771262511611}},"de2d0a":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30950915813446,"z":-49.7709693908691},"rot":{"x":0.0208082906901836,"y":270.001678466797,"z":0.0167713053524494}},"e1748c":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29903519153595,"z":-58.908447265625},"rot":{"x":0.0208088457584381,"y":269.998962402344,"z":0.0167707521468401}},"e1ef43":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208086110651493,"y":269.999664306641,"z":0.0167712364345789}},"e3ae5c":{"lock":false,"pos":{"x":52.9284248352051,"y":1.29620385169983,"z":-88.8097076416016},"rot":{"x":0.0208103768527508,"y":269.997375488281,"z":0.016770601272583}},"e55fe0":{"lock":false,"pos":{"x":52.9441986083984,"y":1.29889953136444,"z":-79.6202621459961},"rot":{"x":0.0208096522837877,"y":269.997619628906,"z":0.0167706999927759}},"e56d1d":{"lock":false,"pos":{"x":40.2900466918945,"y":1.2976701259613,"z":-68.119873046875},"rot":{"x":0.0208086743950844,"y":269.999420166016,"z":0.0167709067463875}},"f54b74":{"lock":false,"pos":{"x":36.6243362426758,"y":1.296342253685,"z":-68.1082992553711},"rot":{"x":0.0208127163350582,"y":269.986083984375,"z":0.0167661216109991}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Blood Eclipse (3) 537351.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Blood Eclipse (3) 537351.yaml index 4300bba18..56dc7c35c 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Blood Eclipse (3) 537351.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Blood Eclipse (3) 537351.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.28 posY: 1.31 - posZ: -49.71 + posZ: -52.01 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Counterpunch (2) 92436b.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Counterpunch (2) 92436b.yaml index 78645ee70..14dd94f5b 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Counterpunch (2) 92436b.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Counterpunch (2) 92436b.yaml @@ -35,9 +35,9 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -75.02 + posZ: -77.32 rotX: 0.02 - rotY: 270.0 + rotY: 269.69 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Custom Ammunition (3) 0c278c.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Custom Ammunition (3) 0c278c.yaml index a2b96e1f2..4e937d3a4 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Custom Ammunition (3) 0c278c.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Custom Ammunition (3) 0c278c.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 49.28 - posY: 1.31 - posZ: -52.01 + posY: 1.3 + posZ: -54.31 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Dynamite Blast (2) 2b76c6.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Dynamite Blast (2) 2b76c6.yaml index 4943d9e25..caf1169c7 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Dynamite Blast (2) 2b76c6.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Dynamite Blast (2) 2b76c6.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -77.32 + posZ: -79.62 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Dynamite Blast (3) 14dcc4.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Dynamite Blast (3) 14dcc4.yaml index d915625a6..a9a7e9be5 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Dynamite Blast (3) 14dcc4.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Dynamite Blast (3) 14dcc4.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.28 posY: 1.3 - posZ: -54.31 + posZ: -56.61 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Eat lead! (2) c4018c.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Eat lead! (2) c4018c.yaml index 5b46a32b0..08983d4d5 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Eat lead! (2) c4018c.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Eat lead! (2) c4018c.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.94 + posX: 52.95 posY: 1.3 - posZ: -79.62 + posZ: -81.92 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Get over here! (2) 415ca2.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Get over here! (2) 415ca2.yaml index 542e07e96..b37e816d8 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Get over here! (2) 415ca2.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Get over here! (2) 415ca2.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.95 + posX: 52.94 posY: 1.3 - posZ: -81.92 + posZ: -84.22 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Heroic Rescue (2) 93381d.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Heroic Rescue (2) 93381d.yaml index ccc96d1a8..9613b6e5e 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Heroic Rescue (2) 93381d.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Heroic Rescue (2) 93381d.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -84.22 + posZ: -86.52 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card I've had worse... (2) e3ae5c.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card I've had worse... (2) e3ae5c.yaml index 447101109..ece996ce0 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card I've had worse... (2) e3ae5c.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card I've had worse... (2) e3ae5c.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.94 + posX: 52.93 posY: 1.3 - posZ: -86.52 + posZ: -88.81 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card I've had worse... (4) 5a4bb5.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card I've had worse... (4) 5a4bb5.yaml index b53386573..1775ae8c2 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card I've had worse... (4) 5a4bb5.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card I've had worse... (4) 5a4bb5.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.28 posY: 1.3 - posZ: -63.51 + posZ: -65.81 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Lesson Learned (2) 037b2e.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Lesson Learned (2) 037b2e.yaml index a2a2ca8cb..ac7a48ddb 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Lesson Learned (2) 037b2e.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Lesson Learned (2) 037b2e.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.93 posY: 1.3 - posZ: -88.81 + posZ: -91.12 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Mano a Mano (2) 14424c.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Mano a Mano (2) 14424c.yaml index 0a8c6324c..1fd05aa7b 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Mano a Mano (2) 14424c.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Mano a Mano (2) 14424c.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.93 - posY: 1.3 - posZ: -91.12 + posX: 49.28 + posY: 1.31 + posZ: -47.41 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Monster Slayer (5) 661c3f.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Monster Slayer (5) 661c3f.yaml index 5a0bb4f48..9f93705dd 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Monster Slayer (5) 661c3f.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Monster Slayer (5) 661c3f.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.28 posY: 1.3 - posZ: -65.81 + posZ: -68.11 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card One-Two Punch (5) 8ffa44.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card One-Two Punch (5) 8ffa44.yaml index d815f4d70..6e7370b56 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card One-Two Punch (5) 8ffa44.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card One-Two Punch (5) 8ffa44.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.28 posY: 1.3 - posZ: -68.11 + posZ: -70.41 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Radiant Smite (1) 3a726b.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Radiant Smite (1) 3a726b.yaml new file mode 100644 index 000000000..562e539a6 --- /dev/null +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Radiant Smite (1) 3a726b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232101 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3a726b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Radiant Smite (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 52.94 + posY: 1.3 + posZ: -68.12 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Reliable (1) 187591.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Reliable (1) 187591.yaml index d2b5cc599..e0b9f9128 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Reliable (1) 187591.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Reliable (1) 187591.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -68.27 + posZ: -70.42 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Righteous Hunt (1) 491c09.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Righteous Hunt (1) 491c09.yaml index 54c6351dd..80e2e6943 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Righteous Hunt (1) 491c09.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Righteous Hunt (1) 491c09.yaml @@ -33,12 +33,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.94 - posY: 1.32 - posZ: -70.43 + posX: 52.95 + posY: 1.3 + posZ: -72.74 rotX: 0.02 - rotY: 270.0 - rotZ: 0.74 + rotY: 269.85 + rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Stand Together (3) 3accaf.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Stand Together (3) 3accaf.yaml index 8d14f1329..2e22762e1 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Stand Together (3) 3accaf.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Stand Together (3) 3accaf.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.28 posY: 1.3 - posZ: -56.61 + posZ: -58.91 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Taunt (2) d93397.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Taunt (2) d93397.yaml index 813894632..c7b3001e6 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Taunt (2) d93397.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Taunt (2) d93397.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.28 posY: 1.31 - posZ: -47.41 + posZ: -49.71 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Taunt (3) 85fe46.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Taunt (3) 85fe46.yaml index 1e1fb05f9..f9a697ded 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Taunt (3) 85fe46.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Taunt (3) 85fe46.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.28 posY: 1.3 - posZ: -58.91 + posZ: -61.21 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Telescopic Sight (3) 2badf6.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Telescopic Sight (3) 2badf6.yaml index 4b8daa313..e221845e9 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Telescopic Sight (3) 2badf6.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Telescopic Sight (3) 2badf6.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.28 posY: 1.3 - posZ: -61.21 + posZ: -63.51 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Card Well-Maintained (1) 0c2f37.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Card Well-Maintained (1) 0c2f37.yaml index 5faf0e3dd..a8247dbc2 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Card Well-Maintained (1) 0c2f37.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Card Well-Maintained (1) 0c2f37.yaml @@ -33,11 +33,11 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.94 + posX: 52.95 posY: 1.3 - posZ: -72.72 + posZ: -75.04 rotX: 0.02 - rotY: 269.98 + rotY: 269.6 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7.ttslua b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.ttslua similarity index 96% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7.ttslua rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7.ttslua +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.yaml new file mode 100644 index 000000000..fa6312967 --- /dev/null +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.yaml @@ -0,0 +1,122 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag Guardian 7d3988/Card Radiant Smite (1) 3a726b.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Overpower (2) 017e1f.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Lesson Learned (2) 037b2e.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Empty Vessel (4) 043971.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Flamethrower (5) 066c18.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Custom Ammunition (3) 0c278c.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Well-Maintained (1) 0c2f37.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Marksmanship (1) 1408ad.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Mano a Mano (2) 14424c.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Dynamite Blast (3) 14dcc4.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card .32 Colt (2) 15fa11.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card The Hungering Blade (1) 17f807.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Reliable (1) 187591.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Armor of Ardennes (5) 1c0bcd.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Beat Cop (2) 1e7f9a.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Well Prepared (2) 1fc1f4.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Kerosene (1) 218e04.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Keen Eye (3) 22256f.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Police Badge (2) 2901ee.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Dynamite Blast (2) 2b76c6.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Telescopic Sight (3) 2badf6.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Ace of Swords (1) 32b458.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Ambush (1) 36ffa9.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Shotgun (4) 3a622d.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Stand Together (3) 3accaf.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Springfield M1903 (4) 3b042e.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Evidence! (1) 3df5fb.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Get over here! (2) 415ca2.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Righteous Hunt (1) 491c09.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Blood Eclipse (3) 537351.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Boxing Gloves (3) 54293e.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Extra Ammunition (1) 5761c7.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Fool me once... (1) 596620.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card I''ve had worse... (4) 5a4bb5.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Brother Xavier (1) 5a7137.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Enchanted Blade (3) 5cfb72.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Blood Eclipse (1) 5efc92.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Physical Training (2) 62392c.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Lightning Gun (5) 639a09.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card .45 Thompson (3) 650903.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Monster Slayer (5) 661c3f.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card M1918 BAR (4) 6c6340.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Spiritual Resolve (5) 7ab680.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Safeguard (2) 7dc42a.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card First Aid (3) 80d5e3.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Leadership (2) 80fafa.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Taunt (3) 85fe46.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Sacred Covenant (2) 87226d.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Mano a Mano (1) 88d2ba.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Combat Training (1) 88fdeb.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Vicious Blow (2) 8f5533.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card One-Two Punch (5) 8ffa44.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Counterpunch (2) 92436b.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Heroic Rescue (2) 93381d.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Galvanize (1) 9e7f6a.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Stick to the Plan (3) a26425.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Physical Training (4) ab51ce.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Ever Vigilant (1) ab620e.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Mk 1 Grenades (4) afef79.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Grete Wagner (3) b39b78.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Bandolier (2) bdffae.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Survival Knife (2) c1d796.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Eat lead! (2) c4018c.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Taunt (2) d93397.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card .45 Automatic (2) e1ef43.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card I''ve had worse... (2) e3ae5c.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Blackjack (2) e56d1d.yaml' +- !include 'Custom_Model_Bag Guardian 7d3988/Card Agency Backup (5) f54b74.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516201848/72B3B9E2B59F25FEC82412AC22245D03655A4558/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7d3988 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Guardian 7d3988.ttslua' +LuaScriptState: '{"ml":{"017e1f":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950915813446,"z":-49.7709617614746},"rot":{"x":0.0208089724183083,"y":269.999145507813,"z":0.0167708583176136}},"037b2e":{"lock":false,"pos":{"x":52.9282646179199,"y":1.29552865028381,"z":-91.1161499023438},"rot":{"x":0.0208104196935892,"y":269.997436523438,"z":0.0167705845087767}},"043971":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.020808968693018,"y":269.998962402344,"z":0.0167707521468401}},"066c18":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083892822266},"rot":{"x":0.020812626928091,"y":269.986083984375,"z":0.0167662296444178}},"0c278c":{"lock":false,"pos":{"x":49.278491973877,"y":1.3049772977829,"z":-54.3087844848633},"rot":{"x":0.0208091493695974,"y":269.998687744141,"z":0.0167702194303274}},"0c2f37":{"lock":false,"pos":{"x":52.9472045898438,"y":1.30024075508118,"z":-75.0420989990234},"rot":{"x":0.0209247656166554,"y":269.602203369141,"z":0.016626076772809}},"1408ad":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293893814087,"z":-65.8202209472656},"rot":{"x":0.0208150576800108,"y":269.977447509766,"z":0.0167630221694708}},"14424c":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30699694156647,"z":-47.4087867736816},"rot":{"x":0.0208089277148247,"y":269.998962402344,"z":0.0167705770581961}},"14dcc4":{"lock":false,"pos":{"x":49.278491973877,"y":1.30430400371552,"z":-56.6087875366211},"rot":{"x":0.0208093151450157,"y":269.998718261719,"z":0.0167702306061983}},"15fa11":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208084601908922,"y":269.999755859375,"z":0.0167710669338703}},"17f807":{"lock":false,"pos":{"x":40.2899856567383,"y":1.30103969573975,"z":-56.6086387634277},"rot":{"x":0.0208088047802448,"y":269.999176025391,"z":0.0167707391083241}},"187591":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30159246921539,"z":-70.4202194213867},"rot":{"x":0.0208160076290369,"y":269.977325439453,"z":0.0167633928358555}},"1c0bcd":{"lock":false,"pos":{"x":36.624340057373,"y":1.2956690788269,"z":-70.4083023071289},"rot":{"x":0.02081248909235,"y":269.985961914063,"z":0.0167661421000957}},"1e7f9a":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208087954670191,"y":269.999542236328,"z":0.016770925372839}},"1fc1f4":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363143444061,"z":-81.9201202392578},"rot":{"x":0.0208159051835537,"y":269.974792480469,"z":0.0167620293796062}},"218e04":{"lock":false,"pos":{"x":40.2900657653809,"y":1.30170965194702,"z":-54.3199005126953},"rot":{"x":0.0208078660070896,"y":270.001770019531,"z":0.0167719591408968}},"22256f":{"lock":false,"pos":{"x":36.6243362426758,"y":1.3017281293869,"z":-49.7084617614746},"rot":{"x":0.0208037253469229,"y":270.016357421875,"z":0.0167770385742188}},"2901ee":{"lock":false,"pos":{"x":40.2900657653809,"y":1.29632365703583,"z":-72.7199859619141},"rot":{"x":0.0208086483180523,"y":270.000122070313,"z":0.016771225258708}},"2b76c6":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.6202545166016},"rot":{"x":0.0208100248128176,"y":269.997833251953,"z":0.0167707558721304}},"2badf6":{"lock":false,"pos":{"x":49.278491973877,"y":1.30228424072266,"z":-63.5087966918945},"rot":{"x":0.0208089631050825,"y":269.998748779297,"z":0.0167696662247181}},"32b458":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208086911588907,"y":269.999206542969,"z":0.0167708061635494}},"33fb3a":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30091917514801,"z":-72.720344543457},"rot":{"x":0.0208096783608198,"y":269.997863769531,"z":0.0167707931250334}},"36ffa9":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208151955157518,"y":269.977416992188,"z":0.0167629327625036}},"390a86":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30565047264099,"z":-52.0087776184082},"rot":{"x":0.0208108201622963,"y":269.992736816406,"z":0.0167682971805334}},"3a622d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768872261047,"z":-63.5084495544434},"rot":{"x":0.0208088792860508,"y":269.998962402344,"z":0.0167709123343229}},"3a726b":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30226576328278,"z":-68.1202011108398},"rot":{"x":0.020808020606637,"y":269.999877929688,"z":0.0167709402740002}},"3accaf":{"lock":false,"pos":{"x":49.278491973877,"y":1.30363070964813,"z":-58.9087905883789},"rot":{"x":0.0208091828972101,"y":269.998687744141,"z":0.0167701672762632}},"3b042e":{"lock":false,"pos":{"x":36.624340057373,"y":1.29701554775238,"z":-65.8082962036133},"rot":{"x":0.0208088587969542,"y":269.9990234375,"z":0.01677081361413}},"3df5fb":{"lock":false,"pos":{"x":52.9442176818848,"y":1.3063051700592,"z":-54.3203392028809},"rot":{"x":0.0208084564656019,"y":270,"z":0.0167711935937405}},"415ca2":{"lock":false,"pos":{"x":52.9441146850586,"y":1.29755294322968,"z":-84.2202453613281},"rot":{"x":0.0208096839487553,"y":269.998962402344,"z":0.016771275550127}},"43b3a5":{"lock":false,"pos":{"x":49.278491973877,"y":1.30161106586456,"z":-65.8086547851563},"rot":{"x":0.0208033956587315,"y":270.020324707031,"z":0.0167789477854967}},"467460":{"lock":false,"pos":{"x":52.9189834594727,"y":1.29620051383972,"z":-88.809700012207},"rot":{"x":0.0208094883710146,"y":269.997192382813,"z":0.016770800575614}},"491c09":{"lock":false,"pos":{"x":52.9478187561035,"y":1.30091607570648,"z":-72.7354354858398},"rot":{"x":0.0208525024354458,"y":269.853607177734,"z":0.0167173054069281}},"537351":{"lock":false,"pos":{"x":49.278491973877,"y":1.30565047264099,"z":-52.0087738037109},"rot":{"x":0.0208092723041773,"y":269.998687744141,"z":0.0167702157050371}},"54293e":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208088587969542,"y":269.998840332031,"z":0.016770763322711}},"5761c7":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30563187599182,"z":-56.6203498840332},"rot":{"x":0.0208150446414948,"y":269.977386474609,"z":0.0167629532516003}},"596620":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208150427788496,"y":269.977416992188,"z":0.0167630184441805}},"59bdfb":{"lock":false,"pos":{"x":49.278491973877,"y":1.30430400371552,"z":-56.6087875366211},"rot":{"x":0.0208091381937265,"y":269.998748779297,"z":0.0167705006897449}},"5a4bb5":{"lock":false,"pos":{"x":49.278491973877,"y":1.30161106586456,"z":-65.8086547851563},"rot":{"x":0.0208096411079168,"y":269.999664306641,"z":0.0167712420225143}},"5a7137":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208086129277945,"y":269.999206542969,"z":0.0167710352689028}},"5cfb72":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.0208035744726658,"y":270.016387939453,"z":0.0167771279811859}},"5efc92":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208151396363974,"y":269.977416992188,"z":0.0167629700154066}},"62392c":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29699695110321,"z":-70.4198760986328},"rot":{"x":0.020808681845665,"y":269.999450683594,"z":0.0167710911482573}},"639a09":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208126436918974,"y":269.986022949219,"z":0.0167660526931286}},"650903":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208036005496979,"y":270.016479492188,"z":0.0167772565037012}},"661c3f":{"lock":false,"pos":{"x":49.278491973877,"y":1.30093789100647,"z":-68.1086578369141},"rot":{"x":0.0208098758012056,"y":269.998962402344,"z":0.0167711712419987}},"6b130d":{"lock":false,"pos":{"x":52.9442100524902,"y":1.3063051700592,"z":-54.3203468322754},"rot":{"x":0.0208151154220104,"y":269.977416992188,"z":0.0167628526687622}},"6c6340":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208087097853422,"y":269.998962402344,"z":0.0167707800865173}},"7ab680":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.0208126306533813,"y":269.986083984375,"z":0.016766207292676}},"7dc42a":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208006426692009,"y":270.027709960938,"z":0.016781147569418}},"80d5e3":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093313217163,"z":-91.1157989501953},"rot":{"x":0.020803663879633,"y":270.016418457031,"z":0.0167771056294441}},"80fafa":{"lock":false,"pos":{"x":58.0996551513672,"y":1.31018245220184,"z":-47.4709815979004},"rot":{"x":0.0208080839365721,"y":270.001251220703,"z":0.0167716089636087}},"85fe46":{"lock":false,"pos":{"x":49.278491973877,"y":1.30295753479004,"z":-61.2087936401367},"rot":{"x":0.0208091791719198,"y":269.998779296875,"z":0.0167701710015535}},"87226d":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208086557686329,"y":269.998931884766,"z":0.0167708061635494}},"88d2ba":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30361223220825,"z":-63.5203590393066},"rot":{"x":0.0208151284605265,"y":269.977447509766,"z":0.0167629942297935}},"88fdeb":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208087954670191,"y":269.999206542969,"z":0.0167709030210972}},"8f5533":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30883586406708,"z":-52.070972442627},"rot":{"x":0.0208084601908922,"y":270.000335693359,"z":0.0167711600661278}},"8ffa44":{"lock":false,"pos":{"x":49.278491973877,"y":1.30026459693909,"z":-70.4086608886719},"rot":{"x":0.020809905603528,"y":269.998657226563,"z":0.0167710687965155}},"92436b":{"lock":false,"pos":{"x":52.9441833496094,"y":1.29957211017609,"z":-77.322395324707},"rot":{"x":0.0208980534225702,"y":269.693969726563,"z":0.0166597347706556}},"93381d":{"lock":false,"pos":{"x":52.9442443847656,"y":1.29687976837158,"z":-86.520263671875},"rot":{"x":0.0208102446049452,"y":269.997619628906,"z":0.0167707484215498}},"9e7f6a":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208085421472788,"y":270,"z":0.0167714152485132}},"a0e05d":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208150893449783,"y":269.977416992188,"z":0.0167628861963749}},"a26425":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208036657422781,"y":270.016357421875,"z":0.0167771633714437}},"ab51ce":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208088811486959,"y":269.998748779297,"z":0.0167705714702606}},"ab620e":{"lock":false,"pos":{"x":52.944206237793,"y":1.3069783449173,"z":-52.0203437805176},"rot":{"x":0.0208151675760746,"y":269.977416992188,"z":0.0167629010975361}},"afef79":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.020808931440115,"y":269.998962402344,"z":0.016770776361227}},"b39b78":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208086874336004,"y":269.998901367188,"z":0.0167708266526461}},"b7c4cb":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30737829208374,"z":-54.3203010559082},"rot":{"x":0.0208084303885698,"y":270.000091552734,"z":0.016771150752902}},"bdffae":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.020808719098568,"y":269.999633789063,"z":0.0167711302638054}},"c1d796":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.0208085849881172,"y":269.999877929688,"z":0.0167710352689028}},"c4018c":{"lock":false,"pos":{"x":52.9462394714355,"y":1.2982269525528,"z":-81.9204711914063},"rot":{"x":0.0208102688193321,"y":269.997650146484,"z":0.0167708490043879}},"c5aa89":{"lock":false,"pos":{"x":52.9284706115723,"y":1.29687416553497,"z":-86.5200881958008},"rot":{"x":0.0208092648535967,"y":269.99755859375,"z":0.0167701691389084}},"cdb540":{"lock":false,"pos":{"x":40.2899551391602,"y":1.29295742511749,"z":-84.2199020385742},"rot":{"x":0.0208042934536934,"y":270.016510009766,"z":0.0167777873575687}},"d93397":{"lock":false,"pos":{"x":49.278491973877,"y":1.30632376670837,"z":-49.7088088989258},"rot":{"x":0.0208095759153366,"y":269.997375488281,"z":0.0167696420103312}},"ddc9f8":{"lock":false,"pos":{"x":40.2741050720215,"y":1.29093313217163,"z":-91.1158065795898},"rot":{"x":0.0208043809980154,"y":270.016479492188,"z":0.0167777389287949}},"dddd59":{"lock":false,"pos":{"x":44.2289009094238,"y":1.30152595043182,"z":-63.5009002685547},"rot":{"x":0.0208084173500538,"y":270,"z":0.016771262511611}},"de2d0a":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30950915813446,"z":-49.7709693908691},"rot":{"x":0.0208082906901836,"y":270.001678466797,"z":0.0167713053524494}},"e1748c":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29903519153595,"z":-58.908447265625},"rot":{"x":0.0208088457584381,"y":269.998962402344,"z":0.0167707521468401}},"e1ef43":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208086110651493,"y":269.999664306641,"z":0.0167712364345789}},"e3ae5c":{"lock":false,"pos":{"x":52.9284248352051,"y":1.29620385169983,"z":-88.8097076416016},"rot":{"x":0.0208103768527508,"y":269.997375488281,"z":0.016770601272583}},"e55fe0":{"lock":false,"pos":{"x":52.9441986083984,"y":1.29889953136444,"z":-79.6202621459961},"rot":{"x":0.0208096522837877,"y":269.997619628906,"z":0.0167706999927759}},"e56d1d":{"lock":false,"pos":{"x":40.2900466918945,"y":1.2976701259613,"z":-68.119873046875},"rot":{"x":0.0208086743950844,"y":269.999420166016,"z":0.0167709067463875}},"f54b74":{"lock":false,"pos":{"x":36.6243362426758,"y":1.296342253685,"z":-68.1082992553711},"rot":{"x":0.0208127163350582,"y":269.986083984375,"z":0.0167661216109991}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Guardian +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.32 + posY: 1.67 + posZ: -63.98 + rotX: 0.02 + rotY: 270.02 + rotZ: 0.02 + scaleX: 1.2 + scaleY: 1.2 + scaleZ: 1.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card .32 Colt (2) 15fa11.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card .32 Colt (2) 15fa11.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card .32 Colt (2) 15fa11.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card .32 Colt (2) 15fa11.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card .45 Automatic (2) e1ef43.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card .45 Automatic (2) e1ef43.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card .45 Automatic (2) e1ef43.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card .45 Automatic (2) e1ef43.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card .45 Thompson (3) 650903.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card .45 Thompson (3) 650903.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card .45 Thompson (3) 650903.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card .45 Thompson (3) 650903.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Ace of Swords (1) 32b458.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Ace of Swords (1) 32b458.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Ace of Swords (1) 32b458.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Ace of Swords (1) 32b458.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Agency Backup (5) f54b74.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Agency Backup (5) f54b74.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Agency Backup (5) f54b74.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Agency Backup (5) f54b74.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Ambush (1) 36ffa9.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Ambush (1) 36ffa9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Ambush (1) 36ffa9.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Ambush (1) 36ffa9.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Armor of Ardennes (5) 1c0bcd.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Armor of Ardennes (5) 1c0bcd.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Armor of Ardennes (5) 1c0bcd.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Armor of Ardennes (5) 1c0bcd.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Bandolier (2) bdffae.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Bandolier (2) bdffae.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Bandolier (2) bdffae.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Bandolier (2) bdffae.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Beat Cop (2) 1e7f9a.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Beat Cop (2) 1e7f9a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Beat Cop (2) 1e7f9a.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Beat Cop (2) 1e7f9a.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Blackjack (2) e56d1d.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Blackjack (2) e56d1d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Blackjack (2) e56d1d.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Blackjack (2) e56d1d.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Blood Eclipse (1) 5efc92.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Blood Eclipse (1) 5efc92.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Blood Eclipse (1) 5efc92.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Blood Eclipse (1) 5efc92.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Blood Eclipse (3) 537351.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Blood Eclipse (3) 537351.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Blood Eclipse (3) 537351.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Blood Eclipse (3) 537351.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Boxing Gloves (3) 54293e.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Boxing Gloves (3) 54293e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Boxing Gloves (3) 54293e.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Boxing Gloves (3) 54293e.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Brother Xavier (1) 5a7137.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Brother Xavier (1) 5a7137.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Brother Xavier (1) 5a7137.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Brother Xavier (1) 5a7137.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Combat Training (1) 88fdeb.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Combat Training (1) 88fdeb.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Combat Training (1) 88fdeb.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Combat Training (1) 88fdeb.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Counterpunch (2) 92436b.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Counterpunch (2) 92436b.yaml similarity index 98% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Counterpunch (2) 92436b.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Counterpunch (2) 92436b.yaml index 5a5445fcf..156877f82 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Counterpunch (2) 92436b.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Counterpunch (2) 92436b.yaml @@ -37,7 +37,7 @@ Transform: posY: 1.42 posZ: -63.98 rotX: 0.02 - rotY: 270.0 + rotY: 269.69 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Custom Ammunition (3) 0c278c.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Custom Ammunition (3) 0c278c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Custom Ammunition (3) 0c278c.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Custom Ammunition (3) 0c278c.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Dynamite Blast (2) 2b76c6.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Dynamite Blast (2) 2b76c6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Dynamite Blast (2) 2b76c6.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Dynamite Blast (2) 2b76c6.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Dynamite Blast (3) 14dcc4.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Dynamite Blast (3) 14dcc4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Dynamite Blast (3) 14dcc4.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Dynamite Blast (3) 14dcc4.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Eat lead! (2) c4018c.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Eat lead! (2) c4018c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Eat lead! (2) c4018c.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Eat lead! (2) c4018c.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Empty Vessel (4) 043971.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Empty Vessel (4) 043971.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Empty Vessel (4) 043971.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Empty Vessel (4) 043971.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Enchanted Blade (3) 5cfb72.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Enchanted Blade (3) 5cfb72.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Enchanted Blade (3) 5cfb72.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Enchanted Blade (3) 5cfb72.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Ever Vigilant (1) ab620e.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Ever Vigilant (1) ab620e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Ever Vigilant (1) ab620e.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Ever Vigilant (1) ab620e.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Evidence! (1) 3df5fb.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Evidence! (1) 3df5fb.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Evidence! (1) 3df5fb.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Evidence! (1) 3df5fb.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Extra Ammunition (1) 5761c7.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Extra Ammunition (1) 5761c7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Extra Ammunition (1) 5761c7.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Extra Ammunition (1) 5761c7.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card First Aid (3) 80d5e3.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card First Aid (3) 80d5e3.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card First Aid (3) 80d5e3.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card First Aid (3) 80d5e3.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Flamethrower (5) 066c18.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Flamethrower (5) 066c18.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Flamethrower (5) 066c18.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Flamethrower (5) 066c18.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Fool me once... (1) 596620.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Fool me once... (1) 596620.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Fool me once... (1) 596620.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Fool me once... (1) 596620.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Galvanize (1) 9e7f6a.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Galvanize (1) 9e7f6a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Galvanize (1) 9e7f6a.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Galvanize (1) 9e7f6a.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Get over here! (2) 415ca2.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Get over here! (2) 415ca2.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Get over here! (2) 415ca2.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Get over here! (2) 415ca2.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Grete Wagner (3) b39b78.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Grete Wagner (3) b39b78.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Grete Wagner (3) b39b78.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Grete Wagner (3) b39b78.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Heroic Rescue (2) 93381d.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Heroic Rescue (2) 93381d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Heroic Rescue (2) 93381d.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Heroic Rescue (2) 93381d.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card I've had worse... (2) e3ae5c.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card I've had worse... (2) e3ae5c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card I've had worse... (2) e3ae5c.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card I've had worse... (2) e3ae5c.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card I've had worse... (4) 5a4bb5.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card I've had worse... (4) 5a4bb5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card I've had worse... (4) 5a4bb5.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card I've had worse... (4) 5a4bb5.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Keen Eye (3) 22256f.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Keen Eye (3) 22256f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Keen Eye (3) 22256f.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Keen Eye (3) 22256f.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Kerosene (1) 218e04.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Kerosene (1) 218e04.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Kerosene (1) 218e04.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Kerosene (1) 218e04.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Leadership (2) 80fafa.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Leadership (2) 80fafa.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Leadership (2) 80fafa.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Leadership (2) 80fafa.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Lesson Learned (2) 037b2e.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Lesson Learned (2) 037b2e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Lesson Learned (2) 037b2e.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Lesson Learned (2) 037b2e.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Lightning Gun (5) 639a09.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Lightning Gun (5) 639a09.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Lightning Gun (5) 639a09.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Lightning Gun (5) 639a09.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card M1918 BAR (4) 6c6340.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card M1918 BAR (4) 6c6340.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card M1918 BAR (4) 6c6340.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card M1918 BAR (4) 6c6340.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Mano a Mano (1) 88d2ba.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Mano a Mano (1) 88d2ba.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Mano a Mano (1) 88d2ba.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Mano a Mano (1) 88d2ba.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Mano a Mano (2) 14424c.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Mano a Mano (2) 14424c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Mano a Mano (2) 14424c.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Mano a Mano (2) 14424c.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Marksmanship (1) 1408ad.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Marksmanship (1) 1408ad.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Marksmanship (1) 1408ad.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Marksmanship (1) 1408ad.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Mk 1 Grenades (4) afef79.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Mk 1 Grenades (4) afef79.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Mk 1 Grenades (4) afef79.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Mk 1 Grenades (4) afef79.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Monster Slayer (5) 661c3f.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Monster Slayer (5) 661c3f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Monster Slayer (5) 661c3f.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Monster Slayer (5) 661c3f.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card One-Two Punch (5) 8ffa44.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card One-Two Punch (5) 8ffa44.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card One-Two Punch (5) 8ffa44.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card One-Two Punch (5) 8ffa44.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Overpower (2) 017e1f.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Overpower (2) 017e1f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Overpower (2) 017e1f.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Overpower (2) 017e1f.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Physical Training (2) 62392c.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Physical Training (2) 62392c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Physical Training (2) 62392c.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Physical Training (2) 62392c.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Physical Training (4) ab51ce.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Physical Training (4) ab51ce.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Physical Training (4) ab51ce.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Physical Training (4) ab51ce.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Police Badge (2) 2901ee.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Police Badge (2) 2901ee.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Police Badge (2) 2901ee.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Police Badge (2) 2901ee.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Radiant Smite (1) 3a726b.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Radiant Smite (1) 3a726b.yaml new file mode 100644 index 000000000..380c45e97 --- /dev/null +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Radiant Smite (1) 3a726b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232101 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3a726b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Radiant Smite (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.32 + posY: 1.42 + posZ: -63.98 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Reliable (1) 187591.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Reliable (1) 187591.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Reliable (1) 187591.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Reliable (1) 187591.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Righteous Hunt (1) 491c09.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Righteous Hunt (1) 491c09.yaml similarity index 96% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Righteous Hunt (1) 491c09.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Righteous Hunt (1) 491c09.yaml index 394dfc515..c6b12ba93 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Righteous Hunt (1) 491c09.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Righteous Hunt (1) 491c09.yaml @@ -37,8 +37,8 @@ Transform: posY: 1.42 posZ: -63.98 rotX: 0.02 - rotY: 270.0 - rotZ: 0.74 + rotY: 269.85 + rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Sacred Covenant (2) 87226d.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Sacred Covenant (2) 87226d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Sacred Covenant (2) 87226d.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Sacred Covenant (2) 87226d.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Safeguard (2) 7dc42a.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Safeguard (2) 7dc42a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Safeguard (2) 7dc42a.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Safeguard (2) 7dc42a.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Shotgun (4) 3a622d.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Shotgun (4) 3a622d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Shotgun (4) 3a622d.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Shotgun (4) 3a622d.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Spiritual Resolve (5) 7ab680.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Spiritual Resolve (5) 7ab680.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Spiritual Resolve (5) 7ab680.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Spiritual Resolve (5) 7ab680.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Springfield M1903 (4) 3b042e.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Springfield M1903 (4) 3b042e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Springfield M1903 (4) 3b042e.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Springfield M1903 (4) 3b042e.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Stand Together (3) 3accaf.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Stand Together (3) 3accaf.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Stand Together (3) 3accaf.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Stand Together (3) 3accaf.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Stick to the Plan (3) a26425.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Stick to the Plan (3) a26425.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Stick to the Plan (3) a26425.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Stick to the Plan (3) a26425.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Survival Knife (2) c1d796.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Survival Knife (2) c1d796.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Survival Knife (2) c1d796.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Survival Knife (2) c1d796.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Taunt (2) d93397.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Taunt (2) d93397.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Taunt (2) d93397.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Taunt (2) d93397.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Taunt (3) 85fe46.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Taunt (3) 85fe46.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Taunt (3) 85fe46.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Taunt (3) 85fe46.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Telescopic Sight (3) 2badf6.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Telescopic Sight (3) 2badf6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Telescopic Sight (3) 2badf6.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Telescopic Sight (3) 2badf6.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card The Hungering Blade (1) 17f807.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card The Hungering Blade (1) 17f807.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card The Hungering Blade (1) 17f807.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card The Hungering Blade (1) 17f807.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Vicious Blow (2) 8f5533.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Vicious Blow (2) 8f5533.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Vicious Blow (2) 8f5533.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Vicious Blow (2) 8f5533.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Well Prepared (2) 1fc1f4.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Well Prepared (2) 1fc1f4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Well Prepared (2) 1fc1f4.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Well Prepared (2) 1fc1f4.yaml diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Well-Maintained (1) 0c2f37.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Well-Maintained (1) 0c2f37.yaml similarity index 98% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Well-Maintained (1) 0c2f37.yaml rename to unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Well-Maintained (1) 0c2f37.yaml index e782c711c..88fb4c07a 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d/Card Well-Maintained (1) 0c2f37.yaml +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988/Card Well-Maintained (1) 0c2f37.yaml @@ -37,7 +37,7 @@ Transform: posY: 1.42 posZ: -63.98 rotX: 0.02 - rotY: 269.98 + rotY: 269.6 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d.yaml b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d.yaml deleted file mode 100644 index 9b1d07f70..000000000 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d.yaml +++ /dev/null @@ -1,121 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 -ContainedObjects: -- !include 'Custom_Model_Bag Guardian a3401d/Card Sacred Covenant (2) 87226d.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Righteous Hunt (1) 491c09.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Overpower (2) 017e1f.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Lesson Learned (2) 037b2e.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Empty Vessel (4) 043971.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Flamethrower (5) 066c18.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Custom Ammunition (3) 0c278c.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Well-Maintained (1) 0c2f37.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Marksmanship (1) 1408ad.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Mano a Mano (2) 14424c.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Dynamite Blast (3) 14dcc4.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card .32 Colt (2) 15fa11.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card The Hungering Blade (1) 17f807.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Reliable (1) 187591.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Armor of Ardennes (5) 1c0bcd.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Beat Cop (2) 1e7f9a.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Well Prepared (2) 1fc1f4.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Kerosene (1) 218e04.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Keen Eye (3) 22256f.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Police Badge (2) 2901ee.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Dynamite Blast (2) 2b76c6.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Telescopic Sight (3) 2badf6.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Ace of Swords (1) 32b458.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Ambush (1) 36ffa9.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Shotgun (4) 3a622d.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Stand Together (3) 3accaf.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Springfield M1903 (4) 3b042e.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Evidence! (1) 3df5fb.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Get over here! (2) 415ca2.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Blood Eclipse (3) 537351.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Boxing Gloves (3) 54293e.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Extra Ammunition (1) 5761c7.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Fool me once... (1) 596620.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card I''ve had worse... (4) 5a4bb5.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Brother Xavier (1) 5a7137.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Enchanted Blade (3) 5cfb72.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Blood Eclipse (1) 5efc92.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Physical Training (2) 62392c.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Lightning Gun (5) 639a09.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card .45 Thompson (3) 650903.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Monster Slayer (5) 661c3f.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card M1918 BAR (4) 6c6340.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Spiritual Resolve (5) 7ab680.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Safeguard (2) 7dc42a.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card First Aid (3) 80d5e3.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Leadership (2) 80fafa.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Taunt (3) 85fe46.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Mano a Mano (1) 88d2ba.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Combat Training (1) 88fdeb.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Vicious Blow (2) 8f5533.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card One-Two Punch (5) 8ffa44.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Counterpunch (2) 92436b.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Heroic Rescue (2) 93381d.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Galvanize (1) 9e7f6a.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Stick to the Plan (3) a26425.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Physical Training (4) ab51ce.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Ever Vigilant (1) ab620e.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Mk 1 Grenades (4) afef79.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Grete Wagner (3) b39b78.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Bandolier (2) bdffae.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Survival Knife (2) c1d796.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Eat lead! (2) c4018c.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Taunt (2) d93397.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card .45 Automatic (2) e1ef43.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card I''ve had worse... (2) e3ae5c.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Blackjack (2) e56d1d.yaml' -- !include 'Custom_Model_Bag Guardian a3401d/Card Agency Backup (5) f54b74.yaml' -CustomMesh: - CastShadows: true - ColliderURL: '' - Convex: true - CustomShader: - FresnelStrength: 0.0 - SpecularColor: - b: 1.0 - g: 1.0 - r: 1.0 - SpecularIntensity: 0.0 - SpecularSharpness: 2.0 - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516201848/72B3B9E2B59F25FEC82412AC22245D03655A4558/ - MaterialIndex: 3 - MeshURL: https://pastebin.com/raw/ALrYhQGb - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: a3401d -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: !include 'Custom_Model_Bag Guardian a3401d.ttslua' -LuaScriptState: '{"ml":{"017e1f":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950927734375,"z":-49.7709617614746},"rot":{"x":0.0208088755607605,"y":269.999145507813,"z":0.016770975664258}},"037b2e":{"lock":false,"pos":{"x":52.9284248352051,"y":1.29620385169983,"z":-88.8097076416016},"rot":{"x":0.0208103228360415,"y":269.997467041016,"z":0.0167707335203886}},"043971":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208090879023075,"y":269.998962402344,"z":0.0167703498154879}},"066c18":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083892822266},"rot":{"x":0.0208123717457056,"y":269.986083984375,"z":0.0167650487273932}},"0c278c":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30565047264099,"z":-52.0087776184082},"rot":{"x":0.0208090078085661,"y":269.998718261719,"z":0.0167703367769718}},"0c2f37":{"lock":false,"pos":{"x":52.944206237793,"y":1.30091917514801,"z":-72.7202529907227},"rot":{"x":0.0208148881793022,"y":269.978485107422,"z":0.016765171661973}},"1408ad":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293905735016,"z":-65.8202209472656},"rot":{"x":0.0208152998238802,"y":269.977447509766,"z":0.0167627055197954}},"14424c":{"lock":false,"pos":{"x":52.9282646179199,"y":1.29552865028381,"z":-91.1161499023438},"rot":{"x":0.0208097212016582,"y":269.998962402344,"z":0.0167710948735476}},"14dcc4":{"lock":false,"pos":{"x":49.2784881591797,"y":1.3049772977829,"z":-54.3087882995605},"rot":{"x":0.0208089277148247,"y":269.998748779297,"z":0.0167703647166491}},"15fa11":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036318302155,"z":-58.9200057983398},"rot":{"x":0.020808819681406,"y":269.999755859375,"z":0.0167711116373539}},"17f807":{"lock":false,"pos":{"x":40.2899856567383,"y":1.30103969573975,"z":-56.6086387634277},"rot":{"x":0.0208087936043739,"y":269.999176025391,"z":0.0167708341032267}},"187591":{"lock":false,"pos":{"x":52.9419898986816,"y":1.30221998691559,"z":-68.2735443115234},"rot":{"x":0.0208150614053011,"y":269.977355957031,"z":0.0167630184441805}},"1c0bcd":{"lock":false,"pos":{"x":36.624340057373,"y":1.29566895961761,"z":-70.4083023071289},"rot":{"x":0.0208125542849302,"y":269.985961914063,"z":0.0167640633881092}},"1e7f9a":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208088736981153,"y":269.999542236328,"z":0.0167710650712252}},"1fc1f4":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363143444061,"z":-81.9201202392578},"rot":{"x":0.020816495642066,"y":269.974792480469,"z":0.0167621523141861}},"218e04":{"lock":false,"pos":{"x":40.2900657653809,"y":1.30170965194702,"z":-54.3199005126953},"rot":{"x":0.0208080559968948,"y":270.001770019531,"z":0.0167718771845102}},"22256f":{"lock":false,"pos":{"x":36.6243362426758,"y":1.3017281293869,"z":-49.7084617614746},"rot":{"x":0.0208039414137602,"y":270.016357421875,"z":0.0167766492813826}},"2901ee":{"lock":false,"pos":{"x":40.2900657653809,"y":1.29632365703583,"z":-72.7199859619141},"rot":{"x":0.0208085346966982,"y":270.000122070313,"z":0.0167713034898043}},"2b76c6":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957270622253,"z":-77.3202514648438},"rot":{"x":0.0208099894225597,"y":269.997833251953,"z":0.0167708452790976}},"2badf6":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30295753479004,"z":-61.208797454834},"rot":{"x":0.0208091717213392,"y":269.998718261719,"z":0.0167704578489065}},"32b458":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372941493988,"z":-47.4200057983398},"rot":{"x":0.0208088271319866,"y":269.999206542969,"z":0.0167707689106464}},"33fb3a":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30091917514801,"z":-72.720344543457},"rot":{"x":0.0208096783608198,"y":269.997863769531,"z":0.0167707931250334}},"36ffa9":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208149626851082,"y":269.977416992188,"z":0.0167627148330212}},"390a86":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30565047264099,"z":-52.0087776184082},"rot":{"x":0.0208108201622963,"y":269.992736816406,"z":0.0167682971805334}},"3a622d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768872261047,"z":-63.5084495544434},"rot":{"x":0.0208085216581821,"y":269.998962402344,"z":0.0167698040604591}},"3accaf":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30430400371552,"z":-56.6087913513184},"rot":{"x":0.0208089966326952,"y":269.998718261719,"z":0.0167704094201326}},"3b042e":{"lock":false,"pos":{"x":36.624340057373,"y":1.29701554775238,"z":-65.8082962036133},"rot":{"x":0.0208088364452124,"y":269.9990234375,"z":0.0167689267545938}},"3df5fb":{"lock":false,"pos":{"x":52.9442176818848,"y":1.3063051700592,"z":-54.3203392028809},"rot":{"x":0.0208085998892784,"y":270,"z":0.0167711991816759}},"415ca2":{"lock":false,"pos":{"x":52.9462394714355,"y":1.2982269525528,"z":-81.9204711914063},"rot":{"x":0.0208098273724318,"y":269.999084472656,"z":0.0167713314294815}},"43b3a5":{"lock":false,"pos":{"x":49.278491973877,"y":1.30161106586456,"z":-65.8086547851563},"rot":{"x":0.0208033956587315,"y":270.020324707031,"z":0.0167789477854967}},"467460":{"lock":false,"pos":{"x":52.9189834594727,"y":1.29620051383972,"z":-88.809700012207},"rot":{"x":0.0208094883710146,"y":269.997192382813,"z":0.016770800575614}},"491c09":{"lock":false,"pos":{"x":52.9442749023438,"y":1.31542873382568,"z":-70.4270629882813},"rot":{"x":0.0204385947436094,"y":269.998352050781,"z":0.740688383579254}},"537351":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30632376670837,"z":-49.708812713623},"rot":{"x":0.0208090860396624,"y":269.998718261719,"z":0.0167703609913588}},"54293e":{"lock":false,"pos":{"x":40.2900886535645,"y":1.29228413105011,"z":-86.5199127197266},"rot":{"x":0.0208098310977221,"y":269.998840332031,"z":0.0167711600661278}},"5761c7":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30563199520111,"z":-56.6203498840332},"rot":{"x":0.0208150781691074,"y":269.977386474609,"z":0.0167628582566977}},"596620":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208152439445257,"y":269.977416992188,"z":0.0167629644274712}},"59bdfb":{"lock":false,"pos":{"x":49.278491973877,"y":1.30430400371552,"z":-56.6087875366211},"rot":{"x":0.0208091381937265,"y":269.998748779297,"z":0.0167705006897449}},"5a4bb5":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30228424072266,"z":-63.5088005065918},"rot":{"x":0.020809318870306,"y":269.999725341797,"z":0.0167710520327091}},"5a7137":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208089090883732,"y":269.999206542969,"z":0.0167707856744528}},"5cfb72":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.0208044424653053,"y":270.016387939453,"z":0.016777578741312}},"5efc92":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765175819397,"z":-49.7203407287598},"rot":{"x":0.0208153259009123,"y":269.977416992188,"z":0.0167629905045033}},"62392c":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29699695110321,"z":-70.4198760986328},"rot":{"x":0.0208086017519236,"y":269.999450683594,"z":0.0167710743844509}},"639a09":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208124220371246,"y":269.986022949219,"z":0.0167647935450077}},"650903":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208045095205307,"y":270.016479492188,"z":0.0167774986475706}},"661c3f":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30161106586456,"z":-65.8086547851563},"rot":{"x":0.0208096783608198,"y":269.998992919922,"z":0.0167713351547718}},"6b130d":{"lock":false,"pos":{"x":52.9442100524902,"y":1.3063051700592,"z":-54.3203468322754},"rot":{"x":0.0208151154220104,"y":269.977416992188,"z":0.0167628526687622}},"6c6340":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208090525120497,"y":269.998962402344,"z":0.0167704243212938}},"7ab680":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.0208120439201593,"y":269.986083984375,"z":0.0167658980935812}},"7dc42a":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208012778311968,"y":270.027709960938,"z":0.01678173430264}},"80d5e3":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093313217163,"z":-91.1157989501953},"rot":{"x":0.0208045020699501,"y":270.016418457031,"z":0.0167775489389896}},"80fafa":{"lock":false,"pos":{"x":58.0996551513672,"y":1.31018245220184,"z":-47.4709815979004},"rot":{"x":0.020808020606637,"y":270.001251220703,"z":0.0167717840522528}},"85fe46":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30363070964813,"z":-58.9087944030762},"rot":{"x":0.0208090357482433,"y":269.998809814453,"z":0.0167705006897449}},"87226d":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208084043115377,"y":269.998931884766,"z":0.0167704615741968}},"88d2ba":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30361223220825,"z":-63.5203590393066},"rot":{"x":0.0208151657134295,"y":269.977447509766,"z":0.0167629681527615}},"88fdeb":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3023829460144,"z":-52.0199966430664},"rot":{"x":0.0208087898790836,"y":269.999206542969,"z":0.0167708527296782}},"8f5533":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30883598327637,"z":-52.070972442627},"rot":{"x":0.0208084378391504,"y":270.000335693359,"z":0.0167712084949017}},"8ffa44":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30093789100647,"z":-68.1086578369141},"rot":{"x":0.0208092238754034,"y":269.998657226563,"z":0.0167708266526461}},"92436b":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30024588108063,"z":-75.0203475952148},"rot":{"x":0.0208097212016582,"y":269.999176025391,"z":0.0167709644883871}},"93381d":{"lock":false,"pos":{"x":52.9441146850586,"y":1.29755306243896,"z":-84.2202453613281},"rot":{"x":0.0208101253956556,"y":269.997680664063,"z":0.016770726069808}},"9e7f6a":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428552627563,"z":-61.2203521728516},"rot":{"x":0.0208087041974068,"y":270,"z":0.0167711563408375}},"a0e05d":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208150893449783,"y":269.977416992188,"z":0.0167628861963749}},"a26425":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208039581775665,"y":270.016357421875,"z":0.0167769305408001}},"ab51ce":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208092499524355,"y":269.998748779297,"z":0.0167703740298748}},"ab620e":{"lock":false,"pos":{"x":52.944206237793,"y":1.3069783449173,"z":-52.0203437805176},"rot":{"x":0.0208152066916227,"y":269.977416992188,"z":0.0167629551142454}},"afef79":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.0208090748637915,"y":269.998962402344,"z":0.0167701914906502}},"b39b78":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208090748637915,"y":269.998901367188,"z":0.0167702604085207}},"b7c4cb":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30737829208374,"z":-54.3203010559082},"rot":{"x":0.0208084303885698,"y":270.000091552734,"z":0.016771150752902}},"bdffae":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901671409607,"z":-63.5200119018555},"rot":{"x":0.0208086129277945,"y":269.999633789063,"z":0.0167709868401289}},"c1d796":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.020809443667531,"y":269.999877929688,"z":0.0167715139687061}},"c4018c":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.6202545166016},"rot":{"x":0.0208098012953997,"y":269.997680664063,"z":0.0167713686823845}},"c5aa89":{"lock":false,"pos":{"x":52.9284706115723,"y":1.29687416553497,"z":-86.5200881958008},"rot":{"x":0.0208092648535967,"y":269.99755859375,"z":0.0167701691389084}},"cdb540":{"lock":false,"pos":{"x":40.2899551391602,"y":1.29295742511749,"z":-84.2199020385742},"rot":{"x":0.0208042934536934,"y":270.016510009766,"z":0.0167777873575687}},"d93397":{"lock":false,"pos":{"x":49.2784996032715,"y":1.30699694156647,"z":-47.4087791442871},"rot":{"x":0.0208096392452717,"y":269.997406005859,"z":0.0167709272354841}},"ddc9f8":{"lock":false,"pos":{"x":40.2741050720215,"y":1.29093313217163,"z":-91.1158065795898},"rot":{"x":0.0208043809980154,"y":270.016479492188,"z":0.0167777389287949}},"dddd59":{"lock":false,"pos":{"x":44.2289009094238,"y":1.30152595043182,"z":-63.5009002685547},"rot":{"x":0.0208084173500538,"y":270,"z":0.016771262511611}},"de2d0a":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30950915813446,"z":-49.7709693908691},"rot":{"x":0.0208082906901836,"y":270.001678466797,"z":0.0167713053524494}},"e1748c":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29903519153595,"z":-58.908447265625},"rot":{"x":0.0208088457584381,"y":269.998962402344,"z":0.0167707521468401}},"e1ef43":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208086017519236,"y":269.999664306641,"z":0.0167709570378065}},"e3ae5c":{"lock":false,"pos":{"x":52.9442443847656,"y":1.29687976837158,"z":-86.5202560424805},"rot":{"x":0.0208088513463736,"y":269.997375488281,"z":0.0167687926441431}},"e55fe0":{"lock":false,"pos":{"x":52.9441986083984,"y":1.29889953136444,"z":-79.6202621459961},"rot":{"x":0.0208096522837877,"y":269.997619628906,"z":0.0167706999927759}},"e56d1d":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29767024517059,"z":-68.119873046875},"rot":{"x":0.0208087209612131,"y":269.999420166016,"z":0.0167708974331617}},"f54b74":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29634237289429,"z":-68.1082992553711},"rot":{"x":0.0208123158663511,"y":269.986083984375,"z":0.0167655292898417}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Guardian -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 66.32 - posY: 1.67 - posZ: -63.98 - rotX: 0.02 - rotY: 270.02 - rotZ: 0.02 - scaleX: 1.2 - scaleY: 1.2 - scaleZ: 1.2 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e.yaml b/unpacked/Custom_Model_Bag Leaked Items 42cd6e.yaml index 3e29d32db..84d3394d8 100644 --- a/unpacked/Custom_Model_Bag Leaked Items 42cd6e.yaml +++ b/unpacked/Custom_Model_Bag Leaked Items 42cd6e.yaml @@ -4,8 +4,8 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: +- !include 'Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f.yaml' - !include 'Custom_Model_Bag Leaked Items 42cd6e/Bag Horror in High Gear 183657.yaml' -- !include 'Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9.yaml' CustomMesh: CastShadows: true ColliderURL: '' diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9.yaml b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f.yaml similarity index 51% rename from unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9.yaml rename to unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f.yaml index c0a5962ef..356075e68 100644 --- a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Devil Reef 57a8d9.yaml +++ b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f.yaml @@ -1,17 +1,15 @@ Autoraise: true ColorDiffuse: - b: 0.7439024 - g: 0.5120677 - r: 0.224207312 + b: 0.606999934 + g: 0.694 + r: 0.128999919 ContainedObjects: -- !include 'Bag Devil Reef 57a8d9/CardCustom Manipulate Destiny (2) 99e882.yaml' -- !include 'Bag Devil Reef 57a8d9/CardCustom Third Time''s a Charm (2) 55c953.yaml' -- !include 'Bag Devil Reef 57a8d9/CardCustom Gaze of Ouraxsh (2) f0ecd2.yaml' -- !include 'Bag Devil Reef 57a8d9/CardCustom Radiant Smite (1) 0d03bb.yaml' +- !include 'Bag A Light in the Fog a4ef2f/CardCustom Eye of the Djinn (2) ff6e31.yaml' +- !include 'Bag A Light in the Fog a4ef2f/CardCustom Lucky Penny (2) 845053.yaml' Description: '' DragSelectable: true GMNotes: '' -GUID: 57a8d9 +GUID: a4ef2f Grid: true GridProjection: false Hands: false @@ -24,14 +22,14 @@ MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 Name: Bag -Nickname: Devil Reef +Nickname: A Light in the Fog Snap: true Sticky: true Tooltip: true Transform: - posX: 30.09 + posX: 28.97 posY: 7.29 - posZ: -27.54 + posZ: -28.36 rotX: 359.99 rotY: 0.0 rotZ: 359.94 diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f/CardCustom Eye of the Djinn (2) ff6e31.yaml b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f/CardCustom Eye of the Djinn (2) ff6e31.yaml new file mode 100644 index 000000000..087b0bbf4 --- /dev/null +++ b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f/CardCustom Eye of the Djinn (2) ff6e31.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 553900 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5539': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785039276137/5296150CC991C946FD11B619FD9A6B948F268B63/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Vessel of Good and Evil +DragSelectable: true +GMNotes: '' +GUID: ff6e31 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Eye of the Djinn (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 15.0 + posY: 3.49 + posZ: -28.17 + rotX: 357.82 + rotY: 270.07 + rotZ: 357.23 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f/CardCustom Lucky Penny (2) 845053.yaml b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f/CardCustom Lucky Penny (2) 845053.yaml new file mode 100644 index 000000000..538b9fbb5 --- /dev/null +++ b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag A Light in the Fog a4ef2f/CardCustom Lucky Penny (2) 845053.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 554000 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '5540': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785039276730/C9940B09C9D2B7D1DC288E51F8B3885F080E2E02/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Omen of Misfortune +DragSelectable: true +GMNotes: '' +GUID: '845053' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: '"Lucky" Penny (2)' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 14.78 + posY: 3.51 + posZ: -28.34 + rotX: 357.84 + rotY: 270.06 + rotZ: 357.46 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Horror in High Gear 183657.yaml b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Horror in High Gear 183657.yaml index 380ea97d5..8f35f3350 100644 --- a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Horror in High Gear 183657.yaml +++ b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/Bag Horror in High Gear 183657.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.169773847 - g: 0.196864039 - r: 0.129985124 + b: 0.169773817 + g: 0.196864009 + r: 0.1299851 ContainedObjects: - !include 'Bag Horror in High Gear 183657/CardCustom Signum Crucis (2) 549de5.yaml' - !include 'Bag Horror in High Gear 183657/CardCustom Tristan Botley (2) 845053.yaml' @@ -29,12 +29,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 21.33 - posY: 3.13 - posZ: -38.41 - rotX: -0.01 + posX: 29.02 + posY: 7.29 + posZ: -28.25 + rotX: 0.12 rotY: 0.0 - rotZ: 359.98 + rotZ: 0.06 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1.ttslua b/unpacked/Custom_Model_Bag Mystic 6117a1.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1.ttslua +++ b/unpacked/Custom_Model_Bag Mystic 6117a1.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1.yaml index 0d2ee9816..5a729bff3 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1.yaml @@ -4,8 +4,8 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99.yaml' -- !include 'Custom_Model_Bag Mystic 6117a1/Card Paradoxical Covenant (2) 541ee9.yaml' +- !include 'Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.yaml' +- !include 'Custom_Model_Bag Mystic 6117a1/Card Abyssal Tome (2) a2d392.yaml' - !include 'Custom_Model_Bag Mystic 6117a1/Card Enchanted Blade (3) 053015.yaml' - !include 'Custom_Model_Bag Mystic 6117a1/Card Jewel of Aureolus (3) 0919cf.yaml' - !include 'Custom_Model_Bag Mystic 6117a1/Card Mists of R''lyeh (4) 0e2b00.yaml' @@ -25,6 +25,7 @@ ContainedObjects: - !include 'Custom_Model_Bag Mystic 6117a1/Card Arcane Initiate (3) 45e559.yaml' - !include 'Custom_Model_Bag Mystic 6117a1/Card Mind''s Eye (2) 4e86c1.yaml' - !include 'Custom_Model_Bag Mystic 6117a1/Card Counterspell (2) 4fb7c0.yaml' +- !include 'Custom_Model_Bag Mystic 6117a1/Card Paradoxical Covenant (2) 541ee9.yaml' - !include 'Custom_Model_Bag Mystic 6117a1/Card Recharge (4) 591789.yaml' - !include 'Custom_Model_Bag Mystic 6117a1/Card Clarity of Mind (3) 598837.yaml' - !include 'Custom_Model_Bag Mystic 6117a1/Card Clairvoyance (3) 604ed6.yaml' @@ -104,7 +105,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: true LuaScript: !include 'Custom_Model_Bag Mystic 6117a1.ttslua' -LuaScriptState: '{"ml":{"053015":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29701554775238,"z":-65.8082885742188},"rot":{"x":0.020808445289731,"y":269.998687744141,"z":0.0167705323547125}},"0919cf":{"lock":false,"pos":{"x":36.6243438720703,"y":1.2956690788269,"z":-70.4082946777344},"rot":{"x":0.0208081621676683,"y":269.998687744141,"z":0.0167705528438091}},"09ffbe":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208091791719198,"y":269.998870849609,"z":0.0167703963816166}},"0e2b00":{"lock":false,"pos":{"x":36.608268737793,"y":1.28960514068604,"z":-91.1042785644531},"rot":{"x":0.020812351256609,"y":269.990234375,"z":0.0167682394385338}},"0e808b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.2909562587738,"z":-86.50830078125},"rot":{"x":0.0208134297281504,"y":269.986297607422,"z":0.0167666058987379}},"0e8b75":{"lock":false,"pos":{"x":40.2900810241699,"y":1.30036318302155,"z":-58.9199829101563},"rot":{"x":0.0208086092025042,"y":269.999694824219,"z":0.0167709924280643}},"0ee874":{"lock":false,"pos":{"x":32.985279083252,"y":1.29838681221008,"z":-56.608341217041},"rot":{"x":0.020814148709178,"y":269.981323242188,"z":0.016764048486948}},"16154f":{"lock":false,"pos":{"x":52.944206237793,"y":1.30024600028992,"z":-75.0203323364258},"rot":{"x":0.0208085775375366,"y":269.999481201172,"z":0.0167707987129688}},"17c6c8":{"lock":false,"pos":{"x":36.6243438720703,"y":1.30038166046143,"z":-54.3084335327148},"rot":{"x":0.0208090711385012,"y":269.998870849609,"z":0.0167714860290289}},"219c78":{"lock":false,"pos":{"x":58.099666595459,"y":1.30883586406708,"z":-52.0712699890137},"rot":{"x":0.020807595923543,"y":270.003112792969,"z":0.0167722105979919}},"2403fa":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208090115338564,"y":269.998504638672,"z":0.0167705416679382}},"25c498":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208089295774698,"y":269.998504638672,"z":0.016770213842392}},"2b7765":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.0084228515625},"rot":{"x":0.0208097230643034,"y":269.998626708984,"z":0.0167710725218058}},"31051f":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29699695110321,"z":-70.4198760986328},"rot":{"x":0.0208087731152773,"y":269.999542236328,"z":0.0167708154767752}},"3c7e85":{"lock":false,"pos":{"x":52.944206237793,"y":1.30697846412659,"z":-52.0203437805176},"rot":{"x":0.0208088029175997,"y":269.998504638672,"z":0.0167705211788416}},"3d57b4":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29430401325226,"z":-79.6199111938477},"rot":{"x":0.0208086464554071,"y":269.999603271484,"z":0.0167708545923233}},"426c61":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.02080955542624,"y":269.999481201172,"z":0.0167714059352875}},"443992":{"lock":false,"pos":{"x":52.944206237793,"y":1.3009192943573,"z":-72.720329284668},"rot":{"x":0.0208086874336004,"y":269.99951171875,"z":0.0167712066322565}},"45e559":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.0208088960498571,"y":269.998901367188,"z":0.0167704187333584}},"4e86c1":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29497730731964,"z":-77.3199081420898},"rot":{"x":0.0208085626363754,"y":269.999603271484,"z":0.0167709644883871}},"4fb7c0":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30361223220825,"z":-63.5203514099121},"rot":{"x":0.0208085179328918,"y":269.999450683594,"z":0.0167710352689028}},"541ee9":{"lock":false,"pos":{"x":40.2920875549316,"y":1.29363143444061,"z":-81.9201126098633},"rot":{"x":0.0208084173500538,"y":269.998931884766,"z":0.0167705211788416}},"576e76":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208088215440512,"y":269.998962402344,"z":0.0167707912623882}},"591789":{"lock":false,"pos":{"x":52.9462623596191,"y":1.2982269525528,"z":-81.9207382202148},"rot":{"x":0.0208091605454683,"y":269.997863769531,"z":0.0167703274637461}},"598837":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29903519153595,"z":-58.9084396362305},"rot":{"x":0.0208092778921127,"y":269.998748779297,"z":0.0167714301496744}},"5a7a85":{"lock":false,"pos":{"x":44.2289886474609,"y":1.30017948150635,"z":-68.100715637207},"rot":{"x":0.0208088550716639,"y":269.999420166016,"z":0.0167716145515442}},"5ae7f5":{"lock":false,"pos":{"x":40.2900390625,"y":1.29565036296844,"z":-75.0200042724609},"rot":{"x":0.020809218287468,"y":269.999603271484,"z":0.0167712103575468}},"604ed6":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29970848560333,"z":-56.6084365844727},"rot":{"x":0.0208109244704247,"y":269.99169921875,"z":0.0167684536427259}},"698fcc":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29230284690857,"z":-81.9085159301758},"rot":{"x":0.0208095349371433,"y":269.998413085938,"z":0.0167707577347755}},"6b2e97":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29565024375916,"z":-75.0203018188477},"rot":{"x":0.0208092723041773,"y":269.997192382813,"z":0.0167701914906502}},"764515":{"lock":false,"pos":{"x":58.1054992675781,"y":1.30883800983429,"z":-52.0710487365723},"rot":{"x":0.020804388448596,"y":270.014465332031,"z":0.0167762618511915}},"7da732":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208086781203747,"y":269.999694824219,"z":0.0167707167565823}},"8272e9":{"lock":false,"pos":{"x":32.985279083252,"y":1.29636716842651,"z":-63.5083465576172},"rot":{"x":0.0208042487502098,"y":270.016479492188,"z":0.0167774185538292}},"82d9bb":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202514648438},"rot":{"x":0.0208084657788277,"y":269.999603271484,"z":0.016771050170064}},"86ed13":{"lock":false,"pos":{"x":36.6243438720703,"y":1.30105495452881,"z":-52.0084228515625},"rot":{"x":0.0208091046661139,"y":269.998748779297,"z":0.0167714338749647}},"8c0e3b":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29836189746857,"z":-61.2084426879883},"rot":{"x":0.0208090618252754,"y":269.998718261719,"z":0.0167712923139334}},"8f6cb3":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208087079226971,"y":269.999450683594,"z":0.0167709980159998}},"918fde":{"lock":false,"pos":{"x":58.0996627807617,"y":1.30816268920898,"z":-54.3709754943848},"rot":{"x":0.0208085142076015,"y":269.999542236328,"z":0.016770776361227}},"943332":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29634237289429,"z":-68.1082916259766},"rot":{"x":0.0208121873438358,"y":269.986694335938,"z":0.0167664512991905}},"94ebe8":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29162955284119,"z":-84.2083053588867},"rot":{"x":0.020510608330369,"y":271.009094238281,"z":0.0171348657459021}},"9c0a3d":{"lock":false,"pos":{"x":52.944221496582,"y":1.30563199520111,"z":-56.6203422546387},"rot":{"x":0.0208090599626303,"y":269.998504638672,"z":0.0167707595974207}},"9c8a39":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29701554775238,"z":-65.8083114624023},"rot":{"x":0.0208093039691448,"y":269.998687744141,"z":0.016771238297224}},"a1c372":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208085440099239,"y":269.999694824219,"z":0.0167711935937405}},"a766a3":{"lock":false,"pos":{"x":32.985279083252,"y":1.29906010627747,"z":-54.3083381652832},"rot":{"x":0.0208035446703434,"y":270.0166015625,"z":0.0167771261185408}},"a7e5a4":{"lock":false,"pos":{"x":40.6758575439453,"y":1.30292499065399,"z":-54.3128776550293},"rot":{"x":0.0208086613565683,"y":269.999725341797,"z":0.0167705696076155}},"a906ee":{"lock":false,"pos":{"x":52.9442100524902,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208088904619217,"y":269.999450683594,"z":0.0167709067463875}},"b49ef1":{"lock":false,"pos":{"x":40.2900390625,"y":1.29632365703583,"z":-72.7199935913086},"rot":{"x":0.0208086352795362,"y":269.999572753906,"z":0.0167709495872259}},"b9b811":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29162967205048,"z":-84.2082977294922},"rot":{"x":0.0208093579858541,"y":269.998382568359,"z":0.0167710036039352}},"b9dd5d":{"lock":false,"pos":{"x":32.985279083252,"y":1.29973304271698,"z":-52.0095634460449},"rot":{"x":0.020811365917325,"y":269.990661621094,"z":0.0167676210403442}},"bb7d83":{"lock":false,"pos":{"x":32.985279083252,"y":1.29569387435913,"z":-65.8082733154297},"rot":{"x":0.0208044536411762,"y":270.016479492188,"z":0.0167773440480232}},"bb9d20":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29499578475952,"z":-72.708381652832},"rot":{"x":0.0208084005862474,"y":269.998596191406,"z":0.0167705789208412}},"bdddfa":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208094511181116,"y":269.99951171875,"z":0.0167712606489658}},"becb9c":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372941493988,"z":-47.4200057983398},"rot":{"x":0.0208087619394064,"y":269.999694824219,"z":0.0167710836976767}},"c2f6b1":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170965194702,"z":-54.3199996948242},"rot":{"x":0.0208084788173437,"y":269.999694824219,"z":0.0167709421366453}},"c311be":{"lock":false,"pos":{"x":58.099666595459,"y":1.31018245220184,"z":-47.4709739685059},"rot":{"x":0.0208086762577295,"y":269.999481201172,"z":0.0167709030210972}},"c4c4b1":{"lock":false,"pos":{"x":40.290096282959,"y":1.2922842502594,"z":-86.5198974609375},"rot":{"x":0.02080805785954,"y":269.999664306641,"z":0.0167709123343229}},"c5d676":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293893814087,"z":-65.8202209472656},"rot":{"x":0.0208092406392097,"y":269.999450683594,"z":0.0167713835835457}},"c5fb42":{"lock":false,"pos":{"x":36.6243438720703,"y":1.30172801017761,"z":-49.7084579467773},"rot":{"x":0.0208113435655832,"y":269.991821289063,"z":0.0167690087109804}},"c78082":{"lock":false,"pos":{"x":32.985279083252,"y":1.29906010627747,"z":-54.3083381652832},"rot":{"x":0.0208115912973881,"y":269.990295410156,"z":0.0167674403637648}},"cb968f":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208089128136635,"y":269.999542236328,"z":0.0167709365487099}},"d26b84":{"lock":false,"pos":{"x":52.9441108703613,"y":1.29755306243896,"z":-84.2202453613281},"rot":{"x":0.020808769389987,"y":269.999420166016,"z":0.0167707987129688}},"d4d8c4":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093325138092,"z":-91.1157989501953},"rot":{"x":0.0208089891821146,"y":269.999572753906,"z":0.0167711246758699}},"d73dce":{"lock":false,"pos":{"x":32.985279083252,"y":1.29838681221008,"z":-56.608341217041},"rot":{"x":0.0208037439733744,"y":270.016540527344,"z":0.0167768709361553}},"d74e66":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.020808782428503,"y":269.99951171875,"z":0.016770988702774}},"da25d8":{"lock":false,"pos":{"x":52.9462471008301,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.0208090394735336,"y":269.998657226563,"z":0.0167707167565823}},"dcd9ce":{"lock":false,"pos":{"x":32.985279083252,"y":1.29771363735199,"z":-58.9083442687988},"rot":{"x":0.0208036303520203,"y":270.016510009766,"z":0.0167771559208632}},"e21200":{"lock":false,"pos":{"x":32.985279083252,"y":1.29771363735199,"z":-58.9083442687988},"rot":{"x":0.0208160802721977,"y":269.974426269531,"z":0.0167615935206413}},"e2bc49":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30293893814087,"z":-65.8205108642578},"rot":{"x":0.020807757973671,"y":270.002868652344,"z":0.0167724471539259}},"e53458":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950915813446,"z":-49.7709617614746},"rot":{"x":0.0208087526261806,"y":269.999481201172,"z":0.0167711358517408}},"e84eff":{"lock":false,"pos":{"x":52.9442329406738,"y":1.30765163898468,"z":-49.7206268310547},"rot":{"x":0.0208075102418661,"y":270.0029296875,"z":0.0167722459882498}},"ea3df4":{"lock":false,"pos":{"x":32.9852828979492,"y":1.30107951164246,"z":-47.4095649719238},"rot":{"x":0.020811602473259,"y":269.990295410156,"z":0.0167672950774431}},"ec3a71":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30159246921539,"z":-70.4202270507813},"rot":{"x":0.0208085626363754,"y":269.999481201172,"z":0.0167711190879345}},"ef43db":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.0208111740648746,"y":269.991973876953,"z":0.016768604516983}},"ef52e6":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30630528926849,"z":-54.3203468322754},"rot":{"x":0.0208091028034687,"y":269.998504638672,"z":0.0167706944048405}},"ef7b23":{"lock":false,"pos":{"x":32.985279083252,"y":1.30040621757507,"z":-49.7095642089844},"rot":{"x":0.0208046119660139,"y":270.014190673828,"z":0.0167759694159031}},"f00301":{"lock":false,"pos":{"x":32.985279083252,"y":1.29704034328461,"z":-61.2083473205566},"rot":{"x":0.0208161864429712,"y":269.974273681641,"z":0.0167614631354809}},"f1654d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.6082916259766},"rot":{"x":0.0208099409937859,"y":269.998413085938,"z":0.016771137714386}},"f560b1":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202239990234},"rot":{"x":0.0208086706697941,"y":269.999450683594,"z":0.0167709514498711}},"f651e8":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083343505859},"rot":{"x":0.0208097696304321,"y":269.998596191406,"z":0.0167711637914181}},"f71c08":{"lock":false,"pos":{"x":36.6086463928223,"y":1.29028046131134,"z":-88.7977523803711},"rot":{"x":0.0208122748881578,"y":269.990356445313,"z":0.0167679339647293}},"f89dd6":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901671409607,"z":-63.5200119018555},"rot":{"x":0.0208085849881172,"y":269.999542236328,"z":0.0167708601802588}},"f9a151":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208087358623743,"y":269.999694824219,"z":0.0167710725218058}},"fa4a56":{"lock":false,"pos":{"x":52.9441871643066,"y":1.30428552627563,"z":-61.2203636169434},"rot":{"x":0.0208088718354702,"y":269.999450683594,"z":0.0167711451649666}},"fc4caf":{"lock":false,"pos":{"x":52.9442405700684,"y":1.29687988758087,"z":-86.520263671875},"rot":{"x":0.0208046659827232,"y":270.013793945313,"z":0.0167762096971273}},"fcd9ce":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29768872261047,"z":-63.5084457397461},"rot":{"x":0.0208085589110851,"y":269.998687744141,"z":0.0167708657681942}},"fea03b":{"lock":false,"pos":{"x":40.3117637634277,"y":1.29767489433289,"z":-68.1306838989258},"rot":{"x":0.0208088606595993,"y":269.999481201172,"z":0.0167710557579994}}}}' +LuaScriptState: '{"ml":{"053015":{"lock":false,"pos":{"x":36.624340057373,"y":1.296342253685,"z":-68.1082992553711},"rot":{"x":0.0208088085055351,"y":269.998748779297,"z":0.0167686883360147}},"0919cf":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083892822266},"rot":{"x":0.020808657631278,"y":269.998748779297,"z":0.016769215464592}},"09ffbe":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208091791719198,"y":269.998870849609,"z":0.0167703963816166}},"0e2b00":{"lock":false,"pos":{"x":32.9852981567383,"y":1.30107951164246,"z":-47.4095573425293},"rot":{"x":0.0208115708082914,"y":269.990203857422,"z":0.016768354922533}},"0e808b":{"lock":false,"pos":{"x":36.6086463928223,"y":1.29028046131134,"z":-88.7977447509766},"rot":{"x":0.0208123195916414,"y":269.986358642578,"z":0.0167646687477827}},"0e8b75":{"lock":false,"pos":{"x":40.2900810241699,"y":1.30036306381226,"z":-58.9199829101563},"rot":{"x":0.0208085291087627,"y":269.999694824219,"z":0.0167711097747087}},"0ee874":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29771363735199,"z":-58.9083404541016},"rot":{"x":0.0208141822367907,"y":269.981323242188,"z":0.016764085739851}},"16154f":{"lock":false,"pos":{"x":52.944206237793,"y":1.30024600028992,"z":-75.0203323364258},"rot":{"x":0.0208088550716639,"y":269.999481201172,"z":0.0167709905654192}},"17c6c8":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208092518150806,"y":269.998870849609,"z":0.0167700555175543}},"219c78":{"lock":false,"pos":{"x":58.099666595459,"y":1.30883586406708,"z":-52.0712699890137},"rot":{"x":0.0208076070994139,"y":270.003112792969,"z":0.0167721472680569}},"2403fa":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208088662475348,"y":269.998504638672,"z":0.0167704280465841}},"25c498":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208089295774698,"y":269.998504638672,"z":0.016770213842392}},"2b7765":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.0208085533231497,"y":269.998748779297,"z":0.016769353300333}},"31051f":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632365703583,"z":-72.7199783325195},"rot":{"x":0.0208081994205713,"y":269.999572753906,"z":0.0167699549347162}},"3c7e85":{"lock":false,"pos":{"x":52.944206237793,"y":1.3069783449173,"z":-52.0203437805176},"rot":{"x":0.0208089258521795,"y":269.998504638672,"z":0.0167707074433565}},"3d57b4":{"lock":false,"pos":{"x":40.2920875549316,"y":1.29363143444061,"z":-81.9201126098633},"rot":{"x":0.0208085663616657,"y":269.999633789063,"z":0.0167690142989159}},"426c61":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093490600586},"rot":{"x":0.020808232948184,"y":269.999603271484,"z":0.0167697817087173}},"443992":{"lock":false,"pos":{"x":52.944206237793,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208087787032127,"y":269.99951171875,"z":0.0167710240930319}},"45e559":{"lock":false,"pos":{"x":36.6243362426758,"y":1.3017281293869,"z":-49.7084617614746},"rot":{"x":0.0208092462271452,"y":269.998901367188,"z":0.0167702194303274}},"4e86c1":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29430389404297,"z":-79.6198959350586},"rot":{"x":0.0208085756748915,"y":269.999633789063,"z":0.0167689844965935}},"4fb7c0":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30361223220825,"z":-63.5203514099121},"rot":{"x":0.0208087749779224,"y":269.999450683594,"z":0.0167710483074188}},"541ee9":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198867797852},"rot":{"x":0.0208084024488926,"y":269.998992919922,"z":0.0167695675045252}},"576e76":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208088215440512,"y":269.998962402344,"z":0.0167707912623882}},"591789":{"lock":false,"pos":{"x":52.9462623596191,"y":1.29822683334351,"z":-81.9207382202148},"rot":{"x":0.0208091344684362,"y":269.997863769531,"z":0.0167703982442617}},"598837":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208094790577888,"y":269.998718261719,"z":0.0167701076716185}},"5a7a85":{"lock":false,"pos":{"x":44.2289886474609,"y":1.30017948150635,"z":-68.100715637207},"rot":{"x":0.0208088550716639,"y":269.999420166016,"z":0.0167716145515442}},"5ae7f5":{"lock":false,"pos":{"x":40.2900390625,"y":1.29565036296844,"z":-75.0200042724609},"rot":{"x":0.020809218287468,"y":269.999603271484,"z":0.0167712103575468}},"604ed6":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.020811440423131,"y":269.991668701172,"z":0.0167674403637648}},"698fcc":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29162955284119,"z":-84.2082901000977},"rot":{"x":0.0208087116479874,"y":269.998474121094,"z":0.0167693383991718}},"6b2e97":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3198928833008},"rot":{"x":0.020808931440115,"y":269.997253417969,"z":0.0167690608650446}},"764515":{"lock":false,"pos":{"x":58.1054992675781,"y":1.30883800983429,"z":-52.0710487365723},"rot":{"x":0.020804388448596,"y":270.014465332031,"z":0.0167762618511915}},"7da732":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208086278289557,"y":269.999694824219,"z":0.0167710669338703}},"8272e9":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29569387435913,"z":-65.8082656860352},"rot":{"x":0.0208033081144094,"y":270.016540527344,"z":0.0167759172618389}},"82d9bb":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202514648438},"rot":{"x":0.0208087209612131,"y":269.999603271484,"z":0.0167711190879345}},"86ed13":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208093095570803,"y":269.998718261719,"z":0.0167702417820692}},"8c0e3b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768860340118,"z":-63.5084495544434},"rot":{"x":0.0208089239895344,"y":269.998748779297,"z":0.0167695470154285}},"8f6cb3":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208086892962456,"y":269.999450683594,"z":0.0167709272354841}},"918fde":{"lock":false,"pos":{"x":58.0996627807617,"y":1.30816268920898,"z":-54.3709754943848},"rot":{"x":0.0208084993064404,"y":269.999542236328,"z":0.0167710911482573}},"943332":{"lock":false,"pos":{"x":36.6243362426758,"y":1.2956690788269,"z":-70.4083023071289},"rot":{"x":0.020811814814806,"y":269.986755371094,"z":0.0167661160230637}},"94ebe8":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29162955284119,"z":-84.2083053588867},"rot":{"x":0.020510608330369,"y":271.009094238281,"z":0.0171348657459021}},"9c0a3d":{"lock":false,"pos":{"x":52.944221496582,"y":1.30563187599182,"z":-56.6203422546387},"rot":{"x":0.0208090487867594,"y":269.998504638672,"z":0.0167705714702606}},"9c8a39":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29701554775238,"z":-65.8083114624023},"rot":{"x":0.0208093039691448,"y":269.998687744141,"z":0.016771238297224}},"a1c372":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208086427301168,"y":269.999694824219,"z":0.0167709514498711}},"a2d392":{"lock":false,"pos":{"x":40.2900543212891,"y":1.29968988895416,"z":-61.2200012207031},"rot":{"x":0.02080855704844,"y":270.001129150391,"z":0.016772435978055}},"a766a3":{"lock":false,"pos":{"x":32.985279083252,"y":1.29906010627747,"z":-54.3083381652832},"rot":{"x":0.0208035446703434,"y":270.0166015625,"z":0.0167771261185408}},"a7e5a4":{"lock":false,"pos":{"x":40.6758575439453,"y":1.30292499065399,"z":-54.3128776550293},"rot":{"x":0.0208086613565683,"y":269.999725341797,"z":0.0167705696076155}},"a906ee":{"lock":false,"pos":{"x":52.9442100524902,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208086799830198,"y":269.999450683594,"z":0.0167710054665804}},"b49ef1":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565036296844,"z":-75.0199890136719},"rot":{"x":0.0208082478493452,"y":269.999633789063,"z":0.0167698934674263}},"b9b811":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29095637798309,"z":-86.5082931518555},"rot":{"x":0.0208087638020515,"y":269.998443603516,"z":0.0167692601680756}},"b9dd5d":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29906010627747,"z":-54.3083343505859},"rot":{"x":0.0208115875720978,"y":269.990661621094,"z":0.0167674217373133}},"bb7d83":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29502069950104,"z":-68.108268737793},"rot":{"x":0.0208032540977001,"y":270.016510009766,"z":0.0167762655764818}},"bb9d20":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208087544888258,"y":269.998687744141,"z":0.0167693197727203}},"bdddfa":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.519905090332},"rot":{"x":0.0208083745092154,"y":269.999572753906,"z":0.016769751906395}},"becb9c":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208086017519236,"y":269.999694824219,"z":0.0167710445821285}},"c2f6b1":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208084788173437,"y":269.999694824219,"z":0.0167711153626442}},"c311be":{"lock":false,"pos":{"x":58.099666595459,"y":1.31018245220184,"z":-47.4709739685059},"rot":{"x":0.0208087563514709,"y":269.999481201172,"z":0.0167709700763226}},"c4c4b1":{"lock":false,"pos":{"x":40.290096282959,"y":1.2922842502594,"z":-86.5198974609375},"rot":{"x":0.02080805785954,"y":269.999664306641,"z":0.0167709123343229}},"c5d676":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293893814087,"z":-65.8202209472656},"rot":{"x":0.0208092406392097,"y":269.999450683594,"z":0.0167713835835457}},"c5fb42":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208113677799702,"y":269.991821289063,"z":0.0167678873986006}},"c78082":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29838681221008,"z":-56.6083374023438},"rot":{"x":0.0208116713911295,"y":269.990295410156,"z":0.0167670790106058}},"cb968f":{"lock":false,"pos":{"x":40.2900505065918,"y":1.2976701259613,"z":-68.1198577880859},"rot":{"x":0.0208084303885698,"y":269.999572753906,"z":0.0167700182646513}},"d26b84":{"lock":false,"pos":{"x":52.9441108703613,"y":1.29755306243896,"z":-84.2202453613281},"rot":{"x":0.0208089035004377,"y":269.999420166016,"z":0.0167708862572908}},"d4d8c4":{"lock":false,"pos":{"x":36.6243438720703,"y":1.30240142345428,"z":-47.4084320068359},"rot":{"x":0.0208088923245668,"y":269.999542236328,"z":0.016771899536252}},"d73dce":{"lock":false,"pos":{"x":32.985279083252,"y":1.29838681221008,"z":-56.608341217041},"rot":{"x":0.0208037439733744,"y":270.016540527344,"z":0.0167768709361553}},"d74e66":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29901659488678,"z":-63.5200042724609},"rot":{"x":0.0208091922104359,"y":269.999481201172,"z":0.0167708583176136}},"da25d8":{"lock":false,"pos":{"x":52.9462471008301,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.0208090394735336,"y":269.998657226563,"z":0.0167707167565823}},"dcd9ce":{"lock":false,"pos":{"x":32.985279083252,"y":1.29771363735199,"z":-58.9083442687988},"rot":{"x":0.0208036303520203,"y":270.016510009766,"z":0.0167771559208632}},"e21200":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29704034328461,"z":-61.2083435058594},"rot":{"x":0.0208163149654865,"y":269.974426269531,"z":0.0167614948004484}},"e2bc49":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30293893814087,"z":-65.8205108642578},"rot":{"x":0.0208076480776072,"y":270.002868652344,"z":0.016772260889411}},"e53458":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950915813446,"z":-49.7709617614746},"rot":{"x":0.0208085514605045,"y":269.999481201172,"z":0.0167710911482573}},"e84eff":{"lock":false,"pos":{"x":52.9442329406738,"y":1.30765151977539,"z":-49.7206268310547},"rot":{"x":0.0208077654242516,"y":270.0029296875,"z":0.0167723931372166}},"ea3df4":{"lock":false,"pos":{"x":32.9852828979492,"y":1.30040621757507,"z":-49.7095603942871},"rot":{"x":0.020811652764678,"y":269.990295410156,"z":0.0167672038078308}},"ec3a71":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30159246921539,"z":-70.4202270507813},"rot":{"x":0.0208087004721165,"y":269.999481201172,"z":0.016770962625742}},"ef43db":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093313217163,"z":-91.1157913208008},"rot":{"x":0.0208105836063623,"y":269.992095947266,"z":0.0167668927460909}},"ef52e6":{"lock":false,"pos":{"x":52.9442100524902,"y":1.3063051700592,"z":-54.3203468322754},"rot":{"x":0.0208090078085661,"y":269.998504638672,"z":0.0167704969644547}},"ef7b23":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29973304271698,"z":-52.0095596313477},"rot":{"x":0.0208045188337564,"y":270.01416015625,"z":0.0167759209871292}},"f00301":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29636704921722,"z":-63.5083389282227},"rot":{"x":0.0208167154341936,"y":269.974243164063,"z":0.0167619828134775}},"f1654d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29230272769928,"z":-81.9085083007813},"rot":{"x":0.0208087060600519,"y":269.998474121094,"z":0.0167693458497524}},"f560b1":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202239990234},"rot":{"x":0.0208088532090187,"y":269.999450683594,"z":0.0167709290981293}},"f651e8":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.608283996582},"rot":{"x":0.0208089128136635,"y":269.998687744141,"z":0.0167693756520748}},"f71c08":{"lock":false,"pos":{"x":36.608268737793,"y":1.28960514068604,"z":-91.1042709350586},"rot":{"x":0.0208110529929399,"y":269.990478515625,"z":0.0167661886662245}},"f89dd6":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29834342002869,"z":-65.8198547363281},"rot":{"x":0.020808195695281,"y":269.999572753906,"z":0.0167698543518782}},"f9a151":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208086147904396,"y":269.999694824219,"z":0.0167709365487099}},"fa4a56":{"lock":false,"pos":{"x":52.9441871643066,"y":1.30428540706635,"z":-61.2203636169434},"rot":{"x":0.0208089146763086,"y":269.999450683594,"z":0.0167709719389677}},"fc4caf":{"lock":false,"pos":{"x":52.9442405700684,"y":1.29687976837158,"z":-86.520263671875},"rot":{"x":0.0208045598119497,"y":270.013793945313,"z":0.0167761258780956}},"fcd9ce":{"lock":false,"pos":{"x":36.624340057373,"y":1.29701554775238,"z":-65.8082962036133},"rot":{"x":0.0208090413361788,"y":269.998748779297,"z":0.0167686641216278}},"fea03b":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29699695110321,"z":-70.4198608398438},"rot":{"x":0.020808270201087,"y":269.999603271484,"z":0.0167696792632341}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Abyssal Tome (2) a2d392.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Abyssal Tome (2) a2d392.yaml new file mode 100644 index 000000000..a9639423f --- /dev/null +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Abyssal Tome (2) a2d392.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232107 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a2d392 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Abyssal Tome (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 40.29 + posY: 1.3 + posZ: -61.22 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Alchemical Transmutation (2) d74e66.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Alchemical Transmutation (2) d74e66.yaml index cb5618dbf..6171f9561 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Alchemical Transmutation (2) d74e66.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Alchemical Transmutation (2) d74e66.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.3 - posZ: -61.22 + posZ: -63.52 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Initiate (3) 45e559.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Initiate (3) 45e559.yaml index 0558ebdd9..0ed2d28df 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Initiate (3) 45e559.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Initiate (3) 45e559.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -47.41 + posZ: -49.71 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Studies (2) f89dd6.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Studies (2) f89dd6.yaml index 66d67541e..620a14185 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Studies (2) f89dd6.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Studies (2) f89dd6.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.3 - posZ: -63.52 + posZ: -65.82 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Studies (4) 0e808b.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Studies (4) 0e808b.yaml index 296f97195..f54bd6ebe 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Studies (4) 0e808b.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Arcane Studies (4) 0e808b.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 36.62 + posX: 36.61 posY: 1.29 - posZ: -86.51 + posZ: -88.8 rotX: 0.02 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Azure Flame (3) c5fb42.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Azure Flame (3) c5fb42.yaml index 13a7891a4..d18e27b6a 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Azure Flame (3) c5fb42.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Azure Flame (3) c5fb42.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -49.71 + posZ: -52.01 rotX: 0.02 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Azure Flame (5) 0ee874.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Azure Flame (5) 0ee874.yaml index bcb9f29a0..3d2bb7be7 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Azure Flame (5) 0ee874.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Azure Flame (5) 0ee874.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -56.61 + posZ: -58.91 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Blood Pact (3) 86ed13.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Blood Pact (3) 86ed13.yaml index 363d341d2..bad34aada 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Blood Pact (3) 86ed13.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Blood Pact (3) 86ed13.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -52.01 + posZ: -54.31 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Book of Shadows (3) 17c6c8.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Book of Shadows (3) 17c6c8.yaml index d9014651a..0ff62d973 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Book of Shadows (3) 17c6c8.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Book of Shadows (3) 17c6c8.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -54.31 + posZ: -56.61 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clairvoyance (3) 604ed6.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clairvoyance (3) 604ed6.yaml index 62fecc16f..cd53eb11f 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clairvoyance (3) 604ed6.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clairvoyance (3) 604ed6.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -56.61 + posZ: -58.91 rotX: 0.02 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clairvoyance (5) e21200.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clairvoyance (5) e21200.yaml index 1084b771c..0daf6a5a6 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clairvoyance (5) e21200.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clairvoyance (5) e21200.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -58.91 + posZ: -61.21 rotX: 0.02 rotY: 269.97 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clarity of Mind (3) 598837.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clarity of Mind (3) 598837.yaml index 410aaaf54..f50e8d70b 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clarity of Mind (3) 598837.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Clarity of Mind (3) 598837.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -58.91 + posZ: -61.21 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Crystalline Elder Sign (3) 8c0e3b.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Crystalline Elder Sign (3) 8c0e3b.yaml index df81af82c..a8d27a6e4 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Crystalline Elder Sign (3) 8c0e3b.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Crystalline Elder Sign (3) 8c0e3b.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -61.21 + posZ: -63.51 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Dayana Esperence (3) fcd9ce.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Dayana Esperence (3) fcd9ce.yaml index 7fd632974..4b8e5890f 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Dayana Esperence (3) fcd9ce.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Dayana Esperence (3) fcd9ce.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -63.51 + posZ: -65.81 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card De Vermis Mysteriis (2) cb968f.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card De Vermis Mysteriis (2) cb968f.yaml index 4f78aaa12..8114a096b 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card De Vermis Mysteriis (2) cb968f.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card De Vermis Mysteriis (2) cb968f.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.3 - posZ: -65.82 + posZ: -68.12 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) 31051f.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) 31051f.yaml index 96e19fbfa..067675475 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) 31051f.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) 31051f.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.3 - posZ: -70.42 + posZ: -72.72 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) b49ef1.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) b49ef1.yaml index 3e163ea60..eccaf11e4 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) b49ef1.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) b49ef1.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.3 - posZ: -72.72 + posZ: -75.02 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) fea03b.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) fea03b.yaml index 96243ccc0..b2b5b996a 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) fea03b.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Empower Self (2) fea03b.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 40.31 + posX: 40.29 posY: 1.3 - posZ: -68.13 + posZ: -70.42 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Enchanted Blade (3) 053015.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Enchanted Blade (3) 053015.yaml index 995e1745f..635f79944 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Enchanted Blade (3) 053015.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Enchanted Blade (3) 053015.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -65.81 + posZ: -68.11 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Grotesque Statue (2) 6b2e97.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Grotesque Statue (2) 6b2e97.yaml index 4df5fd347..2269a6b9e 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Grotesque Statue (2) 6b2e97.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Grotesque Statue (2) 6b2e97.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 40.29 - posY: 1.3 - posZ: -75.02 + posY: 1.29 + posZ: -77.32 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Grotesque Statue (4) f71c08.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Grotesque Statue (4) f71c08.yaml index fa62c058f..8af3a6e76 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Grotesque Statue (4) f71c08.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Grotesque Statue (4) f71c08.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.61 posY: 1.29 - posZ: -88.8 + posZ: -91.1 rotX: 0.02 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Ineffable Truth (3) 943332.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Ineffable Truth (3) 943332.yaml index 8adc123b0..39ff5eb91 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Ineffable Truth (3) 943332.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Ineffable Truth (3) 943332.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -68.11 + posZ: -70.41 rotX: 0.02 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Ineffable Truth (5) f00301.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Ineffable Truth (5) f00301.yaml index a2a68404f..d4569b207 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Ineffable Truth (5) f00301.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Ineffable Truth (5) f00301.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -61.21 + posZ: -63.51 rotX: 0.02 rotY: 269.97 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Jewel of Aureolus (3) 0919cf.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Jewel of Aureolus (3) 0919cf.yaml index 0387103ee..98932a53f 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Jewel of Aureolus (3) 0919cf.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Jewel of Aureolus (3) 0919cf.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 36.62 - posY: 1.3 - posZ: -70.41 + posY: 1.29 + posZ: -72.71 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mind's Eye (2) 4e86c1.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mind's Eye (2) 4e86c1.yaml index 6a1cb4336..cf5dfa8c8 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mind's Eye (2) 4e86c1.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mind's Eye (2) 4e86c1.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.29 - posZ: -77.32 + posZ: -79.62 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mists of R'lyeh (2) 3d57b4.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mists of R'lyeh (2) 3d57b4.yaml index a1d91e4c5..6afd2499e 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mists of R'lyeh (2) 3d57b4.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mists of R'lyeh (2) 3d57b4.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.29 - posZ: -79.62 + posZ: -81.92 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mists of R'lyeh (4) 0e2b00.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mists of R'lyeh (4) 0e2b00.yaml index f5a655c0c..795312ae6 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mists of R'lyeh (4) 0e2b00.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Mists of R'lyeh (4) 0e2b00.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 36.61 - posY: 1.29 - posZ: -91.1 + posX: 32.99 + posY: 1.3 + posZ: -47.41 rotX: 0.02 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Paradoxical Covenant (2) 541ee9.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Paradoxical Covenant (2) 541ee9.yaml index 1bb98e986..52d034b59 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Paradoxical Covenant (2) 541ee9.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Paradoxical Covenant (2) 541ee9.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.29 - posZ: -81.92 + posZ: -84.22 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Recall the Future (2) bdddfa.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Recall the Future (2) bdddfa.yaml index 9b1ea801a..661c213f8 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Recall the Future (2) bdddfa.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Recall the Future (2) bdddfa.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.29 - posZ: -84.22 + posZ: -86.52 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Rite of Seeking (2) 426c61.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Rite of Seeking (2) 426c61.yaml index 7a8c03246..2bcfcee21 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Rite of Seeking (2) 426c61.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Rite of Seeking (2) 426c61.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 40.29 + posX: 40.27 posY: 1.29 - posZ: -86.52 + posZ: -88.81 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Rite of Seeking (4) ea3df4.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Rite of Seeking (4) ea3df4.yaml index 3eb8fbc47..a78cf7be4 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Rite of Seeking (4) ea3df4.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Rite of Seeking (4) ea3df4.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -47.41 + posZ: -49.71 rotX: 0.02 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Robes of Endless Night (2) ef43db.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Robes of Endless Night (2) ef43db.yaml index 1d4ca179e..8f6d077a8 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Robes of Endless Night (2) ef43db.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Robes of Endless Night (2) ef43db.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.27 posY: 1.29 - posZ: -88.81 + posZ: -91.12 rotX: 0.02 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Scroll of Secrets (3) bb9d20.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Scroll of Secrets (3) bb9d20.yaml index 2cf4aecfe..9560e19a6 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Scroll of Secrets (3) bb9d20.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Scroll of Secrets (3) bb9d20.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -72.71 + posZ: -75.01 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Scrying (3) 2b7765.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Scrying (3) 2b7765.yaml index a0e8e8b02..3c7b87c3c 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Scrying (3) 2b7765.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Scrying (3) 2b7765.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -75.01 + posZ: -77.31 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Seal of the Seventh Sign (5) 8272e9.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Seal of the Seventh Sign (5) 8272e9.yaml index 47f33ae51..f6ab91257 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Seal of the Seventh Sign (5) 8272e9.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Seal of the Seventh Sign (5) 8272e9.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -63.51 + posZ: -65.81 rotX: 0.02 rotY: 270.02 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shards of the Void (3) f651e8.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shards of the Void (3) f651e8.yaml index 53bbdff46..b6bc53874 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shards of the Void (3) f651e8.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shards of the Void (3) f651e8.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -77.31 + posZ: -79.61 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shining Trapezohedron (4) ef7b23.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shining Trapezohedron (4) ef7b23.yaml index 3d33852a7..b33c8515a 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shining Trapezohedron (4) ef7b23.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shining Trapezohedron (4) ef7b23.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -49.71 + posZ: -52.01 rotX: 0.02 rotY: 270.01 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shrivelling (3) f1654d.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shrivelling (3) f1654d.yaml index 6724d1398..46ba4d44f 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shrivelling (3) f1654d.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shrivelling (3) f1654d.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -79.61 + posZ: -81.91 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shrivelling (5) bb7d83.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shrivelling (5) bb7d83.yaml index 5220619cd..77a29aa1d 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shrivelling (5) bb7d83.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Shrivelling (5) bb7d83.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -65.81 + posZ: -68.11 rotX: 0.02 rotY: 270.02 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Sixth Sense (4) b9dd5d.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Sixth Sense (4) b9dd5d.yaml index 2be4ed6eb..c7da8c4d2 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Sixth Sense (4) b9dd5d.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Sixth Sense (4) b9dd5d.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -52.01 + posZ: -54.31 rotX: 0.02 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Song of the Dead (2) d4d8c4.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Song of the Dead (2) d4d8c4.yaml index e6432712e..2430f00cb 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Song of the Dead (2) d4d8c4.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Song of the Dead (2) d4d8c4.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 40.27 - posY: 1.29 - posZ: -91.12 + posX: 36.62 + posY: 1.3 + posZ: -47.41 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card The Chthonian Stone (3) 698fcc.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card The Chthonian Stone (3) 698fcc.yaml index b5db16b2a..fb3e6b1fd 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card The Chthonian Stone (3) 698fcc.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card The Chthonian Stone (3) 698fcc.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -81.91 + posZ: -84.21 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Twila Katherine Price (3) b9b811.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Twila Katherine Price (3) b9b811.yaml index f118769e3..b67a659cd 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Twila Katherine Price (3) b9b811.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Twila Katherine Price (3) b9b811.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -84.21 + posZ: -86.51 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Wither (4) c78082.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Wither (4) c78082.yaml index d1f0d974e..bc41eb253 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Card Wither (4) c78082.yaml +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Card Wither (4) c78082.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -54.31 + posZ: -56.61 rotX: 0.02 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99.yaml deleted file mode 100644 index 2746fe00c..000000000 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99.yaml +++ /dev/null @@ -1,125 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 -ContainedObjects: -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Paradoxical Covenant (2) 541ee9.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Enchanted Blade (3) 053015.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Jewel of Aureolus (3) 0919cf.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Mists of R''lyeh (4) 0e2b00.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Arcane Studies (4) 0e808b.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Summoned Hound (1) 0e8b75.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Azure Flame (5) 0ee874.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Word of Command (2) 16154f.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Book of Shadows (3) 17c6c8.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Guts (2) 219c78.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Banish (1) 2403fa.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Scrying (3) 2b7765.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Empower Self (2) 31051f.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Mind Wipe (1) 3c7e85.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Mists of R''lyeh (2) 3d57b4.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Rite of Seeking (2) 426c61.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Ward of Protection (2) 443992.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Arcane Initiate (3) 45e559.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Mind''s Eye (2) 4e86c1.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Counterspell (2) 4fb7c0.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Recharge (4) 591789.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Clarity of Mind (3) 598837.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Clairvoyance (3) 604ed6.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card The Chthonian Stone (3) 698fcc.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Grotesque Statue (2) 6b2e97.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Grounded (1) 7da732.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Seal of the Seventh Sign (5) 8272e9.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Mind Wipe (3) 82d9bb.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Blood Pact (3) 86ed13.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Crystalline Elder Sign (3) 8c0e3b.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Bind Monster (2) 8f6cb3.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Seal of the Elder Sign (5) 918fde.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Ineffable Truth (3) 943332.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Stargazing (1) 9c0a3d.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Spirit Athame (1) a1c372.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Storm of Spirits (3) a906ee.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Empower Self (2) b49ef1.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Twila Katherine Price (3) b9b811.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Sixth Sense (4) b9dd5d.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Shrivelling (5) bb7d83.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Scroll of Secrets (3) bb9d20.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Recall the Future (2) bdddfa.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Book of Shadows (1) becb9c.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Protective Incantation (1) c2f6b1.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Defiance (2) c311be.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Azure Flame (3) c5fb42.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Wither (4) c78082.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card De Vermis Mysteriis (2) cb968f.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Deny Existence (5) d26b84.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Song of the Dead (2) d4d8c4.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Alchemical Transmutation (2) d74e66.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Clairvoyance (5) e21200.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Hypnotic Gaze (2) e2bc49.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Fearless (2) e53458.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Eldritch Inspiration (1) e84eff.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Rite of Seeking (4) ea3df4.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Time Warp (2) ec3a71.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Robes of Endless Night (2) ef43db.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Sacrifice (1) ef52e6.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Shining Trapezohedron (4) ef7b23.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Ineffable Truth (5) f00301.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Shrivelling (3) f1654d.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Recharge (2) f560b1.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Shards of the Void (3) f651e8.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Grotesque Statue (4) f71c08.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Arcane Studies (2) f89dd6.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Four of Cups (1) f9a151.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Blinding Light (2) fa4a56.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Ward of Protection (5) fc4caf.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Dayana Esperence (3) fcd9ce.yaml' -- !include 'Custom_Model_Bag Mystic 2c2b99/Card Empower Self (2) fea03b.yaml' -CustomMesh: - CastShadows: true - ColliderURL: '' - Convex: true - CustomShader: - FresnelStrength: 0.0 - SpecularColor: - b: 1.0 - g: 1.0 - r: 1.0 - SpecularIntensity: 0.0 - SpecularSharpness: 2.0 - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516557267/757887224F6C37104CDFFE241FAD09B57117D670/ - MaterialIndex: 3 - MeshURL: https://pastebin.com/raw/ALrYhQGb - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: 2c2b99 -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: !include 'Custom_Model_Bag Mystic 2c2b99.ttslua' -LuaScriptState: '{"ml":{"053015":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29701554775238,"z":-65.8082885742188},"rot":{"x":0.020808445289731,"y":269.998687744141,"z":0.0167705323547125}},"0919cf":{"lock":false,"pos":{"x":36.6243438720703,"y":1.2956690788269,"z":-70.4082946777344},"rot":{"x":0.0208081621676683,"y":269.998687744141,"z":0.0167705528438091}},"09ffbe":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208091791719198,"y":269.998870849609,"z":0.0167703963816166}},"0e2b00":{"lock":false,"pos":{"x":36.608268737793,"y":1.28960514068604,"z":-91.1042785644531},"rot":{"x":0.020812351256609,"y":269.990234375,"z":0.0167682394385338}},"0e808b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.2909562587738,"z":-86.50830078125},"rot":{"x":0.0208134297281504,"y":269.986297607422,"z":0.0167666058987379}},"0e8b75":{"lock":false,"pos":{"x":40.2900810241699,"y":1.30036318302155,"z":-58.9199829101563},"rot":{"x":0.0208086092025042,"y":269.999694824219,"z":0.0167709924280643}},"0ee874":{"lock":false,"pos":{"x":32.985279083252,"y":1.29838681221008,"z":-56.608341217041},"rot":{"x":0.020814148709178,"y":269.981323242188,"z":0.016764048486948}},"16154f":{"lock":false,"pos":{"x":52.944206237793,"y":1.30024600028992,"z":-75.0203323364258},"rot":{"x":0.0208085775375366,"y":269.999481201172,"z":0.0167707987129688}},"17c6c8":{"lock":false,"pos":{"x":36.6243438720703,"y":1.30038166046143,"z":-54.3084335327148},"rot":{"x":0.0208090711385012,"y":269.998870849609,"z":0.0167714860290289}},"219c78":{"lock":false,"pos":{"x":58.099666595459,"y":1.30883586406708,"z":-52.0712699890137},"rot":{"x":0.020807595923543,"y":270.003112792969,"z":0.0167722105979919}},"2403fa":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208090115338564,"y":269.998504638672,"z":0.0167705416679382}},"25c498":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208089295774698,"y":269.998504638672,"z":0.016770213842392}},"2b7765":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.0084228515625},"rot":{"x":0.0208097230643034,"y":269.998626708984,"z":0.0167710725218058}},"31051f":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29699695110321,"z":-70.4198760986328},"rot":{"x":0.0208087731152773,"y":269.999542236328,"z":0.0167708154767752}},"3c7e85":{"lock":false,"pos":{"x":52.944206237793,"y":1.30697846412659,"z":-52.0203437805176},"rot":{"x":0.0208088029175997,"y":269.998504638672,"z":0.0167705211788416}},"3d57b4":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29430401325226,"z":-79.6199111938477},"rot":{"x":0.0208086464554071,"y":269.999603271484,"z":0.0167708545923233}},"426c61":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.02080955542624,"y":269.999481201172,"z":0.0167714059352875}},"443992":{"lock":false,"pos":{"x":52.944206237793,"y":1.3009192943573,"z":-72.720329284668},"rot":{"x":0.0208086874336004,"y":269.99951171875,"z":0.0167712066322565}},"45e559":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.0208088960498571,"y":269.998901367188,"z":0.0167704187333584}},"4e86c1":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29497730731964,"z":-77.3199081420898},"rot":{"x":0.0208085626363754,"y":269.999603271484,"z":0.0167709644883871}},"4fb7c0":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30361223220825,"z":-63.5203514099121},"rot":{"x":0.0208085179328918,"y":269.999450683594,"z":0.0167710352689028}},"541ee9":{"lock":false,"pos":{"x":40.2920875549316,"y":1.29363143444061,"z":-81.9201126098633},"rot":{"x":0.0208084173500538,"y":269.998931884766,"z":0.0167705211788416}},"576e76":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208088215440512,"y":269.998962402344,"z":0.0167707912623882}},"591789":{"lock":false,"pos":{"x":52.9462623596191,"y":1.2982269525528,"z":-81.9207382202148},"rot":{"x":0.0208091605454683,"y":269.997863769531,"z":0.0167703274637461}},"598837":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29903519153595,"z":-58.9084396362305},"rot":{"x":0.0208092778921127,"y":269.998748779297,"z":0.0167714301496744}},"5a7a85":{"lock":false,"pos":{"x":44.2289886474609,"y":1.30017948150635,"z":-68.100715637207},"rot":{"x":0.0208088550716639,"y":269.999420166016,"z":0.0167716145515442}},"5ae7f5":{"lock":false,"pos":{"x":40.2900390625,"y":1.29565036296844,"z":-75.0200042724609},"rot":{"x":0.020809218287468,"y":269.999603271484,"z":0.0167712103575468}},"604ed6":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29970848560333,"z":-56.6084365844727},"rot":{"x":0.0208109244704247,"y":269.99169921875,"z":0.0167684536427259}},"698fcc":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29230284690857,"z":-81.9085159301758},"rot":{"x":0.0208095349371433,"y":269.998413085938,"z":0.0167707577347755}},"6b2e97":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29565024375916,"z":-75.0203018188477},"rot":{"x":0.0208092723041773,"y":269.997192382813,"z":0.0167701914906502}},"764515":{"lock":false,"pos":{"x":58.1054992675781,"y":1.30883800983429,"z":-52.0710487365723},"rot":{"x":0.020804388448596,"y":270.014465332031,"z":0.0167762618511915}},"7da732":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208086781203747,"y":269.999694824219,"z":0.0167707167565823}},"8272e9":{"lock":false,"pos":{"x":32.985279083252,"y":1.29636716842651,"z":-63.5083465576172},"rot":{"x":0.0208042487502098,"y":270.016479492188,"z":0.0167774185538292}},"82d9bb":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202514648438},"rot":{"x":0.0208084657788277,"y":269.999603271484,"z":0.016771050170064}},"86ed13":{"lock":false,"pos":{"x":36.6243438720703,"y":1.30105495452881,"z":-52.0084228515625},"rot":{"x":0.0208091046661139,"y":269.998748779297,"z":0.0167714338749647}},"8c0e3b":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29836189746857,"z":-61.2084426879883},"rot":{"x":0.0208090618252754,"y":269.998718261719,"z":0.0167712923139334}},"8f6cb3":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208087079226971,"y":269.999450683594,"z":0.0167709980159998}},"918fde":{"lock":false,"pos":{"x":58.0996627807617,"y":1.30816268920898,"z":-54.3709754943848},"rot":{"x":0.0208085142076015,"y":269.999542236328,"z":0.016770776361227}},"943332":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29634237289429,"z":-68.1082916259766},"rot":{"x":0.0208121873438358,"y":269.986694335938,"z":0.0167664512991905}},"94ebe8":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29162955284119,"z":-84.2083053588867},"rot":{"x":0.020510608330369,"y":271.009094238281,"z":0.0171348657459021}},"9c0a3d":{"lock":false,"pos":{"x":52.944221496582,"y":1.30563199520111,"z":-56.6203422546387},"rot":{"x":0.0208090599626303,"y":269.998504638672,"z":0.0167707595974207}},"9c8a39":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29701554775238,"z":-65.8083114624023},"rot":{"x":0.0208093039691448,"y":269.998687744141,"z":0.016771238297224}},"a1c372":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208085440099239,"y":269.999694824219,"z":0.0167711935937405}},"a766a3":{"lock":false,"pos":{"x":32.985279083252,"y":1.29906010627747,"z":-54.3083381652832},"rot":{"x":0.0208035446703434,"y":270.0166015625,"z":0.0167771261185408}},"a7e5a4":{"lock":false,"pos":{"x":40.6758575439453,"y":1.30292499065399,"z":-54.3128776550293},"rot":{"x":0.0208086613565683,"y":269.999725341797,"z":0.0167705696076155}},"a906ee":{"lock":false,"pos":{"x":52.9442100524902,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208088904619217,"y":269.999450683594,"z":0.0167709067463875}},"b49ef1":{"lock":false,"pos":{"x":40.2900390625,"y":1.29632365703583,"z":-72.7199935913086},"rot":{"x":0.0208086352795362,"y":269.999572753906,"z":0.0167709495872259}},"b9b811":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29162967205048,"z":-84.2082977294922},"rot":{"x":0.0208093579858541,"y":269.998382568359,"z":0.0167710036039352}},"b9dd5d":{"lock":false,"pos":{"x":32.985279083252,"y":1.29973304271698,"z":-52.0095634460449},"rot":{"x":0.020811365917325,"y":269.990661621094,"z":0.0167676210403442}},"bb7d83":{"lock":false,"pos":{"x":32.985279083252,"y":1.29569387435913,"z":-65.8082733154297},"rot":{"x":0.0208044536411762,"y":270.016479492188,"z":0.0167773440480232}},"bb9d20":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29499578475952,"z":-72.708381652832},"rot":{"x":0.0208084005862474,"y":269.998596191406,"z":0.0167705789208412}},"bdddfa":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208094511181116,"y":269.99951171875,"z":0.0167712606489658}},"becb9c":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372941493988,"z":-47.4200057983398},"rot":{"x":0.0208087619394064,"y":269.999694824219,"z":0.0167710836976767}},"c2f6b1":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170965194702,"z":-54.3199996948242},"rot":{"x":0.0208084788173437,"y":269.999694824219,"z":0.0167709421366453}},"c311be":{"lock":false,"pos":{"x":58.099666595459,"y":1.31018245220184,"z":-47.4709739685059},"rot":{"x":0.0208086762577295,"y":269.999481201172,"z":0.0167709030210972}},"c4c4b1":{"lock":false,"pos":{"x":40.290096282959,"y":1.2922842502594,"z":-86.5198974609375},"rot":{"x":0.02080805785954,"y":269.999664306641,"z":0.0167709123343229}},"c5d676":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293893814087,"z":-65.8202209472656},"rot":{"x":0.0208092406392097,"y":269.999450683594,"z":0.0167713835835457}},"c5fb42":{"lock":false,"pos":{"x":36.6243438720703,"y":1.30172801017761,"z":-49.7084579467773},"rot":{"x":0.0208113435655832,"y":269.991821289063,"z":0.0167690087109804}},"c78082":{"lock":false,"pos":{"x":32.985279083252,"y":1.29906010627747,"z":-54.3083381652832},"rot":{"x":0.0208115912973881,"y":269.990295410156,"z":0.0167674403637648}},"cb968f":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208089128136635,"y":269.999542236328,"z":0.0167709365487099}},"d26b84":{"lock":false,"pos":{"x":52.9441108703613,"y":1.29755306243896,"z":-84.2202453613281},"rot":{"x":0.020808769389987,"y":269.999420166016,"z":0.0167707987129688}},"d4d8c4":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093325138092,"z":-91.1157989501953},"rot":{"x":0.0208089891821146,"y":269.999572753906,"z":0.0167711246758699}},"d73dce":{"lock":false,"pos":{"x":32.985279083252,"y":1.29838681221008,"z":-56.608341217041},"rot":{"x":0.0208037439733744,"y":270.016540527344,"z":0.0167768709361553}},"d74e66":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.020808782428503,"y":269.99951171875,"z":0.016770988702774}},"da25d8":{"lock":false,"pos":{"x":52.9462471008301,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.0208090394735336,"y":269.998657226563,"z":0.0167707167565823}},"dcd9ce":{"lock":false,"pos":{"x":32.985279083252,"y":1.29771363735199,"z":-58.9083442687988},"rot":{"x":0.0208036303520203,"y":270.016510009766,"z":0.0167771559208632}},"e21200":{"lock":false,"pos":{"x":32.985279083252,"y":1.29771363735199,"z":-58.9083442687988},"rot":{"x":0.0208160802721977,"y":269.974426269531,"z":0.0167615935206413}},"e2bc49":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30293893814087,"z":-65.8205108642578},"rot":{"x":0.020807757973671,"y":270.002868652344,"z":0.0167724471539259}},"e53458":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950915813446,"z":-49.7709617614746},"rot":{"x":0.0208087526261806,"y":269.999481201172,"z":0.0167711358517408}},"e84eff":{"lock":false,"pos":{"x":52.9442329406738,"y":1.30765163898468,"z":-49.7206268310547},"rot":{"x":0.0208075102418661,"y":270.0029296875,"z":0.0167722459882498}},"ea3df4":{"lock":false,"pos":{"x":32.9852828979492,"y":1.30107951164246,"z":-47.4095649719238},"rot":{"x":0.020811602473259,"y":269.990295410156,"z":0.0167672950774431}},"ec3a71":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30159246921539,"z":-70.4202270507813},"rot":{"x":0.0208085626363754,"y":269.999481201172,"z":0.0167711190879345}},"ef43db":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.0208111740648746,"y":269.991973876953,"z":0.016768604516983}},"ef52e6":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30630528926849,"z":-54.3203468322754},"rot":{"x":0.0208091028034687,"y":269.998504638672,"z":0.0167706944048405}},"ef7b23":{"lock":false,"pos":{"x":32.985279083252,"y":1.30040621757507,"z":-49.7095642089844},"rot":{"x":0.0208046119660139,"y":270.014190673828,"z":0.0167759694159031}},"f00301":{"lock":false,"pos":{"x":32.985279083252,"y":1.29704034328461,"z":-61.2083473205566},"rot":{"x":0.0208161864429712,"y":269.974273681641,"z":0.0167614631354809}},"f1654d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.6082916259766},"rot":{"x":0.0208099409937859,"y":269.998413085938,"z":0.016771137714386}},"f560b1":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202239990234},"rot":{"x":0.0208086706697941,"y":269.999450683594,"z":0.0167709514498711}},"f651e8":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083343505859},"rot":{"x":0.0208097696304321,"y":269.998596191406,"z":0.0167711637914181}},"f71c08":{"lock":false,"pos":{"x":36.6086463928223,"y":1.29028046131134,"z":-88.7977523803711},"rot":{"x":0.0208122748881578,"y":269.990356445313,"z":0.0167679339647293}},"f89dd6":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901671409607,"z":-63.5200119018555},"rot":{"x":0.0208085849881172,"y":269.999542236328,"z":0.0167708601802588}},"f9a151":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208087358623743,"y":269.999694824219,"z":0.0167710725218058}},"fa4a56":{"lock":false,"pos":{"x":52.9441871643066,"y":1.30428552627563,"z":-61.2203636169434},"rot":{"x":0.0208088718354702,"y":269.999450683594,"z":0.0167711451649666}},"fc4caf":{"lock":false,"pos":{"x":52.9442405700684,"y":1.29687988758087,"z":-86.520263671875},"rot":{"x":0.0208046659827232,"y":270.013793945313,"z":0.0167762096971273}},"fcd9ce":{"lock":false,"pos":{"x":36.6243438720703,"y":1.29768872261047,"z":-63.5084457397461},"rot":{"x":0.0208085589110851,"y":269.998687744141,"z":0.0167708657681942}},"fea03b":{"lock":false,"pos":{"x":40.3117637634277,"y":1.29767489433289,"z":-68.1306838989258},"rot":{"x":0.0208088606595993,"y":269.999481201172,"z":0.0167710557579994}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Mystic -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 66.3 - posY: 1.66 - posZ: -80.18 - rotX: 0.02 - rotY: 270.02 - rotZ: 0.02 - scaleX: 1.2 - scaleY: 1.2 - scaleZ: 1.2 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d.ttslua b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.ttslua similarity index 96% rename from unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d.ttslua rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian a3401d.ttslua +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.yaml new file mode 100644 index 000000000..c2e95fa65 --- /dev/null +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.yaml @@ -0,0 +1,126 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag Mystic eca770/Card Abyssal Tome (2) a2d392.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Enchanted Blade (3) 053015.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Jewel of Aureolus (3) 0919cf.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Mists of R''lyeh (4) 0e2b00.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Arcane Studies (4) 0e808b.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Summoned Hound (1) 0e8b75.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Azure Flame (5) 0ee874.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Word of Command (2) 16154f.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Book of Shadows (3) 17c6c8.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Guts (2) 219c78.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Banish (1) 2403fa.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Scrying (3) 2b7765.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Empower Self (2) 31051f.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Mind Wipe (1) 3c7e85.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Mists of R''lyeh (2) 3d57b4.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Rite of Seeking (2) 426c61.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Ward of Protection (2) 443992.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Arcane Initiate (3) 45e559.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Mind''s Eye (2) 4e86c1.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Counterspell (2) 4fb7c0.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Paradoxical Covenant (2) 541ee9.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Recharge (4) 591789.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Clarity of Mind (3) 598837.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Clairvoyance (3) 604ed6.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card The Chthonian Stone (3) 698fcc.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Grotesque Statue (2) 6b2e97.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Grounded (1) 7da732.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Seal of the Seventh Sign (5) 8272e9.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Mind Wipe (3) 82d9bb.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Blood Pact (3) 86ed13.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Crystalline Elder Sign (3) 8c0e3b.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Bind Monster (2) 8f6cb3.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Seal of the Elder Sign (5) 918fde.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Ineffable Truth (3) 943332.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Stargazing (1) 9c0a3d.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Spirit Athame (1) a1c372.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Storm of Spirits (3) a906ee.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Empower Self (2) b49ef1.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Twila Katherine Price (3) b9b811.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Sixth Sense (4) b9dd5d.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Shrivelling (5) bb7d83.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Scroll of Secrets (3) bb9d20.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Recall the Future (2) bdddfa.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Book of Shadows (1) becb9c.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Protective Incantation (1) c2f6b1.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Defiance (2) c311be.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Azure Flame (3) c5fb42.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Wither (4) c78082.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card De Vermis Mysteriis (2) cb968f.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Deny Existence (5) d26b84.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Song of the Dead (2) d4d8c4.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Alchemical Transmutation (2) d74e66.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Clairvoyance (5) e21200.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Hypnotic Gaze (2) e2bc49.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Fearless (2) e53458.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Eldritch Inspiration (1) e84eff.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Rite of Seeking (4) ea3df4.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Time Warp (2) ec3a71.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Robes of Endless Night (2) ef43db.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Sacrifice (1) ef52e6.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Shining Trapezohedron (4) ef7b23.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Ineffable Truth (5) f00301.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Shrivelling (3) f1654d.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Recharge (2) f560b1.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Shards of the Void (3) f651e8.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Grotesque Statue (4) f71c08.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Arcane Studies (2) f89dd6.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Four of Cups (1) f9a151.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Blinding Light (2) fa4a56.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Ward of Protection (5) fc4caf.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Dayana Esperence (3) fcd9ce.yaml' +- !include 'Custom_Model_Bag Mystic eca770/Card Empower Self (2) fea03b.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516557267/757887224F6C37104CDFFE241FAD09B57117D670/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: eca770 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Mystic eca770.ttslua' +LuaScriptState: '{"ml":{"053015":{"lock":false,"pos":{"x":36.624340057373,"y":1.296342253685,"z":-68.1082992553711},"rot":{"x":0.0208088085055351,"y":269.998748779297,"z":0.0167686883360147}},"0919cf":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083892822266},"rot":{"x":0.020808657631278,"y":269.998748779297,"z":0.016769215464592}},"09ffbe":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208091791719198,"y":269.998870849609,"z":0.0167703963816166}},"0e2b00":{"lock":false,"pos":{"x":32.9852981567383,"y":1.30107951164246,"z":-47.4095573425293},"rot":{"x":0.0208115708082914,"y":269.990203857422,"z":0.016768354922533}},"0e808b":{"lock":false,"pos":{"x":36.6086463928223,"y":1.29028046131134,"z":-88.7977447509766},"rot":{"x":0.0208123195916414,"y":269.986358642578,"z":0.0167646687477827}},"0e8b75":{"lock":false,"pos":{"x":40.2900810241699,"y":1.30036306381226,"z":-58.9199829101563},"rot":{"x":0.0208085291087627,"y":269.999694824219,"z":0.0167711097747087}},"0ee874":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29771363735199,"z":-58.9083404541016},"rot":{"x":0.0208141822367907,"y":269.981323242188,"z":0.016764085739851}},"16154f":{"lock":false,"pos":{"x":52.944206237793,"y":1.30024600028992,"z":-75.0203323364258},"rot":{"x":0.0208088550716639,"y":269.999481201172,"z":0.0167709905654192}},"17c6c8":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208092518150806,"y":269.998870849609,"z":0.0167700555175543}},"219c78":{"lock":false,"pos":{"x":58.099666595459,"y":1.30883586406708,"z":-52.0712699890137},"rot":{"x":0.0208076070994139,"y":270.003112792969,"z":0.0167721472680569}},"2403fa":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208088662475348,"y":269.998504638672,"z":0.0167704280465841}},"25c498":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208089295774698,"y":269.998504638672,"z":0.016770213842392}},"2b7765":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.0208085533231497,"y":269.998748779297,"z":0.016769353300333}},"31051f":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632365703583,"z":-72.7199783325195},"rot":{"x":0.0208081994205713,"y":269.999572753906,"z":0.0167699549347162}},"3c7e85":{"lock":false,"pos":{"x":52.944206237793,"y":1.3069783449173,"z":-52.0203437805176},"rot":{"x":0.0208089258521795,"y":269.998504638672,"z":0.0167707074433565}},"3d57b4":{"lock":false,"pos":{"x":40.2920875549316,"y":1.29363143444061,"z":-81.9201126098633},"rot":{"x":0.0208085663616657,"y":269.999633789063,"z":0.0167690142989159}},"426c61":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093490600586},"rot":{"x":0.020808232948184,"y":269.999603271484,"z":0.0167697817087173}},"443992":{"lock":false,"pos":{"x":52.944206237793,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208087787032127,"y":269.99951171875,"z":0.0167710240930319}},"45e559":{"lock":false,"pos":{"x":36.6243362426758,"y":1.3017281293869,"z":-49.7084617614746},"rot":{"x":0.0208092462271452,"y":269.998901367188,"z":0.0167702194303274}},"4e86c1":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29430389404297,"z":-79.6198959350586},"rot":{"x":0.0208085756748915,"y":269.999633789063,"z":0.0167689844965935}},"4fb7c0":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30361223220825,"z":-63.5203514099121},"rot":{"x":0.0208087749779224,"y":269.999450683594,"z":0.0167710483074188}},"541ee9":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198867797852},"rot":{"x":0.0208084024488926,"y":269.998992919922,"z":0.0167695675045252}},"576e76":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208088215440512,"y":269.998962402344,"z":0.0167707912623882}},"591789":{"lock":false,"pos":{"x":52.9462623596191,"y":1.29822683334351,"z":-81.9207382202148},"rot":{"x":0.0208091344684362,"y":269.997863769531,"z":0.0167703982442617}},"598837":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208094790577888,"y":269.998718261719,"z":0.0167701076716185}},"5a7a85":{"lock":false,"pos":{"x":44.2289886474609,"y":1.30017948150635,"z":-68.100715637207},"rot":{"x":0.0208088550716639,"y":269.999420166016,"z":0.0167716145515442}},"5ae7f5":{"lock":false,"pos":{"x":40.2900390625,"y":1.29565036296844,"z":-75.0200042724609},"rot":{"x":0.020809218287468,"y":269.999603271484,"z":0.0167712103575468}},"604ed6":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.020811440423131,"y":269.991668701172,"z":0.0167674403637648}},"698fcc":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29162955284119,"z":-84.2082901000977},"rot":{"x":0.0208087116479874,"y":269.998474121094,"z":0.0167693383991718}},"6b2e97":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3198928833008},"rot":{"x":0.020808931440115,"y":269.997253417969,"z":0.0167690608650446}},"764515":{"lock":false,"pos":{"x":58.1054992675781,"y":1.30883800983429,"z":-52.0710487365723},"rot":{"x":0.020804388448596,"y":270.014465332031,"z":0.0167762618511915}},"7da732":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208086278289557,"y":269.999694824219,"z":0.0167710669338703}},"8272e9":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29569387435913,"z":-65.8082656860352},"rot":{"x":0.0208033081144094,"y":270.016540527344,"z":0.0167759172618389}},"82d9bb":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202514648438},"rot":{"x":0.0208087209612131,"y":269.999603271484,"z":0.0167711190879345}},"86ed13":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208093095570803,"y":269.998718261719,"z":0.0167702417820692}},"8c0e3b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768860340118,"z":-63.5084495544434},"rot":{"x":0.0208089239895344,"y":269.998748779297,"z":0.0167695470154285}},"8f6cb3":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208086892962456,"y":269.999450683594,"z":0.0167709272354841}},"918fde":{"lock":false,"pos":{"x":58.0996627807617,"y":1.30816268920898,"z":-54.3709754943848},"rot":{"x":0.0208084993064404,"y":269.999542236328,"z":0.0167710911482573}},"943332":{"lock":false,"pos":{"x":36.6243362426758,"y":1.2956690788269,"z":-70.4083023071289},"rot":{"x":0.020811814814806,"y":269.986755371094,"z":0.0167661160230637}},"94ebe8":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29162955284119,"z":-84.2083053588867},"rot":{"x":0.020510608330369,"y":271.009094238281,"z":0.0171348657459021}},"9c0a3d":{"lock":false,"pos":{"x":52.944221496582,"y":1.30563187599182,"z":-56.6203422546387},"rot":{"x":0.0208090487867594,"y":269.998504638672,"z":0.0167705714702606}},"9c8a39":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29701554775238,"z":-65.8083114624023},"rot":{"x":0.0208093039691448,"y":269.998687744141,"z":0.016771238297224}},"a1c372":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208086427301168,"y":269.999694824219,"z":0.0167709514498711}},"a2d392":{"lock":false,"pos":{"x":40.2900543212891,"y":1.29968988895416,"z":-61.2200012207031},"rot":{"x":0.02080855704844,"y":270.001129150391,"z":0.016772435978055}},"a766a3":{"lock":false,"pos":{"x":32.985279083252,"y":1.29906010627747,"z":-54.3083381652832},"rot":{"x":0.0208035446703434,"y":270.0166015625,"z":0.0167771261185408}},"a7e5a4":{"lock":false,"pos":{"x":40.6758575439453,"y":1.30292499065399,"z":-54.3128776550293},"rot":{"x":0.0208086613565683,"y":269.999725341797,"z":0.0167705696076155}},"a906ee":{"lock":false,"pos":{"x":52.9442100524902,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208086799830198,"y":269.999450683594,"z":0.0167710054665804}},"b49ef1":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565036296844,"z":-75.0199890136719},"rot":{"x":0.0208082478493452,"y":269.999633789063,"z":0.0167698934674263}},"b9b811":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29095637798309,"z":-86.5082931518555},"rot":{"x":0.0208087638020515,"y":269.998443603516,"z":0.0167692601680756}},"b9dd5d":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29906010627747,"z":-54.3083343505859},"rot":{"x":0.0208115875720978,"y":269.990661621094,"z":0.0167674217373133}},"bb7d83":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29502069950104,"z":-68.108268737793},"rot":{"x":0.0208032540977001,"y":270.016510009766,"z":0.0167762655764818}},"bb9d20":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208087544888258,"y":269.998687744141,"z":0.0167693197727203}},"bdddfa":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.519905090332},"rot":{"x":0.0208083745092154,"y":269.999572753906,"z":0.016769751906395}},"becb9c":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208086017519236,"y":269.999694824219,"z":0.0167710445821285}},"c2f6b1":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208084788173437,"y":269.999694824219,"z":0.0167711153626442}},"c311be":{"lock":false,"pos":{"x":58.099666595459,"y":1.31018245220184,"z":-47.4709739685059},"rot":{"x":0.0208087563514709,"y":269.999481201172,"z":0.0167709700763226}},"c4c4b1":{"lock":false,"pos":{"x":40.290096282959,"y":1.2922842502594,"z":-86.5198974609375},"rot":{"x":0.02080805785954,"y":269.999664306641,"z":0.0167709123343229}},"c5d676":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293893814087,"z":-65.8202209472656},"rot":{"x":0.0208092406392097,"y":269.999450683594,"z":0.0167713835835457}},"c5fb42":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208113677799702,"y":269.991821289063,"z":0.0167678873986006}},"c78082":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29838681221008,"z":-56.6083374023438},"rot":{"x":0.0208116713911295,"y":269.990295410156,"z":0.0167670790106058}},"cb968f":{"lock":false,"pos":{"x":40.2900505065918,"y":1.2976701259613,"z":-68.1198577880859},"rot":{"x":0.0208084303885698,"y":269.999572753906,"z":0.0167700182646513}},"d26b84":{"lock":false,"pos":{"x":52.9441108703613,"y":1.29755306243896,"z":-84.2202453613281},"rot":{"x":0.0208089035004377,"y":269.999420166016,"z":0.0167708862572908}},"d4d8c4":{"lock":false,"pos":{"x":36.6243438720703,"y":1.30240142345428,"z":-47.4084320068359},"rot":{"x":0.0208088923245668,"y":269.999542236328,"z":0.016771899536252}},"d73dce":{"lock":false,"pos":{"x":32.985279083252,"y":1.29838681221008,"z":-56.608341217041},"rot":{"x":0.0208037439733744,"y":270.016540527344,"z":0.0167768709361553}},"d74e66":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29901659488678,"z":-63.5200042724609},"rot":{"x":0.0208091922104359,"y":269.999481201172,"z":0.0167708583176136}},"da25d8":{"lock":false,"pos":{"x":52.9462471008301,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.0208090394735336,"y":269.998657226563,"z":0.0167707167565823}},"dcd9ce":{"lock":false,"pos":{"x":32.985279083252,"y":1.29771363735199,"z":-58.9083442687988},"rot":{"x":0.0208036303520203,"y":270.016510009766,"z":0.0167771559208632}},"e21200":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29704034328461,"z":-61.2083435058594},"rot":{"x":0.0208163149654865,"y":269.974426269531,"z":0.0167614948004484}},"e2bc49":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30293893814087,"z":-65.8205108642578},"rot":{"x":0.0208076480776072,"y":270.002868652344,"z":0.016772260889411}},"e53458":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950915813446,"z":-49.7709617614746},"rot":{"x":0.0208085514605045,"y":269.999481201172,"z":0.0167710911482573}},"e84eff":{"lock":false,"pos":{"x":52.9442329406738,"y":1.30765151977539,"z":-49.7206268310547},"rot":{"x":0.0208077654242516,"y":270.0029296875,"z":0.0167723931372166}},"ea3df4":{"lock":false,"pos":{"x":32.9852828979492,"y":1.30040621757507,"z":-49.7095603942871},"rot":{"x":0.020811652764678,"y":269.990295410156,"z":0.0167672038078308}},"ec3a71":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30159246921539,"z":-70.4202270507813},"rot":{"x":0.0208087004721165,"y":269.999481201172,"z":0.016770962625742}},"ef43db":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093313217163,"z":-91.1157913208008},"rot":{"x":0.0208105836063623,"y":269.992095947266,"z":0.0167668927460909}},"ef52e6":{"lock":false,"pos":{"x":52.9442100524902,"y":1.3063051700592,"z":-54.3203468322754},"rot":{"x":0.0208090078085661,"y":269.998504638672,"z":0.0167704969644547}},"ef7b23":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29973304271698,"z":-52.0095596313477},"rot":{"x":0.0208045188337564,"y":270.01416015625,"z":0.0167759209871292}},"f00301":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29636704921722,"z":-63.5083389282227},"rot":{"x":0.0208167154341936,"y":269.974243164063,"z":0.0167619828134775}},"f1654d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29230272769928,"z":-81.9085083007813},"rot":{"x":0.0208087060600519,"y":269.998474121094,"z":0.0167693458497524}},"f560b1":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202239990234},"rot":{"x":0.0208088532090187,"y":269.999450683594,"z":0.0167709290981293}},"f651e8":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.608283996582},"rot":{"x":0.0208089128136635,"y":269.998687744141,"z":0.0167693756520748}},"f71c08":{"lock":false,"pos":{"x":36.608268737793,"y":1.28960514068604,"z":-91.1042709350586},"rot":{"x":0.0208110529929399,"y":269.990478515625,"z":0.0167661886662245}},"f89dd6":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29834342002869,"z":-65.8198547363281},"rot":{"x":0.020808195695281,"y":269.999572753906,"z":0.0167698543518782}},"f9a151":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208086147904396,"y":269.999694824219,"z":0.0167709365487099}},"fa4a56":{"lock":false,"pos":{"x":52.9441871643066,"y":1.30428540706635,"z":-61.2203636169434},"rot":{"x":0.0208089146763086,"y":269.999450683594,"z":0.0167709719389677}},"fc4caf":{"lock":false,"pos":{"x":52.9442405700684,"y":1.29687976837158,"z":-86.520263671875},"rot":{"x":0.0208045598119497,"y":270.013793945313,"z":0.0167761258780956}},"fcd9ce":{"lock":false,"pos":{"x":36.624340057373,"y":1.29701554775238,"z":-65.8082962036133},"rot":{"x":0.0208090413361788,"y":269.998748779297,"z":0.0167686641216278}},"fea03b":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29699695110321,"z":-70.4198608398438},"rot":{"x":0.020808270201087,"y":269.999603271484,"z":0.0167696792632341}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Mystic +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.3 + posY: 1.66 + posZ: -80.18 + rotX: 0.02 + rotY: 270.02 + rotZ: 0.02 + scaleX: 1.2 + scaleY: 1.2 + scaleZ: 1.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Abyssal Tome (2) a2d392.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Abyssal Tome (2) a2d392.yaml new file mode 100644 index 000000000..250e22436 --- /dev/null +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Abyssal Tome (2) a2d392.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232107 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a2d392 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Abyssal Tome (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.32 + posY: 1.41 + posZ: -80.18 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Alchemical Transmutation (2) d74e66.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Alchemical Transmutation (2) d74e66.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Alchemical Transmutation (2) d74e66.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Alchemical Transmutation (2) d74e66.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Arcane Initiate (3) 45e559.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Arcane Initiate (3) 45e559.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Arcane Initiate (3) 45e559.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Arcane Initiate (3) 45e559.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Arcane Studies (2) f89dd6.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Arcane Studies (2) f89dd6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Arcane Studies (2) f89dd6.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Arcane Studies (2) f89dd6.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Arcane Studies (4) 0e808b.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Arcane Studies (4) 0e808b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Arcane Studies (4) 0e808b.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Arcane Studies (4) 0e808b.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Azure Flame (3) c5fb42.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Azure Flame (3) c5fb42.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Azure Flame (3) c5fb42.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Azure Flame (3) c5fb42.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Azure Flame (5) 0ee874.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Azure Flame (5) 0ee874.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Azure Flame (5) 0ee874.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Azure Flame (5) 0ee874.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Banish (1) 2403fa.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Banish (1) 2403fa.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Banish (1) 2403fa.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Banish (1) 2403fa.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Bind Monster (2) 8f6cb3.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Bind Monster (2) 8f6cb3.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Bind Monster (2) 8f6cb3.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Bind Monster (2) 8f6cb3.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Blinding Light (2) fa4a56.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Blinding Light (2) fa4a56.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Blinding Light (2) fa4a56.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Blinding Light (2) fa4a56.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Blood Pact (3) 86ed13.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Blood Pact (3) 86ed13.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Blood Pact (3) 86ed13.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Blood Pact (3) 86ed13.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Book of Shadows (1) becb9c.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Book of Shadows (1) becb9c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Book of Shadows (1) becb9c.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Book of Shadows (1) becb9c.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Book of Shadows (3) 17c6c8.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Book of Shadows (3) 17c6c8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Book of Shadows (3) 17c6c8.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Book of Shadows (3) 17c6c8.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Clairvoyance (3) 604ed6.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Clairvoyance (3) 604ed6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Clairvoyance (3) 604ed6.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Clairvoyance (3) 604ed6.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Clairvoyance (5) e21200.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Clairvoyance (5) e21200.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Clairvoyance (5) e21200.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Clairvoyance (5) e21200.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Clarity of Mind (3) 598837.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Clarity of Mind (3) 598837.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Clarity of Mind (3) 598837.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Clarity of Mind (3) 598837.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Counterspell (2) 4fb7c0.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Counterspell (2) 4fb7c0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Counterspell (2) 4fb7c0.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Counterspell (2) 4fb7c0.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Crystalline Elder Sign (3) 8c0e3b.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Crystalline Elder Sign (3) 8c0e3b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Crystalline Elder Sign (3) 8c0e3b.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Crystalline Elder Sign (3) 8c0e3b.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Dayana Esperence (3) fcd9ce.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Dayana Esperence (3) fcd9ce.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Dayana Esperence (3) fcd9ce.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Dayana Esperence (3) fcd9ce.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card De Vermis Mysteriis (2) cb968f.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card De Vermis Mysteriis (2) cb968f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card De Vermis Mysteriis (2) cb968f.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card De Vermis Mysteriis (2) cb968f.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Defiance (2) c311be.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Defiance (2) c311be.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Defiance (2) c311be.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Defiance (2) c311be.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Deny Existence (5) d26b84.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Deny Existence (5) d26b84.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Deny Existence (5) d26b84.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Deny Existence (5) d26b84.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Eldritch Inspiration (1) e84eff.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Eldritch Inspiration (1) e84eff.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Eldritch Inspiration (1) e84eff.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Eldritch Inspiration (1) e84eff.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Empower Self (2) 31051f.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Empower Self (2) 31051f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Empower Self (2) 31051f.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Empower Self (2) 31051f.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Empower Self (2) b49ef1.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Empower Self (2) b49ef1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Empower Self (2) b49ef1.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Empower Self (2) b49ef1.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Empower Self (2) fea03b.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Empower Self (2) fea03b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Empower Self (2) fea03b.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Empower Self (2) fea03b.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Enchanted Blade (3) 053015.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Enchanted Blade (3) 053015.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Enchanted Blade (3) 053015.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Enchanted Blade (3) 053015.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Fearless (2) e53458.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Fearless (2) e53458.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Fearless (2) e53458.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Fearless (2) e53458.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Four of Cups (1) f9a151.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Four of Cups (1) f9a151.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Four of Cups (1) f9a151.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Four of Cups (1) f9a151.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Grotesque Statue (2) 6b2e97.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Grotesque Statue (2) 6b2e97.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Grotesque Statue (2) 6b2e97.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Grotesque Statue (2) 6b2e97.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Grotesque Statue (4) f71c08.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Grotesque Statue (4) f71c08.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Grotesque Statue (4) f71c08.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Grotesque Statue (4) f71c08.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Grounded (1) 7da732.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Grounded (1) 7da732.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Grounded (1) 7da732.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Grounded (1) 7da732.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Guts (2) 219c78.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Guts (2) 219c78.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Guts (2) 219c78.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Guts (2) 219c78.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Hypnotic Gaze (2) e2bc49.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Hypnotic Gaze (2) e2bc49.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Hypnotic Gaze (2) e2bc49.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Hypnotic Gaze (2) e2bc49.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Ineffable Truth (3) 943332.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Ineffable Truth (3) 943332.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Ineffable Truth (3) 943332.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Ineffable Truth (3) 943332.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Ineffable Truth (5) f00301.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Ineffable Truth (5) f00301.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Ineffable Truth (5) f00301.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Ineffable Truth (5) f00301.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Jewel of Aureolus (3) 0919cf.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Jewel of Aureolus (3) 0919cf.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Jewel of Aureolus (3) 0919cf.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Jewel of Aureolus (3) 0919cf.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Mind Wipe (1) 3c7e85.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Mind Wipe (1) 3c7e85.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Mind Wipe (1) 3c7e85.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Mind Wipe (1) 3c7e85.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Mind Wipe (3) 82d9bb.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Mind Wipe (3) 82d9bb.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Mind Wipe (3) 82d9bb.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Mind Wipe (3) 82d9bb.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Mind's Eye (2) 4e86c1.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Mind's Eye (2) 4e86c1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Mind's Eye (2) 4e86c1.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Mind's Eye (2) 4e86c1.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Mists of R'lyeh (2) 3d57b4.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Mists of R'lyeh (2) 3d57b4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Mists of R'lyeh (2) 3d57b4.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Mists of R'lyeh (2) 3d57b4.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Mists of R'lyeh (4) 0e2b00.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Mists of R'lyeh (4) 0e2b00.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Mists of R'lyeh (4) 0e2b00.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Mists of R'lyeh (4) 0e2b00.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Paradoxical Covenant (2) 541ee9.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Paradoxical Covenant (2) 541ee9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Paradoxical Covenant (2) 541ee9.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Paradoxical Covenant (2) 541ee9.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Protective Incantation (1) c2f6b1.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Protective Incantation (1) c2f6b1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Protective Incantation (1) c2f6b1.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Protective Incantation (1) c2f6b1.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Recall the Future (2) bdddfa.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Recall the Future (2) bdddfa.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Recall the Future (2) bdddfa.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Recall the Future (2) bdddfa.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Recharge (2) f560b1.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Recharge (2) f560b1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Recharge (2) f560b1.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Recharge (2) f560b1.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Recharge (4) 591789.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Recharge (4) 591789.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Recharge (4) 591789.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Recharge (4) 591789.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Rite of Seeking (2) 426c61.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Rite of Seeking (2) 426c61.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Rite of Seeking (2) 426c61.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Rite of Seeking (2) 426c61.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Rite of Seeking (4) ea3df4.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Rite of Seeking (4) ea3df4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Rite of Seeking (4) ea3df4.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Rite of Seeking (4) ea3df4.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Robes of Endless Night (2) ef43db.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Robes of Endless Night (2) ef43db.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Robes of Endless Night (2) ef43db.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Robes of Endless Night (2) ef43db.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Sacrifice (1) ef52e6.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Sacrifice (1) ef52e6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Sacrifice (1) ef52e6.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Sacrifice (1) ef52e6.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Scroll of Secrets (3) bb9d20.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Scroll of Secrets (3) bb9d20.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Scroll of Secrets (3) bb9d20.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Scroll of Secrets (3) bb9d20.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Scrying (3) 2b7765.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Scrying (3) 2b7765.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Scrying (3) 2b7765.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Scrying (3) 2b7765.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Seal of the Elder Sign (5) 918fde.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Seal of the Elder Sign (5) 918fde.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Seal of the Elder Sign (5) 918fde.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Seal of the Elder Sign (5) 918fde.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Seal of the Seventh Sign (5) 8272e9.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Seal of the Seventh Sign (5) 8272e9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Seal of the Seventh Sign (5) 8272e9.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Seal of the Seventh Sign (5) 8272e9.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Shards of the Void (3) f651e8.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Shards of the Void (3) f651e8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Shards of the Void (3) f651e8.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Shards of the Void (3) f651e8.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Shining Trapezohedron (4) ef7b23.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Shining Trapezohedron (4) ef7b23.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Shining Trapezohedron (4) ef7b23.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Shining Trapezohedron (4) ef7b23.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Shrivelling (3) f1654d.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Shrivelling (3) f1654d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Shrivelling (3) f1654d.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Shrivelling (3) f1654d.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Shrivelling (5) bb7d83.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Shrivelling (5) bb7d83.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Shrivelling (5) bb7d83.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Shrivelling (5) bb7d83.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Sixth Sense (4) b9dd5d.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Sixth Sense (4) b9dd5d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Sixth Sense (4) b9dd5d.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Sixth Sense (4) b9dd5d.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Song of the Dead (2) d4d8c4.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Song of the Dead (2) d4d8c4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Song of the Dead (2) d4d8c4.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Song of the Dead (2) d4d8c4.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Spirit Athame (1) a1c372.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Spirit Athame (1) a1c372.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Spirit Athame (1) a1c372.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Spirit Athame (1) a1c372.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Stargazing (1) 9c0a3d.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Stargazing (1) 9c0a3d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Stargazing (1) 9c0a3d.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Stargazing (1) 9c0a3d.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Storm of Spirits (3) a906ee.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Storm of Spirits (3) a906ee.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Storm of Spirits (3) a906ee.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Storm of Spirits (3) a906ee.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Summoned Hound (1) 0e8b75.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Summoned Hound (1) 0e8b75.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Summoned Hound (1) 0e8b75.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Summoned Hound (1) 0e8b75.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card The Chthonian Stone (3) 698fcc.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card The Chthonian Stone (3) 698fcc.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card The Chthonian Stone (3) 698fcc.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card The Chthonian Stone (3) 698fcc.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Time Warp (2) ec3a71.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Time Warp (2) ec3a71.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Time Warp (2) ec3a71.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Time Warp (2) ec3a71.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Twila Katherine Price (3) b9b811.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Twila Katherine Price (3) b9b811.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Twila Katherine Price (3) b9b811.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Twila Katherine Price (3) b9b811.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Ward of Protection (2) 443992.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Ward of Protection (2) 443992.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Ward of Protection (2) 443992.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Ward of Protection (2) 443992.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Ward of Protection (5) fc4caf.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Ward of Protection (5) fc4caf.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Ward of Protection (5) fc4caf.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Ward of Protection (5) fc4caf.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Wither (4) c78082.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Wither (4) c78082.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Wither (4) c78082.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Wither (4) c78082.yaml diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Word of Command (2) 16154f.yaml b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Word of Command (2) 16154f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99/Card Word of Command (2) 16154f.yaml rename to unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770/Card Word of Command (2) 16154f.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf.ttslua b/unpacked/Custom_Model_Bag Mystic b4d9bf.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf.ttslua +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf.yaml index 27136286d..3dee93f01 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf.yaml @@ -4,10 +4,8 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7.yaml' -- !include 'Custom_Model_Bag Mystic b4d9bf/Card Shroud of Shadows a565d5.yaml' -- !include 'Custom_Model_Bag Mystic b4d9bf/Card Eye of Chaos 9a5782.yaml' -- !include 'Custom_Model_Bag Mystic b4d9bf/Card Armageddon 3feff1.yaml' +- !include 'Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.yaml' +- !include 'Custom_Model_Bag Mystic b4d9bf/Card Blood Pact fc709b.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Blinding Light 00d05a.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Voice of Ra 0988b2.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Enraptured 0ce7b8.yaml' @@ -17,6 +15,7 @@ ContainedObjects: - !include 'Custom_Model_Bag Mystic b4d9bf/Card Scrying 24a147.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card David Renfield 3120e7.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Premonition 348395.yaml' +- !include 'Custom_Model_Bag Mystic b4d9bf/Card Armageddon 3feff1.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Arcane Initiate 4287c0.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Parallel Fates 47bdba.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Healing Words 4abb47.yaml' @@ -41,10 +40,12 @@ ContainedObjects: - !include 'Custom_Model_Bag Mystic b4d9bf/Card Defiance 946958.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Familiar Spirit 971d52.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Holy Rosary 98aa6a.yaml' +- !include 'Custom_Model_Bag Mystic b4d9bf/Card Eye of Chaos 9a5782.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Ward of Protection 9bee5a.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Torrent of Power 9f2514.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Alyssa Graham a26795.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Eldritch Inspiration a268ef.yaml' +- !include 'Custom_Model_Bag Mystic b4d9bf/Card Shroud of Shadows a565d5.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Uncage the Soul a82830.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Ward of Radiance b22438.yaml' - !include 'Custom_Model_Bag Mystic b4d9bf/Card Drawn to the Flame b36f5e.yaml' @@ -97,7 +98,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: true LuaScript: !include 'Custom_Model_Bag Mystic b4d9bf.ttslua' -LuaScriptState: '{"ml":{"00d05a":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3075715303421,"z":90.141227722168},"rot":{"x":0.0208179596811533,"y":269.967468261719,"z":0.0167594738304615}},"0988b2":{"lock":false,"pos":{"x":53.2126121520996,"y":1.29544854164124,"z":48.7452774047852},"rot":{"x":0.0208086092025042,"y":270,"z":0.0167712923139334}},"0ce7b8":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30942869186401,"z":90.0903701782227},"rot":{"x":0.0208171363919973,"y":269.970916748047,"z":0.016760565340519}},"0e459d":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638564586639,"z":67.148681640625},"rot":{"x":0.0208132173866034,"y":269.984252929688,"z":0.0167655125260353}},"17319c":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29975187778473,"z":78.6486892700195},"rot":{"x":0.0208079405128956,"y":270.000030517578,"z":0.0167709123343229}},"20ff08":{"lock":false,"pos":{"x":53.2127799987793,"y":1.29612362384796,"z":51.0517311096191},"rot":{"x":0.0208189375698566,"y":269.966430664063,"z":0.0167580544948578}},"24621a":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30250763893127,"z":92.4607086181641},"rot":{"x":0.0208132378757,"y":269.983551025391,"z":0.0167651809751987}},"247824":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30218553543091,"z":71.7412033081055},"rot":{"x":0.0208180192857981,"y":269.966979980469,"z":0.0167590640485287}},"24a147":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29914140701294,"z":80.9607238769531},"rot":{"x":0.0208126250654459,"y":269.983459472656,"z":0.0167648009955883}},"3120e7":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705893993378,"z":69.4486846923828},"rot":{"x":0.0208125710487366,"y":269.984436035156,"z":0.0167642999440432}},"348395":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30016577243805,"z":64.8410720825195},"rot":{"x":0.0208182111382484,"y":269.966796875,"z":0.0167589709162712}},"396e1c":{"lock":false,"pos":{"x":40.960205078125,"y":1.30042505264282,"z":80.9486846923828},"rot":{"x":0.0208138320595026,"y":269.984497070313,"z":0.0167657043784857}},"3feff1":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30042505264282,"z":80.9486999511719},"rot":{"x":0.0208083335310221,"y":269.998931884766,"z":0.01677056401968}},"4287c0":{"lock":false,"pos":{"x":40.960205078125,"y":1.30244481563568,"z":87.8487014770508},"rot":{"x":0.0208129361271858,"y":269.984741210938,"z":0.0167655646800995}},"47bdba":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30083906650543,"z":67.1410827636719},"rot":{"x":0.0208085551857948,"y":270,"z":0.0167712047696114}},"4abb47":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369378089905,"z":57.9485626220703},"rot":{"x":0.0208136606961489,"y":269.983978271484,"z":0.0167650002986193}},"4f33d5":{"lock":false,"pos":{"x":53.2285499572754,"y":1.29881930351257,"z":60.2411804199219},"rot":{"x":0.0208183098584414,"y":269.966705322266,"z":0.0167593378573656}},"4fe0b8":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29644846916199,"z":71.7607116699219},"rot":{"x":0.0208141654729843,"y":269.983215332031,"z":0.0167655311524868}},"562eb1":{"lock":false,"pos":{"x":53.2285499572754,"y":1.29949259757996,"z":62.5411796569824},"rot":{"x":0.0208182670176029,"y":269.966796875,"z":0.0167593043297529}},"5792ab":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29308223724365,"z":60.2607727050781},"rot":{"x":0.0208138022571802,"y":269.982818603516,"z":0.0167648121714592}},"5905a9":{"lock":false,"pos":{"x":37.4159698486328,"y":1.29510200023651,"z":67.1606750488281},"rot":{"x":0.0208143871277571,"y":269.983032226563,"z":0.0167654491961002}},"5e3a3b":{"lock":false,"pos":{"x":58.3838386535645,"y":1.30808234214783,"z":85.490364074707},"rot":{"x":0.0208087768405676,"y":269.99951171875,"z":0.016770800575614}},"62db13":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30555176734924,"z":83.2412185668945},"rot":{"x":0.0208182632923126,"y":269.967132568359,"z":0.0167595166712999}},"6446d1":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29846823215485,"z":78.6607208251953},"rot":{"x":0.0208079945296049,"y":270.000030517578,"z":0.0167700331658125}},"64fcdf":{"lock":false,"pos":{"x":40.9634208679199,"y":1.2916773557663,"z":51.0597610473633},"rot":{"x":0.02081348747015,"y":269.983825683594,"z":0.016765009611845}},"6c3156":{"lock":false,"pos":{"x":40.960205078125,"y":1.29773211479187,"z":71.7486877441406},"rot":{"x":0.0208081286400557,"y":270.000061035156,"z":0.0167701635509729}},"715974":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29100203514099,"z":48.7527389526367},"rot":{"x":0.0208135601133108,"y":269.983764648438,"z":0.0167647954076529}},"74b8d4":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30689823627472,"z":87.8412246704102},"rot":{"x":0.0208182837814093,"y":269.96728515625,"z":0.0167593713849783}},"78b142":{"lock":false,"pos":{"x":53.2285919189453,"y":1.296799659729,"z":53.3411636352539},"rot":{"x":0.0208084657788277,"y":269.999603271484,"z":0.0167708825320005}},"7cf231":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436600208282,"z":60.2487869262695},"rot":{"x":0.0208133812993765,"y":269.984008789063,"z":0.0167649742215872}},"7d133c":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30379140377045,"z":92.4487075805664},"rot":{"x":0.0208129473030567,"y":269.984741210938,"z":0.0167653653770685}},"7d532d":{"lock":false,"pos":{"x":40.9602127075195,"y":1.29840540885925,"z":74.048698425293},"rot":{"x":0.0208125095814466,"y":269.984497070313,"z":0.0167653169482946}},"7e7873":{"lock":false,"pos":{"x":58.3838348388672,"y":1.30808246135712,"z":85.490348815918},"rot":{"x":0.0208086892962456,"y":270.000061035156,"z":0.0167709160596132}},"7fda7e":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29638564586639,"z":67.1486663818359},"rot":{"x":0.0208138152956963,"y":269.984161376953,"z":0.0167658906430006}},"8b39e9":{"lock":false,"pos":{"x":37.4159927368164,"y":1.30250763893127,"z":92.4607315063477},"rot":{"x":0.020812876522541,"y":269.983764648438,"z":0.0167650394141674}},"8bb57d":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3082447052002,"z":92.4412155151367},"rot":{"x":0.0208180192857981,"y":269.967468261719,"z":0.0167594850063324}},"916f1c":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29375553131104,"z":62.5607719421387},"rot":{"x":0.0208138227462769,"y":269.983032226563,"z":0.0167646929621696}},"946958":{"lock":false,"pos":{"x":58.3838310241699,"y":1.31010210514069,"z":92.3903579711914},"rot":{"x":0.0208172891288996,"y":269.970642089844,"z":0.0167604684829712}},"971d52":{"lock":false,"pos":{"x":40.9601783752441,"y":1.29503917694092,"z":62.5487480163574},"rot":{"x":0.0208085477352142,"y":270.000030517578,"z":0.0167708806693554}},"98aa6a":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302072525024,"z":55.6492195129395},"rot":{"x":0.0208134427666664,"y":269.98388671875,"z":0.0167649369686842}},"9a5782":{"lock":false,"pos":{"x":40.9601783752441,"y":1.29571235179901,"z":64.8486709594727},"rot":{"x":0.020808469504118,"y":269.998931884766,"z":0.0167706441134214}},"9bee5a":{"lock":false,"pos":{"x":49.5628509521484,"y":1.30691683292389,"z":92.4527969360352},"rot":{"x":0.0208183918148279,"y":269.966369628906,"z":0.016758793964982}},"9f2514":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30606269836426,"z":78.5903549194336},"rot":{"x":0.0208174008876085,"y":269.970458984375,"z":0.0167603101581335}},"9f8a0a":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208139251917601,"y":269.984252929688,"z":0.0167657993733883}},"a0b9a7":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30083894729614,"z":67.1410827636719},"rot":{"x":0.020818779245019,"y":269.966888427734,"z":0.0167595278471708}},"a26795":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30311810970306,"z":90.1487121582031},"rot":{"x":0.0208130832761526,"y":269.984710693359,"z":0.0167657975107431}},"a268ef":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30420529842377,"z":78.641227722168},"rot":{"x":0.0208179671317339,"y":269.967163085938,"z":0.016759492456913}},"a283b4":{"lock":false,"pos":{"x":40.9634170532227,"y":1.29369378089905,"z":57.948558807373},"rot":{"x":0.0208131521940231,"y":269.98388671875,"z":0.0167651418596506}},"a565d5":{"lock":false,"pos":{"x":37.4161338806152,"y":1.29711866378784,"z":74.0500869750977},"rot":{"x":0.0208095014095306,"y":269.997009277344,"z":0.0167702212929726}},"a82830":{"lock":false,"pos":{"x":53.2127723693848,"y":1.29612374305725,"z":51.0517272949219},"rot":{"x":0.0208183135837317,"y":269.966552734375,"z":0.0167590081691742}},"b22438":{"lock":false,"pos":{"x":49.5628395080566,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.0208086390048265,"y":269.999755859375,"z":0.0167711488902569}},"b36f5e":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30487859249115,"z":80.9412307739258},"rot":{"x":0.0208180472254753,"y":269.967437744141,"z":0.0167593732476234}},"b67371":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29907858371735,"z":76.3486862182617},"rot":{"x":0.0208080615848303,"y":270.000061035156,"z":0.0167700573801994}},"b6bccc":{"lock":false,"pos":{"x":53.2305870056152,"y":1.29814672470093,"z":57.9409599304199},"rot":{"x":0.020818205550313,"y":269.966644287109,"z":0.0167589131742716}},"b7efb5":{"lock":false,"pos":{"x":37.4159774780273,"y":1.2957751750946,"z":69.4607086181641},"rot":{"x":0.0208143480122089,"y":269.983032226563,"z":0.0167653001844883}},"b83784":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30622506141663,"z":85.5412216186523},"rot":{"x":0.0208180900663137,"y":269.96728515625,"z":0.016759192571044}},"c619af":{"lock":false,"pos":{"x":58.3838500976563,"y":1.30740916728973,"z":83.1903762817383},"rot":{"x":0.0208058375865221,"y":270.010040283203,"z":0.0167748834937811}},"c63ec7":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29981470108032,"z":83.2607269287109},"rot":{"x":0.0208129249513149,"y":269.9833984375,"z":0.0167638566344976}},"c6caf6":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.0208088103681803,"y":269.999969482422,"z":0.0167706534266472}},"c99da7":{"lock":false,"pos":{"x":37.4159698486328,"y":1.29442870616913,"z":64.8606719970703},"rot":{"x":0.0208094473928213,"y":269.999664306641,"z":0.0167713891714811}},"d2776c":{"lock":false,"pos":{"x":37.4159851074219,"y":1.30183446407318,"z":90.1607437133789},"rot":{"x":0.0208128597587347,"y":269.983642578125,"z":0.0167650356888771}},"d9292f":{"lock":false,"pos":{"x":37.4159851074219,"y":1.3011611700058,"z":87.8607330322266},"rot":{"x":0.0208078641444445,"y":270.000030517578,"z":0.0167708955705166}},"dac4f8":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29981470108032,"z":83.2607192993164},"rot":{"x":0.0208142288029194,"y":269.983367919922,"z":0.0167654417455196}},"dfc9b0":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30151236057281,"z":69.4412002563477},"rot":{"x":0.0208181440830231,"y":269.966918945313,"z":0.0167590621858835}},"e0906c":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208175722509623,"y":269.969482421875,"z":0.0167600810527802}},"e16d74":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29779505729675,"z":76.3607177734375},"rot":{"x":0.0208134818822145,"y":269.983367919922,"z":0.0167651697993279}},"e546c0":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30285882949829,"z":74.0412063598633},"rot":{"x":0.020818192511797,"y":269.967010498047,"z":0.0167592614889145}},"e563d5":{"lock":false,"pos":{"x":40.960205078125,"y":1.29840540885925,"z":74.0486907958984},"rot":{"x":0.0208130776882172,"y":269.984375,"z":0.0167633332312107}},"e792b0":{"lock":false,"pos":{"x":53.2284622192383,"y":1.2974728345871,"z":55.6411819458008},"rot":{"x":0.0208184160292149,"y":269.966613769531,"z":0.0167591720819473}},"eb8234":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30109834671021,"z":83.2486877441406},"rot":{"x":0.0208130814135075,"y":269.984649658203,"z":0.0167655032128096}},"ebdac9":{"lock":false,"pos":{"x":37.4159851074219,"y":1.30048799514771,"z":85.5607299804688},"rot":{"x":0.0208128336817026,"y":269.983459472656,"z":0.0167649034410715}},"ee51d8":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30353200435638,"z":76.3412017822266},"rot":{"x":0.0208180863410234,"y":269.967102050781,"z":0.0167591366916895}},"f21135":{"lock":false,"pos":{"x":58.3838424682617,"y":1.30875563621521,"z":87.7903823852539},"rot":{"x":0.0208172351121902,"y":269.970733642578,"z":0.016760315746069}},"fee183":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30177164077759,"z":85.5486907958984},"rot":{"x":0.0208129864186049,"y":269.984802246094,"z":0.0167655944824219}}}}' +LuaScriptState: '{"ml":{"00d05a":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30757141113281,"z":90.141227722168},"rot":{"x":0.0208182334899902,"y":269.967468261719,"z":0.0167592503130436}},"0988b2":{"lock":false,"pos":{"x":53.2126121520996,"y":1.29544842243195,"z":48.7452774047852},"rot":{"x":0.0208084937185049,"y":270,"z":0.0167712159454823}},"0ce7b8":{"lock":false,"pos":{"x":58.3838310241699,"y":1.3094288110733,"z":90.0903701782227},"rot":{"x":0.0208171866834164,"y":269.970916748047,"z":0.0167607441544533}},"0e459d":{"lock":false,"pos":{"x":40.9601745605469,"y":1.29571235179901,"z":64.8486557006836},"rot":{"x":0.0208127778023481,"y":269.984313964844,"z":0.0167642887681723}},"17319c":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29975187778473,"z":78.6486892700195},"rot":{"x":0.0208084955811501,"y":270.000030517578,"z":0.0167711563408375}},"20ff08":{"lock":false,"pos":{"x":53.2127799987793,"y":1.29612362384796,"z":51.0517311096191},"rot":{"x":0.0208189375698566,"y":269.966430664063,"z":0.0167580544948578}},"24621a":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30250763893127,"z":92.4607086181641},"rot":{"x":0.0208132378757,"y":269.983551025391,"z":0.0167651809751987}},"247824":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30218553543091,"z":71.7412033081055},"rot":{"x":0.0208182502537966,"y":269.966979980469,"z":0.0167591851204634}},"24a147":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29846823215485,"z":78.6607208251953},"rot":{"x":0.0208131149411201,"y":269.983489990234,"z":0.0167639367282391}},"3120e7":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638564586639,"z":67.148681640625},"rot":{"x":0.0208124630153179,"y":269.984497070313,"z":0.0167651623487473}},"348395":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30016577243805,"z":64.8410720825195},"rot":{"x":0.0208181608468294,"y":269.966796875,"z":0.0167590975761414}},"396e1c":{"lock":false,"pos":{"x":40.960205078125,"y":1.30042505264282,"z":80.9486846923828},"rot":{"x":0.0208138320595026,"y":269.984497070313,"z":0.0167657043784857}},"3feff1":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30042505264282,"z":80.9486999511719},"rot":{"x":0.0208088532090187,"y":269.998931884766,"z":0.0167707167565823}},"4287c0":{"lock":false,"pos":{"x":40.960205078125,"y":1.30244481563568,"z":87.8487014770508},"rot":{"x":0.0208128374069929,"y":269.984741210938,"z":0.0167656969279051}},"47bdba":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30083894729614,"z":67.1410827636719},"rot":{"x":0.0208084098994732,"y":270,"z":0.016771212220192}},"4abb47":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302072525024,"z":55.6492195129395},"rot":{"x":0.0208134576678276,"y":269.983947753906,"z":0.0167648550122976}},"4f33d5":{"lock":false,"pos":{"x":53.2285499572754,"y":1.29881930351257,"z":60.2411804199219},"rot":{"x":0.0208183526992798,"y":269.966705322266,"z":0.0167588628828526}},"4fe0b8":{"lock":false,"pos":{"x":37.4159812927246,"y":1.2957751750946,"z":69.4607162475586},"rot":{"x":0.0208133682608604,"y":269.983276367188,"z":0.01676294952631}},"562eb1":{"lock":false,"pos":{"x":53.2285499572754,"y":1.29949247837067,"z":62.5411796569824},"rot":{"x":0.02081816829741,"y":269.966796875,"z":0.0167590640485287}},"5792ab":{"lock":false,"pos":{"x":37.4180145263672,"y":1.29240965843201,"z":57.9605522155762},"rot":{"x":0.0208138916641474,"y":269.982788085938,"z":0.0167644936591387}},"5905a9":{"lock":false,"pos":{"x":37.4159698486328,"y":1.29442870616913,"z":64.8606796264648},"rot":{"x":0.0208133310079575,"y":269.983093261719,"z":0.0167641751468182}},"5e3a3b":{"lock":false,"pos":{"x":58.3838386535645,"y":1.30808234214783,"z":85.490364074707},"rot":{"x":0.0208087768405676,"y":269.99951171875,"z":0.016770800575614}},"62db13":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30555176734924,"z":83.2412185668945},"rot":{"x":0.0208183396607637,"y":269.967132568359,"z":0.016759330406785}},"6446d1":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29779493808746,"z":76.3607177734375},"rot":{"x":0.0208081603050232,"y":270.000061035156,"z":0.0167701542377472}},"64fcdf":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29100203514099,"z":48.7527389526367},"rot":{"x":0.0208136346191168,"y":269.983825683594,"z":0.0167646985501051}},"6c3156":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705893993378,"z":69.4486846923828},"rot":{"x":0.0208081137388945,"y":270.000122070313,"z":0.0167697854340076}},"715974":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30250763893127,"z":92.4607162475586},"rot":{"x":0.0208140052855015,"y":269.983734130859,"z":0.0167656391859055}},"74b8d4":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30689823627472,"z":87.8412246704102},"rot":{"x":0.0208181105554104,"y":269.96728515625,"z":0.0167592689394951}},"78b142":{"lock":false,"pos":{"x":53.2285919189453,"y":1.29679954051971,"z":53.3411636352539},"rot":{"x":0.0208086688071489,"y":269.999603271484,"z":0.0167710967361927}},"7cf231":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369378089905,"z":57.9485626220703},"rot":{"x":0.0208135042339563,"y":269.984008789063,"z":0.0167649891227484}},"7d133c":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30379128456116,"z":92.4487075805664},"rot":{"x":0.0208128057420254,"y":269.984741210938,"z":0.016765596345067}},"7d532d":{"lock":false,"pos":{"x":40.9602127075195,"y":1.29840540885925,"z":74.048698425293},"rot":{"x":0.0208125095814466,"y":269.984497070313,"z":0.0167653169482946}},"7e7873":{"lock":false,"pos":{"x":58.3838348388672,"y":1.30808234214783,"z":85.490348815918},"rot":{"x":0.0208086054772139,"y":270.000061035156,"z":0.0167713463306427}},"7fda7e":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29638564586639,"z":67.1486663818359},"rot":{"x":0.0208138152956963,"y":269.984161376953,"z":0.0167658906430006}},"8b39e9":{"lock":false,"pos":{"x":37.4159774780273,"y":1.30183446407318,"z":90.1607360839844},"rot":{"x":0.0208129081875086,"y":269.983825683594,"z":0.0167639795690775}},"8bb57d":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3082447052002,"z":92.4412155151367},"rot":{"x":0.0208181627094746,"y":269.967468261719,"z":0.0167594067752361}},"916f1c":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29308223724365,"z":60.2607727050781},"rot":{"x":0.0208141002804041,"y":269.983032226563,"z":0.0167645085602999}},"946958":{"lock":false,"pos":{"x":58.3838310241699,"y":1.31010210514069,"z":92.3903579711914},"rot":{"x":0.0208172332495451,"y":269.970642089844,"z":0.0167605299502611}},"971d52":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436600208282,"z":60.2487869262695},"rot":{"x":0.0208088457584381,"y":270,"z":0.0167705751955509}},"98aa6a":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.02081348747015,"y":269.983856201172,"z":0.0167647656053305}},"9a5782":{"lock":false,"pos":{"x":40.9601783752441,"y":1.29503917694092,"z":62.5487480163574},"rot":{"x":0.0208092462271452,"y":269.998931884766,"z":0.0167704205960035}},"9bee5a":{"lock":false,"pos":{"x":49.5628509521484,"y":1.30691683292389,"z":92.4527969360352},"rot":{"x":0.0208184774965048,"y":269.966369628906,"z":0.0167590323835611}},"9f2514":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30606257915497,"z":78.5903549194336},"rot":{"x":0.020817106589675,"y":269.970458984375,"z":0.0167604554444551}},"9f8a0a":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208139251917601,"y":269.984252929688,"z":0.0167657993733883}},"a0b9a7":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30083894729614,"z":67.1410827636719},"rot":{"x":0.020818779245019,"y":269.966888427734,"z":0.0167595278471708}},"a26795":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30311810970306,"z":90.1487121582031},"rot":{"x":0.0208129994571209,"y":269.984710693359,"z":0.0167658068239689}},"a268ef":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30420517921448,"z":78.641227722168},"rot":{"x":0.0208183471113443,"y":269.967163085938,"z":0.0167591217905283}},"a283b4":{"lock":false,"pos":{"x":40.9634170532227,"y":1.29369378089905,"z":57.948558807373},"rot":{"x":0.0208131521940231,"y":269.98388671875,"z":0.0167651418596506}},"a565d5":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29644846916199,"z":71.7607192993164},"rot":{"x":0.0208089035004377,"y":269.997039794922,"z":0.0167698636651039}},"a82830":{"lock":false,"pos":{"x":53.2127723693848,"y":1.29612350463867,"z":51.0517272949219},"rot":{"x":0.0208185166120529,"y":269.966552734375,"z":0.0167589914053679}},"b22438":{"lock":false,"pos":{"x":49.5628395080566,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.0208085812628269,"y":269.999755859375,"z":0.0167711209505796}},"b36f5e":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30487847328186,"z":80.9412307739258},"rot":{"x":0.0208181608468294,"y":269.967437744141,"z":0.0167594142258167}},"b67371":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29840540885925,"z":74.0486907958984},"rot":{"x":0.0208081603050232,"y":270.000152587891,"z":0.0167698673903942}},"b6bccc":{"lock":false,"pos":{"x":53.2305870056152,"y":1.29814672470093,"z":57.9409599304199},"rot":{"x":0.0208184570074081,"y":269.966644287109,"z":0.0167590826749802}},"b7efb5":{"lock":false,"pos":{"x":37.4159698486328,"y":1.29510200023651,"z":67.1606826782227},"rot":{"x":0.0208132714033127,"y":269.983093261719,"z":0.016763724386692}},"b83784":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30622494220734,"z":85.5412216186523},"rot":{"x":0.0208179820328951,"y":269.96728515625,"z":0.0167592577636242}},"c619af":{"lock":false,"pos":{"x":58.3838500976563,"y":1.30740904808044,"z":83.1903762817383},"rot":{"x":0.0208054166287184,"y":270.010040283203,"z":0.0167748387902975}},"c63ec7":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29914140701294,"z":80.9607238769531},"rot":{"x":0.0208130665123463,"y":269.983459472656,"z":0.0167638715356588}},"c6caf6":{"lock":false,"pos":{"x":40.9634208679199,"y":1.2916773557663,"z":51.0597610473633},"rot":{"x":0.0208088364452124,"y":269.999938964844,"z":0.0167705696076155}},"c99da7":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29375553131104,"z":62.5607719421387},"rot":{"x":0.0208090208470821,"y":269.999664306641,"z":0.0167704652994871}},"d2776c":{"lock":false,"pos":{"x":37.4159851074219,"y":1.3011611700058,"z":87.8607330322266},"rot":{"x":0.0208129342645407,"y":269.983673095703,"z":0.0167639367282391}},"d9292f":{"lock":false,"pos":{"x":37.4159851074219,"y":1.30048787593842,"z":85.5607299804688},"rot":{"x":0.0208081472665071,"y":270.000061035156,"z":0.0167699698358774}},"dac4f8":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29981470108032,"z":83.2607192993164},"rot":{"x":0.0208142288029194,"y":269.983367919922,"z":0.0167654417455196}},"dfc9b0":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30151224136353,"z":69.4412002563477},"rot":{"x":0.020818255841732,"y":269.966918945313,"z":0.0167592223733664}},"e0906c":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208175536245108,"y":269.969482421875,"z":0.0167600251734257}},"e16d74":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29712176322937,"z":74.0607223510742},"rot":{"x":0.0208130702376366,"y":269.983428955078,"z":0.016764011234045}},"e546c0":{"lock":false,"pos":{"x":53.2285537719727,"y":1.302858710289,"z":74.0412063598633},"rot":{"x":0.0208181105554104,"y":269.967010498047,"z":0.0167591851204634}},"e563d5":{"lock":false,"pos":{"x":40.960205078125,"y":1.29773211479187,"z":71.7486877441406},"rot":{"x":0.0208127610385418,"y":269.984436035156,"z":0.0167644359171391}},"e792b0":{"lock":false,"pos":{"x":53.2284622192383,"y":1.29747271537781,"z":55.6411819458008},"rot":{"x":0.0208183005452156,"y":269.966613769531,"z":0.0167589858174324}},"eb8234":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30109834671021,"z":83.2486877441406},"rot":{"x":0.0208130199462175,"y":269.984649658203,"z":0.0167654640972614}},"ebdac9":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29981470108032,"z":83.2607269287109},"rot":{"x":0.020813062787056,"y":269.983520507813,"z":0.0167639125138521}},"ee51d8":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30353200435638,"z":76.3412017822266},"rot":{"x":0.020817968994379,"y":269.967102050781,"z":0.016759192571044}},"f21135":{"lock":false,"pos":{"x":58.3838424682617,"y":1.30875563621521,"z":87.7903823852539},"rot":{"x":0.0208170972764492,"y":269.970733642578,"z":0.0167604349553585}},"fc709b":{"lock":false,"pos":{"x":40.960205078125,"y":1.29907858371735,"z":76.3486938476563},"rot":{"x":0.0208161808550358,"y":269.972229003906,"z":0.0167608987540007}},"fee183":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30177164077759,"z":85.5486907958984},"rot":{"x":0.0208130870014429,"y":269.984802246094,"z":0.016765758395195}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Blood Pact fc709b.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Blood Pact fc709b.yaml new file mode 100644 index 000000000..4bf47aae7 --- /dev/null +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Blood Pact fc709b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232106 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fc709b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blood Pact +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 40.96 + posY: 1.3 + posZ: 76.35 + rotX: 0.02 + rotY: 269.97 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Clairvoyance b67371.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Clairvoyance b67371.yaml index 326e01657..f98324548 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Clairvoyance b67371.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Clairvoyance b67371.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.3 - posZ: 76.35 + posZ: 74.05 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Clarity of Mind e563d5.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Clarity of Mind e563d5.yaml index f8e8b0672..6fc0fc73a 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Clarity of Mind e563d5.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Clarity of Mind e563d5.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.3 - posZ: 74.05 + posZ: 71.75 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Crystal Pendulum 6c3156.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Crystal Pendulum 6c3156.yaml index 4d095d4f9..3c16e7ed1 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Crystal Pendulum 6c3156.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Crystal Pendulum 6c3156.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.3 - posZ: 71.75 + posZ: 69.45 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card David Renfield 3120e7.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card David Renfield 3120e7.yaml index af01e0eca..4e97165ee 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card David Renfield 3120e7.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card David Renfield 3120e7.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.3 - posZ: 69.45 + posZ: 67.15 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Enchanted Blade 0e459d.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Enchanted Blade 0e459d.yaml index 3dfd412e2..c7080c2f1 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Enchanted Blade 0e459d.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Enchanted Blade 0e459d.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.3 - posZ: 67.15 + posZ: 64.85 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Eye of Chaos 9a5782.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Eye of Chaos 9a5782.yaml index 67e84c297..9cb0e780d 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Eye of Chaos 9a5782.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Eye of Chaos 9a5782.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.3 - posZ: 64.85 + posZ: 62.55 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Familiar Spirit 971d52.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Familiar Spirit 971d52.yaml index f10fa8c0d..6b3212931 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Familiar Spirit 971d52.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Familiar Spirit 971d52.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 40.96 - posY: 1.3 - posZ: 62.55 + posY: 1.29 + posZ: 60.25 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Forbidden Knowledge 7cf231.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Forbidden Knowledge 7cf231.yaml index acf35a4a8..bf3b7ae7a 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Forbidden Knowledge 7cf231.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Forbidden Knowledge 7cf231.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.29 - posZ: 60.25 + posZ: 57.95 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Healing Words 4abb47.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Healing Words 4abb47.yaml index 0427df81f..9071d5627 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Healing Words 4abb47.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Healing Words 4abb47.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.29 - posZ: 57.95 + posZ: 55.65 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Holy Rosary 98aa6a.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Holy Rosary 98aa6a.yaml index 2a7661930..38bd45126 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Holy Rosary 98aa6a.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Holy Rosary 98aa6a.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.29 - posZ: 55.65 + posZ: 53.35 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Ineffable Truth c6caf6.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Ineffable Truth c6caf6.yaml index b9f185437..8001bb990 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Ineffable Truth c6caf6.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Ineffable Truth c6caf6.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.29 - posZ: 53.35 + posZ: 51.06 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Mists of R'lyeh 64fcdf.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Mists of R'lyeh 64fcdf.yaml index 19dc707f5..0ed06a904 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Mists of R'lyeh 64fcdf.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Mists of R'lyeh 64fcdf.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.96 posY: 1.29 - posZ: 51.06 + posZ: 48.75 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Olive McBride 715974.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Olive McBride 715974.yaml index b7fdf504e..69d6ef306 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Olive McBride 715974.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Olive McBride 715974.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 40.96 - posY: 1.29 - posZ: 48.75 + posX: 37.42 + posY: 1.3 + posZ: 92.46 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Rite of Seeking 8b39e9.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Rite of Seeking 8b39e9.yaml index eaf4b768a..964aade70 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Rite of Seeking 8b39e9.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Rite of Seeking 8b39e9.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 92.46 + posZ: 90.16 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Ritual Candles d2776c.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Ritual Candles d2776c.yaml index 0c0b6649d..a12c272d0 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Ritual Candles d2776c.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Ritual Candles d2776c.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 90.16 + posZ: 87.86 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Robes of Endless Night d9292f.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Robes of Endless Night d9292f.yaml index 2acd56961..0d8e6102e 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Robes of Endless Night d9292f.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Robes of Endless Night d9292f.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 87.86 + posZ: 85.56 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scroll of Prophecies ebdac9.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scroll of Prophecies ebdac9.yaml index 15dbf3f0e..6c5ce4df6 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scroll of Prophecies ebdac9.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scroll of Prophecies ebdac9.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 85.56 + posZ: 83.26 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scroll of Secrets c63ec7.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scroll of Secrets c63ec7.yaml index c6a99e0fd..0ef97bbe8 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scroll of Secrets c63ec7.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scroll of Secrets c63ec7.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 83.26 + posZ: 80.96 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scrying 24a147.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scrying 24a147.yaml index 3b0ae411e..430f4bd60 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scrying 24a147.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scrying 24a147.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 80.96 + posZ: 78.66 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scrying Mirror 6446d1.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scrying Mirror 6446d1.yaml index 3287cc863..fba3420ee 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scrying Mirror 6446d1.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Scrying Mirror 6446d1.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 78.66 + posZ: 76.36 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Shrivelling e16d74.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Shrivelling e16d74.yaml index 24f966dc3..4c20ad45f 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Shrivelling e16d74.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Shrivelling e16d74.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 76.36 + posZ: 74.06 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Shroud of Shadows a565d5.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Shroud of Shadows a565d5.yaml index da0df8dc7..eb4dc45fc 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Shroud of Shadows a565d5.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Shroud of Shadows a565d5.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 74.05 + posZ: 71.76 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sign Magick 4fe0b8.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sign Magick 4fe0b8.yaml index 509fc8af4..178fa4d54 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sign Magick 4fe0b8.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sign Magick 4fe0b8.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 71.76 + posZ: 69.46 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sixth Sense b7efb5.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sixth Sense b7efb5.yaml index e5fbf5550..4226dd8d8 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sixth Sense b7efb5.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sixth Sense b7efb5.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.3 - posZ: 69.46 + posZ: 67.16 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card St. Hubert's Key 5905a9.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card St. Hubert's Key 5905a9.yaml index 709208e55..4f56c8c3e 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card St. Hubert's Key 5905a9.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card St. Hubert's Key 5905a9.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 37.42 - posY: 1.3 - posZ: 67.16 + posY: 1.29 + posZ: 64.86 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sword Cane c99da7.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sword Cane c99da7.yaml index a8387b0a7..88c24deff 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sword Cane c99da7.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Sword Cane c99da7.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.29 - posZ: 64.86 + posZ: 62.56 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card The Chthonian Stone 916f1c.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card The Chthonian Stone 916f1c.yaml index 3204c06ec..1e4fa5d0c 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card The Chthonian Stone 916f1c.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card The Chthonian Stone 916f1c.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.29 - posZ: 62.56 + posZ: 60.26 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Wither 5792ab.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Wither 5792ab.yaml index a20dc49ef..364ab89b9 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Wither 5792ab.yaml +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Card Wither 5792ab.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 37.42 posY: 1.29 - posZ: 60.26 + posZ: 57.96 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99.ttslua b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.ttslua similarity index 96% rename from unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99.ttslua rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic 2c2b99.ttslua +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.yaml new file mode 100644 index 000000000..01ac6c17a --- /dev/null +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.yaml @@ -0,0 +1,119 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag Mystic 17e533/Card Blood Pact fc709b.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Blinding Light 00d05a.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Voice of Ra 0988b2.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Enraptured 0ce7b8.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Enchanted Blade 0e459d.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Azure Flame 17319c.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Moonlight Ritual 247824.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Scrying 24a147.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card David Renfield 3120e7.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Premonition 348395.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Armageddon 3feff1.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Arcane Initiate 4287c0.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Parallel Fates 47bdba.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Healing Words 4abb47.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Read the Signs 4f33d5.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Sign Magick 4fe0b8.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Quantum Flux 562eb1.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Wither 5792ab.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card St. Hubert''s Key 5905a9.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Deny Existence 62db13.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Scrying Mirror 6446d1.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Mists of R''lyeh 64fcdf.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Crystal Pendulum 6c3156.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Olive McBride 715974.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Dark Prophecy 74b8d4.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Tides of Fate 78b142.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Forbidden Knowledge 7cf231.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Alchemical Transmutation 7d133c.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Prescient 7e7873.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Rite of Seeking 8b39e9.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Astral Travel 8bb57d.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card The Chthonian Stone 916f1c.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Defiance 946958.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Familiar Spirit 971d52.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Holy Rosary 98aa6a.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Eye of Chaos 9a5782.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Ward of Protection 9bee5a.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Torrent of Power 9f2514.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Alyssa Graham a26795.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Eldritch Inspiration a268ef.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Shroud of Shadows a565d5.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Uncage the Soul a82830.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Ward of Radiance b22438.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Drawn to the Flame b36f5e.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Clairvoyance b67371.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Spectral Razor b6bccc.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Sixth Sense b7efb5.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Delve too Deep b83784.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Promise of Power c619af.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Scroll of Secrets c63ec7.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Ineffable Truth c6caf6.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Sword Cane c99da7.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Ritual Candles d2776c.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Robes of Endless Night d9292f.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Open Gate dfc9b0.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Prophesy e0906c.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Shrivelling e16d74.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Hypnotic Gaze e546c0.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Clarity of Mind e563d5.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Storm of Spirits e792b0.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Arcane Studies eb8234.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Scroll of Prophecies ebdac9.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Ethereal Form ee51d8.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Fearless f21135.yaml' +- !include 'Custom_Model_Bag Mystic 17e533/Card Arcane Research fee183.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516557267/757887224F6C37104CDFFE241FAD09B57117D670/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 17e533 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Mystic 17e533.ttslua' +LuaScriptState: '{"ml":{"00d05a":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30757141113281,"z":90.141227722168},"rot":{"x":0.0208182334899902,"y":269.967468261719,"z":0.0167592503130436}},"0988b2":{"lock":false,"pos":{"x":53.2126121520996,"y":1.29544842243195,"z":48.7452774047852},"rot":{"x":0.0208084937185049,"y":270,"z":0.0167712159454823}},"0ce7b8":{"lock":false,"pos":{"x":58.3838310241699,"y":1.3094288110733,"z":90.0903701782227},"rot":{"x":0.0208171866834164,"y":269.970916748047,"z":0.0167607441544533}},"0e459d":{"lock":false,"pos":{"x":40.9601745605469,"y":1.29571235179901,"z":64.8486557006836},"rot":{"x":0.0208127778023481,"y":269.984313964844,"z":0.0167642887681723}},"17319c":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29975187778473,"z":78.6486892700195},"rot":{"x":0.0208084955811501,"y":270.000030517578,"z":0.0167711563408375}},"20ff08":{"lock":false,"pos":{"x":53.2127799987793,"y":1.29612362384796,"z":51.0517311096191},"rot":{"x":0.0208189375698566,"y":269.966430664063,"z":0.0167580544948578}},"24621a":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30250763893127,"z":92.4607086181641},"rot":{"x":0.0208132378757,"y":269.983551025391,"z":0.0167651809751987}},"247824":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30218553543091,"z":71.7412033081055},"rot":{"x":0.0208182502537966,"y":269.966979980469,"z":0.0167591851204634}},"24a147":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29846823215485,"z":78.6607208251953},"rot":{"x":0.0208131149411201,"y":269.983489990234,"z":0.0167639367282391}},"3120e7":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638564586639,"z":67.148681640625},"rot":{"x":0.0208124630153179,"y":269.984497070313,"z":0.0167651623487473}},"348395":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30016577243805,"z":64.8410720825195},"rot":{"x":0.0208181608468294,"y":269.966796875,"z":0.0167590975761414}},"396e1c":{"lock":false,"pos":{"x":40.960205078125,"y":1.30042505264282,"z":80.9486846923828},"rot":{"x":0.0208138320595026,"y":269.984497070313,"z":0.0167657043784857}},"3feff1":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30042505264282,"z":80.9486999511719},"rot":{"x":0.0208088532090187,"y":269.998931884766,"z":0.0167707167565823}},"4287c0":{"lock":false,"pos":{"x":40.960205078125,"y":1.30244481563568,"z":87.8487014770508},"rot":{"x":0.0208128374069929,"y":269.984741210938,"z":0.0167656969279051}},"47bdba":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30083894729614,"z":67.1410827636719},"rot":{"x":0.0208084098994732,"y":270,"z":0.016771212220192}},"4abb47":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302072525024,"z":55.6492195129395},"rot":{"x":0.0208134576678276,"y":269.983947753906,"z":0.0167648550122976}},"4f33d5":{"lock":false,"pos":{"x":53.2285499572754,"y":1.29881930351257,"z":60.2411804199219},"rot":{"x":0.0208183526992798,"y":269.966705322266,"z":0.0167588628828526}},"4fe0b8":{"lock":false,"pos":{"x":37.4159812927246,"y":1.2957751750946,"z":69.4607162475586},"rot":{"x":0.0208133682608604,"y":269.983276367188,"z":0.01676294952631}},"562eb1":{"lock":false,"pos":{"x":53.2285499572754,"y":1.29949247837067,"z":62.5411796569824},"rot":{"x":0.02081816829741,"y":269.966796875,"z":0.0167590640485287}},"5792ab":{"lock":false,"pos":{"x":37.4180145263672,"y":1.29240965843201,"z":57.9605522155762},"rot":{"x":0.0208138916641474,"y":269.982788085938,"z":0.0167644936591387}},"5905a9":{"lock":false,"pos":{"x":37.4159698486328,"y":1.29442870616913,"z":64.8606796264648},"rot":{"x":0.0208133310079575,"y":269.983093261719,"z":0.0167641751468182}},"5e3a3b":{"lock":false,"pos":{"x":58.3838386535645,"y":1.30808234214783,"z":85.490364074707},"rot":{"x":0.0208087768405676,"y":269.99951171875,"z":0.016770800575614}},"62db13":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30555176734924,"z":83.2412185668945},"rot":{"x":0.0208183396607637,"y":269.967132568359,"z":0.016759330406785}},"6446d1":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29779493808746,"z":76.3607177734375},"rot":{"x":0.0208081603050232,"y":270.000061035156,"z":0.0167701542377472}},"64fcdf":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29100203514099,"z":48.7527389526367},"rot":{"x":0.0208136346191168,"y":269.983825683594,"z":0.0167646985501051}},"6c3156":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705893993378,"z":69.4486846923828},"rot":{"x":0.0208081137388945,"y":270.000122070313,"z":0.0167697854340076}},"715974":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30250763893127,"z":92.4607162475586},"rot":{"x":0.0208140052855015,"y":269.983734130859,"z":0.0167656391859055}},"74b8d4":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30689823627472,"z":87.8412246704102},"rot":{"x":0.0208181105554104,"y":269.96728515625,"z":0.0167592689394951}},"78b142":{"lock":false,"pos":{"x":53.2285919189453,"y":1.29679954051971,"z":53.3411636352539},"rot":{"x":0.0208086688071489,"y":269.999603271484,"z":0.0167710967361927}},"7cf231":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369378089905,"z":57.9485626220703},"rot":{"x":0.0208135042339563,"y":269.984008789063,"z":0.0167649891227484}},"7d133c":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30379128456116,"z":92.4487075805664},"rot":{"x":0.0208128057420254,"y":269.984741210938,"z":0.016765596345067}},"7d532d":{"lock":false,"pos":{"x":40.9602127075195,"y":1.29840540885925,"z":74.048698425293},"rot":{"x":0.0208125095814466,"y":269.984497070313,"z":0.0167653169482946}},"7e7873":{"lock":false,"pos":{"x":58.3838348388672,"y":1.30808234214783,"z":85.490348815918},"rot":{"x":0.0208086054772139,"y":270.000061035156,"z":0.0167713463306427}},"7fda7e":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29638564586639,"z":67.1486663818359},"rot":{"x":0.0208138152956963,"y":269.984161376953,"z":0.0167658906430006}},"8b39e9":{"lock":false,"pos":{"x":37.4159774780273,"y":1.30183446407318,"z":90.1607360839844},"rot":{"x":0.0208129081875086,"y":269.983825683594,"z":0.0167639795690775}},"8bb57d":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3082447052002,"z":92.4412155151367},"rot":{"x":0.0208181627094746,"y":269.967468261719,"z":0.0167594067752361}},"916f1c":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29308223724365,"z":60.2607727050781},"rot":{"x":0.0208141002804041,"y":269.983032226563,"z":0.0167645085602999}},"946958":{"lock":false,"pos":{"x":58.3838310241699,"y":1.31010210514069,"z":92.3903579711914},"rot":{"x":0.0208172332495451,"y":269.970642089844,"z":0.0167605299502611}},"971d52":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436600208282,"z":60.2487869262695},"rot":{"x":0.0208088457584381,"y":270,"z":0.0167705751955509}},"98aa6a":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.02081348747015,"y":269.983856201172,"z":0.0167647656053305}},"9a5782":{"lock":false,"pos":{"x":40.9601783752441,"y":1.29503917694092,"z":62.5487480163574},"rot":{"x":0.0208092462271452,"y":269.998931884766,"z":0.0167704205960035}},"9bee5a":{"lock":false,"pos":{"x":49.5628509521484,"y":1.30691683292389,"z":92.4527969360352},"rot":{"x":0.0208184774965048,"y":269.966369628906,"z":0.0167590323835611}},"9f2514":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30606257915497,"z":78.5903549194336},"rot":{"x":0.020817106589675,"y":269.970458984375,"z":0.0167604554444551}},"9f8a0a":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208139251917601,"y":269.984252929688,"z":0.0167657993733883}},"a0b9a7":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30083894729614,"z":67.1410827636719},"rot":{"x":0.020818779245019,"y":269.966888427734,"z":0.0167595278471708}},"a26795":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30311810970306,"z":90.1487121582031},"rot":{"x":0.0208129994571209,"y":269.984710693359,"z":0.0167658068239689}},"a268ef":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30420517921448,"z":78.641227722168},"rot":{"x":0.0208183471113443,"y":269.967163085938,"z":0.0167591217905283}},"a283b4":{"lock":false,"pos":{"x":40.9634170532227,"y":1.29369378089905,"z":57.948558807373},"rot":{"x":0.0208131521940231,"y":269.98388671875,"z":0.0167651418596506}},"a565d5":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29644846916199,"z":71.7607192993164},"rot":{"x":0.0208089035004377,"y":269.997039794922,"z":0.0167698636651039}},"a82830":{"lock":false,"pos":{"x":53.2127723693848,"y":1.29612350463867,"z":51.0517272949219},"rot":{"x":0.0208185166120529,"y":269.966552734375,"z":0.0167589914053679}},"b22438":{"lock":false,"pos":{"x":49.5628395080566,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.0208085812628269,"y":269.999755859375,"z":0.0167711209505796}},"b36f5e":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30487847328186,"z":80.9412307739258},"rot":{"x":0.0208181608468294,"y":269.967437744141,"z":0.0167594142258167}},"b67371":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29840540885925,"z":74.0486907958984},"rot":{"x":0.0208081603050232,"y":270.000152587891,"z":0.0167698673903942}},"b6bccc":{"lock":false,"pos":{"x":53.2305870056152,"y":1.29814672470093,"z":57.9409599304199},"rot":{"x":0.0208184570074081,"y":269.966644287109,"z":0.0167590826749802}},"b7efb5":{"lock":false,"pos":{"x":37.4159698486328,"y":1.29510200023651,"z":67.1606826782227},"rot":{"x":0.0208132714033127,"y":269.983093261719,"z":0.016763724386692}},"b83784":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30622494220734,"z":85.5412216186523},"rot":{"x":0.0208179820328951,"y":269.96728515625,"z":0.0167592577636242}},"c619af":{"lock":false,"pos":{"x":58.3838500976563,"y":1.30740904808044,"z":83.1903762817383},"rot":{"x":0.0208054166287184,"y":270.010040283203,"z":0.0167748387902975}},"c63ec7":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29914140701294,"z":80.9607238769531},"rot":{"x":0.0208130665123463,"y":269.983459472656,"z":0.0167638715356588}},"c6caf6":{"lock":false,"pos":{"x":40.9634208679199,"y":1.2916773557663,"z":51.0597610473633},"rot":{"x":0.0208088364452124,"y":269.999938964844,"z":0.0167705696076155}},"c99da7":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29375553131104,"z":62.5607719421387},"rot":{"x":0.0208090208470821,"y":269.999664306641,"z":0.0167704652994871}},"d2776c":{"lock":false,"pos":{"x":37.4159851074219,"y":1.3011611700058,"z":87.8607330322266},"rot":{"x":0.0208129342645407,"y":269.983673095703,"z":0.0167639367282391}},"d9292f":{"lock":false,"pos":{"x":37.4159851074219,"y":1.30048787593842,"z":85.5607299804688},"rot":{"x":0.0208081472665071,"y":270.000061035156,"z":0.0167699698358774}},"dac4f8":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29981470108032,"z":83.2607192993164},"rot":{"x":0.0208142288029194,"y":269.983367919922,"z":0.0167654417455196}},"dfc9b0":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30151224136353,"z":69.4412002563477},"rot":{"x":0.020818255841732,"y":269.966918945313,"z":0.0167592223733664}},"e0906c":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208175536245108,"y":269.969482421875,"z":0.0167600251734257}},"e16d74":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29712176322937,"z":74.0607223510742},"rot":{"x":0.0208130702376366,"y":269.983428955078,"z":0.016764011234045}},"e546c0":{"lock":false,"pos":{"x":53.2285537719727,"y":1.302858710289,"z":74.0412063598633},"rot":{"x":0.0208181105554104,"y":269.967010498047,"z":0.0167591851204634}},"e563d5":{"lock":false,"pos":{"x":40.960205078125,"y":1.29773211479187,"z":71.7486877441406},"rot":{"x":0.0208127610385418,"y":269.984436035156,"z":0.0167644359171391}},"e792b0":{"lock":false,"pos":{"x":53.2284622192383,"y":1.29747271537781,"z":55.6411819458008},"rot":{"x":0.0208183005452156,"y":269.966613769531,"z":0.0167589858174324}},"eb8234":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30109834671021,"z":83.2486877441406},"rot":{"x":0.0208130199462175,"y":269.984649658203,"z":0.0167654640972614}},"ebdac9":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29981470108032,"z":83.2607269287109},"rot":{"x":0.020813062787056,"y":269.983520507813,"z":0.0167639125138521}},"ee51d8":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30353200435638,"z":76.3412017822266},"rot":{"x":0.020817968994379,"y":269.967102050781,"z":0.016759192571044}},"f21135":{"lock":false,"pos":{"x":58.3838424682617,"y":1.30875563621521,"z":87.7903823852539},"rot":{"x":0.0208170972764492,"y":269.970733642578,"z":0.0167604349553585}},"fc709b":{"lock":false,"pos":{"x":40.960205078125,"y":1.29907858371735,"z":76.3486938476563},"rot":{"x":0.0208161808550358,"y":269.972229003906,"z":0.0167608987540007}},"fee183":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30177164077759,"z":85.5486907958984},"rot":{"x":0.0208130870014429,"y":269.984802246094,"z":0.016765758395195}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Mystic +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.58 + posY: 1.66 + posZ: 59.68 + rotX: 0.02 + rotY: 270.02 + rotZ: 0.02 + scaleX: 1.2 + scaleY: 1.2 + scaleZ: 1.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Alchemical Transmutation 7d133c.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Alchemical Transmutation 7d133c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Alchemical Transmutation 7d133c.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Alchemical Transmutation 7d133c.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Alyssa Graham a26795.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Alyssa Graham a26795.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Alyssa Graham a26795.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Alyssa Graham a26795.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Arcane Initiate 4287c0.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Arcane Initiate 4287c0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Arcane Initiate 4287c0.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Arcane Initiate 4287c0.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Arcane Research fee183.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Arcane Research fee183.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Arcane Research fee183.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Arcane Research fee183.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Arcane Studies eb8234.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Arcane Studies eb8234.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Arcane Studies eb8234.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Arcane Studies eb8234.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Armageddon 3feff1.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Armageddon 3feff1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Armageddon 3feff1.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Armageddon 3feff1.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Astral Travel 8bb57d.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Astral Travel 8bb57d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Astral Travel 8bb57d.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Astral Travel 8bb57d.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Azure Flame 17319c.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Azure Flame 17319c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Azure Flame 17319c.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Azure Flame 17319c.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Blinding Light 00d05a.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Blinding Light 00d05a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Blinding Light 00d05a.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Blinding Light 00d05a.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Blood Pact fc709b.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Blood Pact fc709b.yaml new file mode 100644 index 000000000..922c3a9ad --- /dev/null +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Blood Pact fc709b.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232106 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fc709b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blood Pact +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.59 + posY: 1.41 + posZ: 59.68 + rotX: 0.02 + rotY: 269.97 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Clairvoyance b67371.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Clairvoyance b67371.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Clairvoyance b67371.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Clairvoyance b67371.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Clarity of Mind e563d5.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Clarity of Mind e563d5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Clarity of Mind e563d5.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Clarity of Mind e563d5.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Crystal Pendulum 6c3156.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Crystal Pendulum 6c3156.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Crystal Pendulum 6c3156.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Crystal Pendulum 6c3156.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Dark Prophecy 74b8d4.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Dark Prophecy 74b8d4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Dark Prophecy 74b8d4.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Dark Prophecy 74b8d4.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card David Renfield 3120e7.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card David Renfield 3120e7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card David Renfield 3120e7.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card David Renfield 3120e7.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Defiance 946958.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Defiance 946958.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Defiance 946958.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Defiance 946958.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Delve too Deep b83784.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Delve too Deep b83784.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Delve too Deep b83784.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Delve too Deep b83784.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Deny Existence 62db13.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Deny Existence 62db13.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Deny Existence 62db13.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Deny Existence 62db13.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Drawn to the Flame b36f5e.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Drawn to the Flame b36f5e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Drawn to the Flame b36f5e.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Drawn to the Flame b36f5e.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Eldritch Inspiration a268ef.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Eldritch Inspiration a268ef.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Eldritch Inspiration a268ef.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Eldritch Inspiration a268ef.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Enchanted Blade 0e459d.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Enchanted Blade 0e459d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Enchanted Blade 0e459d.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Enchanted Blade 0e459d.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Enraptured 0ce7b8.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Enraptured 0ce7b8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Enraptured 0ce7b8.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Enraptured 0ce7b8.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Ethereal Form ee51d8.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Ethereal Form ee51d8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Ethereal Form ee51d8.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Ethereal Form ee51d8.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Eye of Chaos 9a5782.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Eye of Chaos 9a5782.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Eye of Chaos 9a5782.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Eye of Chaos 9a5782.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Familiar Spirit 971d52.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Familiar Spirit 971d52.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Familiar Spirit 971d52.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Familiar Spirit 971d52.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Fearless f21135.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Fearless f21135.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Fearless f21135.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Fearless f21135.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Forbidden Knowledge 7cf231.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Forbidden Knowledge 7cf231.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Forbidden Knowledge 7cf231.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Forbidden Knowledge 7cf231.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Healing Words 4abb47.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Healing Words 4abb47.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Healing Words 4abb47.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Healing Words 4abb47.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Holy Rosary 98aa6a.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Holy Rosary 98aa6a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Holy Rosary 98aa6a.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Holy Rosary 98aa6a.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Hypnotic Gaze e546c0.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Hypnotic Gaze e546c0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Hypnotic Gaze e546c0.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Hypnotic Gaze e546c0.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Ineffable Truth c6caf6.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Ineffable Truth c6caf6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Ineffable Truth c6caf6.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Ineffable Truth c6caf6.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Mists of R'lyeh 64fcdf.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Mists of R'lyeh 64fcdf.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Mists of R'lyeh 64fcdf.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Mists of R'lyeh 64fcdf.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Moonlight Ritual 247824.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Moonlight Ritual 247824.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Moonlight Ritual 247824.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Moonlight Ritual 247824.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Olive McBride 715974.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Olive McBride 715974.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Olive McBride 715974.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Olive McBride 715974.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Open Gate dfc9b0.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Open Gate dfc9b0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Open Gate dfc9b0.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Open Gate dfc9b0.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Parallel Fates 47bdba.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Parallel Fates 47bdba.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Parallel Fates 47bdba.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Parallel Fates 47bdba.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Premonition 348395.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Premonition 348395.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Premonition 348395.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Premonition 348395.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Prescient 7e7873.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Prescient 7e7873.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Prescient 7e7873.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Prescient 7e7873.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Promise of Power c619af.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Promise of Power c619af.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Promise of Power c619af.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Promise of Power c619af.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Prophesy e0906c.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Prophesy e0906c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Prophesy e0906c.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Prophesy e0906c.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Quantum Flux 562eb1.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Quantum Flux 562eb1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Quantum Flux 562eb1.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Quantum Flux 562eb1.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Read the Signs 4f33d5.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Read the Signs 4f33d5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Read the Signs 4f33d5.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Read the Signs 4f33d5.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Rite of Seeking 8b39e9.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Rite of Seeking 8b39e9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Rite of Seeking 8b39e9.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Rite of Seeking 8b39e9.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Ritual Candles d2776c.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Ritual Candles d2776c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Ritual Candles d2776c.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Ritual Candles d2776c.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Robes of Endless Night d9292f.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Robes of Endless Night d9292f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Robes of Endless Night d9292f.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Robes of Endless Night d9292f.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Scroll of Prophecies ebdac9.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Scroll of Prophecies ebdac9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Scroll of Prophecies ebdac9.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Scroll of Prophecies ebdac9.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Scroll of Secrets c63ec7.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Scroll of Secrets c63ec7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Scroll of Secrets c63ec7.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Scroll of Secrets c63ec7.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Scrying 24a147.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Scrying 24a147.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Scrying 24a147.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Scrying 24a147.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Scrying Mirror 6446d1.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Scrying Mirror 6446d1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Scrying Mirror 6446d1.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Scrying Mirror 6446d1.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Shrivelling e16d74.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Shrivelling e16d74.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Shrivelling e16d74.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Shrivelling e16d74.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Shroud of Shadows a565d5.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Shroud of Shadows a565d5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Shroud of Shadows a565d5.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Shroud of Shadows a565d5.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Sign Magick 4fe0b8.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Sign Magick 4fe0b8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Sign Magick 4fe0b8.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Sign Magick 4fe0b8.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Sixth Sense b7efb5.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Sixth Sense b7efb5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Sixth Sense b7efb5.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Sixth Sense b7efb5.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Spectral Razor b6bccc.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Spectral Razor b6bccc.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Spectral Razor b6bccc.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Spectral Razor b6bccc.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card St. Hubert's Key 5905a9.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card St. Hubert's Key 5905a9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card St. Hubert's Key 5905a9.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card St. Hubert's Key 5905a9.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Storm of Spirits e792b0.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Storm of Spirits e792b0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Storm of Spirits e792b0.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Storm of Spirits e792b0.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Sword Cane c99da7.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Sword Cane c99da7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Sword Cane c99da7.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Sword Cane c99da7.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card The Chthonian Stone 916f1c.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card The Chthonian Stone 916f1c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card The Chthonian Stone 916f1c.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card The Chthonian Stone 916f1c.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Tides of Fate 78b142.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Tides of Fate 78b142.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Tides of Fate 78b142.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Tides of Fate 78b142.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Torrent of Power 9f2514.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Torrent of Power 9f2514.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Torrent of Power 9f2514.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Torrent of Power 9f2514.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Uncage the Soul a82830.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Uncage the Soul a82830.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Uncage the Soul a82830.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Uncage the Soul a82830.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Voice of Ra 0988b2.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Voice of Ra 0988b2.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Voice of Ra 0988b2.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Voice of Ra 0988b2.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Ward of Protection 9bee5a.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Ward of Protection 9bee5a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Ward of Protection 9bee5a.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Ward of Protection 9bee5a.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Ward of Radiance b22438.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Ward of Radiance b22438.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Ward of Radiance b22438.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Ward of Radiance b22438.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Wither 5792ab.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Wither 5792ab.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7/Card Wither 5792ab.yaml rename to unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533/Card Wither 5792ab.yaml diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7.yaml b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7.yaml deleted file mode 100644 index 3314c9360..000000000 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic ee21f7.yaml +++ /dev/null @@ -1,118 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 -ContainedObjects: -- !include 'Custom_Model_Bag Mystic ee21f7/Card Shroud of Shadows a565d5.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Eye of Chaos 9a5782.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Armageddon 3feff1.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Blinding Light 00d05a.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Voice of Ra 0988b2.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Enraptured 0ce7b8.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Enchanted Blade 0e459d.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Azure Flame 17319c.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Moonlight Ritual 247824.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Scrying 24a147.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card David Renfield 3120e7.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Premonition 348395.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Arcane Initiate 4287c0.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Parallel Fates 47bdba.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Healing Words 4abb47.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Read the Signs 4f33d5.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Sign Magick 4fe0b8.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Quantum Flux 562eb1.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Wither 5792ab.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card St. Hubert''s Key 5905a9.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Deny Existence 62db13.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Scrying Mirror 6446d1.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Mists of R''lyeh 64fcdf.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Crystal Pendulum 6c3156.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Olive McBride 715974.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Dark Prophecy 74b8d4.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Tides of Fate 78b142.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Forbidden Knowledge 7cf231.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Alchemical Transmutation 7d133c.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Prescient 7e7873.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Rite of Seeking 8b39e9.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Astral Travel 8bb57d.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card The Chthonian Stone 916f1c.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Defiance 946958.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Familiar Spirit 971d52.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Holy Rosary 98aa6a.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Ward of Protection 9bee5a.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Torrent of Power 9f2514.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Alyssa Graham a26795.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Eldritch Inspiration a268ef.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Uncage the Soul a82830.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Ward of Radiance b22438.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Drawn to the Flame b36f5e.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Clairvoyance b67371.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Spectral Razor b6bccc.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Sixth Sense b7efb5.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Delve too Deep b83784.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Promise of Power c619af.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Scroll of Secrets c63ec7.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Ineffable Truth c6caf6.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Sword Cane c99da7.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Ritual Candles d2776c.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Robes of Endless Night d9292f.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Open Gate dfc9b0.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Prophesy e0906c.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Shrivelling e16d74.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Hypnotic Gaze e546c0.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Clarity of Mind e563d5.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Storm of Spirits e792b0.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Arcane Studies eb8234.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Scroll of Prophecies ebdac9.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Ethereal Form ee51d8.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Fearless f21135.yaml' -- !include 'Custom_Model_Bag Mystic ee21f7/Card Arcane Research fee183.yaml' -CustomMesh: - CastShadows: true - ColliderURL: '' - Convex: true - CustomShader: - FresnelStrength: 0.0 - SpecularColor: - b: 1.0 - g: 1.0 - r: 1.0 - SpecularIntensity: 0.0 - SpecularSharpness: 2.0 - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516557267/757887224F6C37104CDFFE241FAD09B57117D670/ - MaterialIndex: 3 - MeshURL: https://pastebin.com/raw/ALrYhQGb - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: ee21f7 -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: !include 'Custom_Model_Bag Mystic ee21f7.ttslua' -LuaScriptState: '{"ml":{"00d05a":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3075715303421,"z":90.141227722168},"rot":{"x":0.0208179596811533,"y":269.967468261719,"z":0.0167594738304615}},"0988b2":{"lock":false,"pos":{"x":53.2126121520996,"y":1.29544854164124,"z":48.7452774047852},"rot":{"x":0.0208086092025042,"y":270,"z":0.0167712923139334}},"0ce7b8":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30942869186401,"z":90.0903701782227},"rot":{"x":0.0208171363919973,"y":269.970916748047,"z":0.016760565340519}},"0e459d":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638564586639,"z":67.148681640625},"rot":{"x":0.0208132173866034,"y":269.984252929688,"z":0.0167655125260353}},"17319c":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29975187778473,"z":78.6486892700195},"rot":{"x":0.0208079405128956,"y":270.000030517578,"z":0.0167709123343229}},"20ff08":{"lock":false,"pos":{"x":53.2127799987793,"y":1.29612362384796,"z":51.0517311096191},"rot":{"x":0.0208189375698566,"y":269.966430664063,"z":0.0167580544948578}},"24621a":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30250763893127,"z":92.4607086181641},"rot":{"x":0.0208132378757,"y":269.983551025391,"z":0.0167651809751987}},"247824":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30218553543091,"z":71.7412033081055},"rot":{"x":0.0208180192857981,"y":269.966979980469,"z":0.0167590640485287}},"24a147":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29914140701294,"z":80.9607238769531},"rot":{"x":0.0208126250654459,"y":269.983459472656,"z":0.0167648009955883}},"3120e7":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705893993378,"z":69.4486846923828},"rot":{"x":0.0208125710487366,"y":269.984436035156,"z":0.0167642999440432}},"348395":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30016577243805,"z":64.8410720825195},"rot":{"x":0.0208182111382484,"y":269.966796875,"z":0.0167589709162712}},"396e1c":{"lock":false,"pos":{"x":40.960205078125,"y":1.30042505264282,"z":80.9486846923828},"rot":{"x":0.0208138320595026,"y":269.984497070313,"z":0.0167657043784857}},"3feff1":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30042505264282,"z":80.9486999511719},"rot":{"x":0.0208083335310221,"y":269.998931884766,"z":0.01677056401968}},"4287c0":{"lock":false,"pos":{"x":40.960205078125,"y":1.30244481563568,"z":87.8487014770508},"rot":{"x":0.0208129361271858,"y":269.984741210938,"z":0.0167655646800995}},"47bdba":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30083906650543,"z":67.1410827636719},"rot":{"x":0.0208085551857948,"y":270,"z":0.0167712047696114}},"4abb47":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369378089905,"z":57.9485626220703},"rot":{"x":0.0208136606961489,"y":269.983978271484,"z":0.0167650002986193}},"4f33d5":{"lock":false,"pos":{"x":53.2285499572754,"y":1.29881930351257,"z":60.2411804199219},"rot":{"x":0.0208183098584414,"y":269.966705322266,"z":0.0167593378573656}},"4fe0b8":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29644846916199,"z":71.7607116699219},"rot":{"x":0.0208141654729843,"y":269.983215332031,"z":0.0167655311524868}},"562eb1":{"lock":false,"pos":{"x":53.2285499572754,"y":1.29949259757996,"z":62.5411796569824},"rot":{"x":0.0208182670176029,"y":269.966796875,"z":0.0167593043297529}},"5792ab":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29308223724365,"z":60.2607727050781},"rot":{"x":0.0208138022571802,"y":269.982818603516,"z":0.0167648121714592}},"5905a9":{"lock":false,"pos":{"x":37.4159698486328,"y":1.29510200023651,"z":67.1606750488281},"rot":{"x":0.0208143871277571,"y":269.983032226563,"z":0.0167654491961002}},"5e3a3b":{"lock":false,"pos":{"x":58.3838386535645,"y":1.30808234214783,"z":85.490364074707},"rot":{"x":0.0208087768405676,"y":269.99951171875,"z":0.016770800575614}},"62db13":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30555176734924,"z":83.2412185668945},"rot":{"x":0.0208182632923126,"y":269.967132568359,"z":0.0167595166712999}},"6446d1":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29846823215485,"z":78.6607208251953},"rot":{"x":0.0208079945296049,"y":270.000030517578,"z":0.0167700331658125}},"64fcdf":{"lock":false,"pos":{"x":40.9634208679199,"y":1.2916773557663,"z":51.0597610473633},"rot":{"x":0.02081348747015,"y":269.983825683594,"z":0.016765009611845}},"6c3156":{"lock":false,"pos":{"x":40.960205078125,"y":1.29773211479187,"z":71.7486877441406},"rot":{"x":0.0208081286400557,"y":270.000061035156,"z":0.0167701635509729}},"715974":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29100203514099,"z":48.7527389526367},"rot":{"x":0.0208135601133108,"y":269.983764648438,"z":0.0167647954076529}},"74b8d4":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30689823627472,"z":87.8412246704102},"rot":{"x":0.0208182837814093,"y":269.96728515625,"z":0.0167593713849783}},"78b142":{"lock":false,"pos":{"x":53.2285919189453,"y":1.296799659729,"z":53.3411636352539},"rot":{"x":0.0208084657788277,"y":269.999603271484,"z":0.0167708825320005}},"7cf231":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436600208282,"z":60.2487869262695},"rot":{"x":0.0208133812993765,"y":269.984008789063,"z":0.0167649742215872}},"7d133c":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30379140377045,"z":92.4487075805664},"rot":{"x":0.0208129473030567,"y":269.984741210938,"z":0.0167653653770685}},"7d532d":{"lock":false,"pos":{"x":40.9602127075195,"y":1.29840540885925,"z":74.048698425293},"rot":{"x":0.0208125095814466,"y":269.984497070313,"z":0.0167653169482946}},"7e7873":{"lock":false,"pos":{"x":58.3838348388672,"y":1.30808246135712,"z":85.490348815918},"rot":{"x":0.0208086892962456,"y":270.000061035156,"z":0.0167709160596132}},"7fda7e":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29638564586639,"z":67.1486663818359},"rot":{"x":0.0208138152956963,"y":269.984161376953,"z":0.0167658906430006}},"8b39e9":{"lock":false,"pos":{"x":37.4159927368164,"y":1.30250763893127,"z":92.4607315063477},"rot":{"x":0.020812876522541,"y":269.983764648438,"z":0.0167650394141674}},"8bb57d":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3082447052002,"z":92.4412155151367},"rot":{"x":0.0208180192857981,"y":269.967468261719,"z":0.0167594850063324}},"916f1c":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29375553131104,"z":62.5607719421387},"rot":{"x":0.0208138227462769,"y":269.983032226563,"z":0.0167646929621696}},"946958":{"lock":false,"pos":{"x":58.3838310241699,"y":1.31010210514069,"z":92.3903579711914},"rot":{"x":0.0208172891288996,"y":269.970642089844,"z":0.0167604684829712}},"971d52":{"lock":false,"pos":{"x":40.9601783752441,"y":1.29503917694092,"z":62.5487480163574},"rot":{"x":0.0208085477352142,"y":270.000030517578,"z":0.0167708806693554}},"98aa6a":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302072525024,"z":55.6492195129395},"rot":{"x":0.0208134427666664,"y":269.98388671875,"z":0.0167649369686842}},"9a5782":{"lock":false,"pos":{"x":40.9601783752441,"y":1.29571235179901,"z":64.8486709594727},"rot":{"x":0.020808469504118,"y":269.998931884766,"z":0.0167706441134214}},"9bee5a":{"lock":false,"pos":{"x":49.5628509521484,"y":1.30691683292389,"z":92.4527969360352},"rot":{"x":0.0208183918148279,"y":269.966369628906,"z":0.016758793964982}},"9f2514":{"lock":false,"pos":{"x":58.3838233947754,"y":1.30606269836426,"z":78.5903549194336},"rot":{"x":0.0208174008876085,"y":269.970458984375,"z":0.0167603101581335}},"9f8a0a":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208139251917601,"y":269.984252929688,"z":0.0167657993733883}},"a0b9a7":{"lock":false,"pos":{"x":53.2285461425781,"y":1.30083894729614,"z":67.1410827636719},"rot":{"x":0.020818779245019,"y":269.966888427734,"z":0.0167595278471708}},"a26795":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30311810970306,"z":90.1487121582031},"rot":{"x":0.0208130832761526,"y":269.984710693359,"z":0.0167657975107431}},"a268ef":{"lock":false,"pos":{"x":53.2285652160645,"y":1.30420529842377,"z":78.641227722168},"rot":{"x":0.0208179671317339,"y":269.967163085938,"z":0.016759492456913}},"a283b4":{"lock":false,"pos":{"x":40.9634170532227,"y":1.29369378089905,"z":57.948558807373},"rot":{"x":0.0208131521940231,"y":269.98388671875,"z":0.0167651418596506}},"a565d5":{"lock":false,"pos":{"x":37.4161338806152,"y":1.29711866378784,"z":74.0500869750977},"rot":{"x":0.0208095014095306,"y":269.997009277344,"z":0.0167702212929726}},"a82830":{"lock":false,"pos":{"x":53.2127723693848,"y":1.29612374305725,"z":51.0517272949219},"rot":{"x":0.0208183135837317,"y":269.966552734375,"z":0.0167590081691742}},"b22438":{"lock":false,"pos":{"x":49.5628395080566,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.0208086390048265,"y":269.999755859375,"z":0.0167711488902569}},"b36f5e":{"lock":false,"pos":{"x":53.2285690307617,"y":1.30487859249115,"z":80.9412307739258},"rot":{"x":0.0208180472254753,"y":269.967437744141,"z":0.0167593732476234}},"b67371":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29907858371735,"z":76.3486862182617},"rot":{"x":0.0208080615848303,"y":270.000061035156,"z":0.0167700573801994}},"b6bccc":{"lock":false,"pos":{"x":53.2305870056152,"y":1.29814672470093,"z":57.9409599304199},"rot":{"x":0.020818205550313,"y":269.966644287109,"z":0.0167589131742716}},"b7efb5":{"lock":false,"pos":{"x":37.4159774780273,"y":1.2957751750946,"z":69.4607086181641},"rot":{"x":0.0208143480122089,"y":269.983032226563,"z":0.0167653001844883}},"b83784":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30622506141663,"z":85.5412216186523},"rot":{"x":0.0208180900663137,"y":269.96728515625,"z":0.016759192571044}},"c619af":{"lock":false,"pos":{"x":58.3838500976563,"y":1.30740916728973,"z":83.1903762817383},"rot":{"x":0.0208058375865221,"y":270.010040283203,"z":0.0167748834937811}},"c63ec7":{"lock":false,"pos":{"x":37.4159851074219,"y":1.29981470108032,"z":83.2607269287109},"rot":{"x":0.0208129249513149,"y":269.9833984375,"z":0.0167638566344976}},"c6caf6":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.0208088103681803,"y":269.999969482422,"z":0.0167706534266472}},"c99da7":{"lock":false,"pos":{"x":37.4159698486328,"y":1.29442870616913,"z":64.8606719970703},"rot":{"x":0.0208094473928213,"y":269.999664306641,"z":0.0167713891714811}},"d2776c":{"lock":false,"pos":{"x":37.4159851074219,"y":1.30183446407318,"z":90.1607437133789},"rot":{"x":0.0208128597587347,"y":269.983642578125,"z":0.0167650356888771}},"d9292f":{"lock":false,"pos":{"x":37.4159851074219,"y":1.3011611700058,"z":87.8607330322266},"rot":{"x":0.0208078641444445,"y":270.000030517578,"z":0.0167708955705166}},"dac4f8":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29981470108032,"z":83.2607192993164},"rot":{"x":0.0208142288029194,"y":269.983367919922,"z":0.0167654417455196}},"dfc9b0":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30151236057281,"z":69.4412002563477},"rot":{"x":0.0208181440830231,"y":269.966918945313,"z":0.0167590621858835}},"e0906c":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208175722509623,"y":269.969482421875,"z":0.0167600810527802}},"e16d74":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29779505729675,"z":76.3607177734375},"rot":{"x":0.0208134818822145,"y":269.983367919922,"z":0.0167651697993279}},"e546c0":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30285882949829,"z":74.0412063598633},"rot":{"x":0.020818192511797,"y":269.967010498047,"z":0.0167592614889145}},"e563d5":{"lock":false,"pos":{"x":40.960205078125,"y":1.29840540885925,"z":74.0486907958984},"rot":{"x":0.0208130776882172,"y":269.984375,"z":0.0167633332312107}},"e792b0":{"lock":false,"pos":{"x":53.2284622192383,"y":1.2974728345871,"z":55.6411819458008},"rot":{"x":0.0208184160292149,"y":269.966613769531,"z":0.0167591720819473}},"eb8234":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30109834671021,"z":83.2486877441406},"rot":{"x":0.0208130814135075,"y":269.984649658203,"z":0.0167655032128096}},"ebdac9":{"lock":false,"pos":{"x":37.4159851074219,"y":1.30048799514771,"z":85.5607299804688},"rot":{"x":0.0208128336817026,"y":269.983459472656,"z":0.0167649034410715}},"ee51d8":{"lock":false,"pos":{"x":53.2285499572754,"y":1.30353200435638,"z":76.3412017822266},"rot":{"x":0.0208180863410234,"y":269.967102050781,"z":0.0167591366916895}},"f21135":{"lock":false,"pos":{"x":58.3838424682617,"y":1.30875563621521,"z":87.7903823852539},"rot":{"x":0.0208172351121902,"y":269.970733642578,"z":0.016760315746069}},"fee183":{"lock":false,"pos":{"x":40.9602088928223,"y":1.30177164077759,"z":85.5486907958984},"rot":{"x":0.0208129864186049,"y":269.984802246094,"z":0.0167655944824219}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Mystic -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 66.58 - posY: 1.66 - posZ: 59.68 - rotX: 0.02 - rotY: 270.02 - rotZ: 0.02 - scaleX: 1.2 - scaleY: 1.2 - scaleZ: 1.2 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Neutral a4d0e8.ttslua b/unpacked/Custom_Model_Bag Neutral a4d0e8.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Neutral a4d0e8.ttslua +++ b/unpacked/Custom_Model_Bag Neutral a4d0e8.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral a4d0e8.yaml b/unpacked/Custom_Model_Bag Neutral a4d0e8.yaml index 659157d1e..891de821b 100644 --- a/unpacked/Custom_Model_Bag Neutral a4d0e8.yaml +++ b/unpacked/Custom_Model_Bag Neutral a4d0e8.yaml @@ -5,12 +5,12 @@ ColorDiffuse: r: 1.0 ContainedObjects: - !include 'Custom_Model_Bag Neutral a4d0e8/Custom_Model_Bag Neutral 06b03b.yaml' -- !include 'Custom_Model_Bag Neutral a4d0e8/Card Tempt Fate 58fa18.yaml' - !include 'Custom_Model_Bag Neutral a4d0e8/Card Flashlight 1687f1.yaml' - !include 'Custom_Model_Bag Neutral a4d0e8/Card Calling in Favors 399b4b.yaml' - !include 'Custom_Model_Bag Neutral a4d0e8/Card Smoking Pipe 46e63d.yaml' - !include 'Custom_Model_Bag Neutral a4d0e8/Card Overpower 4a2976.yaml' - !include 'Custom_Model_Bag Neutral a4d0e8/Card Thermos 4a7483.yaml' +- !include 'Custom_Model_Bag Neutral a4d0e8/Card Tempt Fate 58fa18.yaml' - !include 'Custom_Model_Bag Neutral a4d0e8/Card Reckless Assault 8b5134.yaml' - !include 'Custom_Model_Bag Neutral a4d0e8/Card Guts 8c9a30.yaml' - !include 'Custom_Model_Bag Neutral a4d0e8/Card Backpack 8d4398.yaml' diff --git a/unpacked/Custom_Model_Bag Neutral a4d0e8/Custom_Model_Bag Neutral 06b03b.ttslua b/unpacked/Custom_Model_Bag Neutral a4d0e8/Custom_Model_Bag Neutral 06b03b.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Neutral a4d0e8/Custom_Model_Bag Neutral 06b03b.ttslua +++ b/unpacked/Custom_Model_Bag Neutral a4d0e8/Custom_Model_Bag Neutral 06b03b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd.ttslua b/unpacked/Custom_Model_Bag Neutral aef7dd.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Neutral aef7dd.ttslua +++ b/unpacked/Custom_Model_Bag Neutral aef7dd.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd.yaml index 74b363055..faa786dbe 100644 --- a/unpacked/Custom_Model_Bag Neutral aef7dd.yaml +++ b/unpacked/Custom_Model_Bag Neutral aef7dd.yaml @@ -4,7 +4,8 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514.yaml' +- !include 'Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.yaml' +- !include 'Custom_Model_Bag Neutral aef7dd/Card Manipulate Destiny (2) 5606b3.yaml' - !include 'Custom_Model_Bag Neutral aef7dd/Card Ornate Bow (3) 08097a.yaml' - !include 'Custom_Model_Bag Neutral aef7dd/Card Elder Sign Amulet (3) 0aece0.yaml' - !include 'Custom_Model_Bag Neutral aef7dd/Card Emergency Cache (2) 1b1f60.yaml' @@ -52,7 +53,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: true LuaScript: !include 'Custom_Model_Bag Neutral aef7dd.ttslua' -LuaScriptState: '{"ml":{"08097a":{"lock":false,"pos":{"x":40.2901878356934,"y":1.29901659488678,"z":-63.5197677612305},"rot":{"x":0.02081049233675,"y":269.993560791016,"z":0.0167693644762039}},"0aece0":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208092276006937,"y":269.997711181641,"z":0.0167702436447144}},"11e940":{"lock":false,"pos":{"x":44.2289657592773,"y":1.30489218235016,"z":-52.0008277893066},"rot":{"x":0.0208084173500538,"y":270.0009765625,"z":0.0167719889432192}},"1b1f60":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30832493305206,"z":-47.420295715332},"rot":{"x":0.020808644592762,"y":270,"z":0.0167712215334177}},"1ea991":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29699683189392,"z":-70.4198684692383},"rot":{"x":0.0208095759153366,"y":269.998962402344,"z":0.0167714338749647}},"2acaa8":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632365703583,"z":-72.7199783325195},"rot":{"x":0.0208085719496012,"y":269.999145507813,"z":0.0167693458497524}},"519cc4":{"lock":false,"pos":{"x":40.2905235290527,"y":1.31392920017242,"z":-61.2202796936035},"rot":{"x":0.02097337692976,"y":269.998870849609,"z":359.270690917969}},"67dfca":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208091493695974,"y":269.997711181641,"z":0.0167699102312326}},"6b6ed9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208083279430866,"y":269.998962402344,"z":0.0167705584317446}},"73aab3":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30697846412659,"z":-52.0202980041504},"rot":{"x":0.0208086259663105,"y":270,"z":0.0167710147798061}},"79ef94":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30238282680511,"z":-52.0199928283691},"rot":{"x":0.0208089482039213,"y":269.999755859375,"z":0.0167707111686468}},"8737b5":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208091828972101,"y":269.997711181641,"z":0.01677006483078}},"8be56a":{"lock":false,"pos":{"x":40.2900619506836,"y":1.3030561208725,"z":-49.7198753356934},"rot":{"x":0.0208065211772919,"y":270.001159667969,"z":0.0167736783623695}},"b5763a":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30765163898468,"z":-49.7202949523926},"rot":{"x":0.0208115093410015,"y":269.990203857422,"z":0.0167675968259573}},"c1124f":{"lock":false,"pos":{"x":58.0997047424316,"y":1.31018245220184,"z":-47.4709968566895},"rot":{"x":0.0208082292228937,"y":270.001098632813,"z":0.0167714823037386}},"cd426b":{"lock":false,"pos":{"x":40.2900466918945,"y":1.2976701259613,"z":-68.1198654174805},"rot":{"x":0.0208095759153366,"y":269.999053955078,"z":0.0167713686823845}},"cf212b":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29497730731964,"z":-77.3199005126953},"rot":{"x":0.0208097882568836,"y":269.998931884766,"z":0.016771150752902}},"d78375":{"lock":false,"pos":{"x":52.9442024230957,"y":1.3063051700592,"z":-54.3202972412109},"rot":{"x":0.0208087638020515,"y":270,"z":0.0167711302638054}},"eef2a9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.020808894187212,"y":269.999816894531,"z":0.0167707558721304}},"fa4c7c":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198623657227},"rot":{"x":0.0208097919821739,"y":269.998291015625,"z":0.0167709831148386}}}}' +LuaScriptState: '{"ml":{"08097a":{"lock":false,"pos":{"x":40.2901878356934,"y":1.29901671409607,"z":-63.5197677612305},"rot":{"x":0.0208103973418474,"y":269.993560791016,"z":0.0167687591165304}},"0aece0":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208092872053385,"y":269.997711181641,"z":0.0167702492326498}},"11e940":{"lock":false,"pos":{"x":44.2289657592773,"y":1.30489218235016,"z":-52.0008277893066},"rot":{"x":0.0208084173500538,"y":270.0009765625,"z":0.0167719889432192}},"1b1f60":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30832493305206,"z":-47.420295715332},"rot":{"x":0.0208084918558598,"y":270,"z":0.0167713183909655}},"1ea991":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29699695110321,"z":-70.4198684692383},"rot":{"x":0.0208088550716639,"y":269.998962402344,"z":0.0167708061635494}},"2acaa8":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632365703583,"z":-72.7199783325195},"rot":{"x":0.0208089668303728,"y":269.999145507813,"z":0.0167708620429039}},"519cc4":{"lock":false,"pos":{"x":40.2905426025391,"y":1.29969012737274,"z":-61.2206115722656},"rot":{"x":0.0207742936909199,"y":269.997741699219,"z":0.0167464800179005}},"5606b3":{"lock":false,"pos":{"x":52.944206237793,"y":1.30697846412659,"z":-52.0203399658203},"rot":{"x":0.0208086706697941,"y":269.999877929688,"z":0.0167707782238722}},"67dfca":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208093468099833,"y":269.997711181641,"z":0.016770277172327}},"6b6ed9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208087507635355,"y":269.998962402344,"z":0.0167708285152912}},"73aab3":{"lock":false,"pos":{"x":52.9442100524902,"y":1.3063051700592,"z":-54.3203468322754},"rot":{"x":0.0208088308572769,"y":270,"z":0.0167708583176136}},"79ef94":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30238282680511,"z":-52.0199928283691},"rot":{"x":0.0208086539059877,"y":269.999755859375,"z":0.0167712084949017}},"8737b5":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208092704415321,"y":269.997711181641,"z":0.0167702995240688}},"8be56a":{"lock":false,"pos":{"x":40.2900619506836,"y":1.3030561208725,"z":-49.7198753356934},"rot":{"x":0.0208081211894751,"y":270.001159667969,"z":0.0167715661227703}},"b5763a":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30765163898468,"z":-49.7202949523926},"rot":{"x":0.0208114702254534,"y":269.990203857422,"z":0.0167673714458942}},"c1124f":{"lock":false,"pos":{"x":58.0997047424316,"y":1.31018245220184,"z":-47.4709968566895},"rot":{"x":0.0208080373704433,"y":270.001098632813,"z":0.0167716331779957}},"cd426b":{"lock":false,"pos":{"x":40.2900466918945,"y":1.2976701259613,"z":-68.1198654174805},"rot":{"x":0.0208088308572769,"y":269.999053955078,"z":0.0167707521468401}},"cf212b":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208088029175997,"y":269.998931884766,"z":0.0167708676308393}},"d78375":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30563187599182,"z":-56.6203498840332},"rot":{"x":0.0208086259663105,"y":270,"z":0.0167709123343229}},"eef2a9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208084601908922,"y":269.999816894531,"z":0.0167710911482573}},"fa4c7c":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198623657227},"rot":{"x":0.0208090394735336,"y":269.998291015625,"z":0.0167705770581961}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Card Emergency Cache (3) 73aab3.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Card Emergency Cache (3) 73aab3.yaml index e6b950b36..2924fd1a8 100644 --- a/unpacked/Custom_Model_Bag Neutral aef7dd/Card Emergency Cache (3) 73aab3.yaml +++ b/unpacked/Custom_Model_Bag Neutral aef7dd/Card Emergency Cache (3) 73aab3.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.31 - posZ: -52.02 + posZ: -54.32 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Card Manipulate Destiny (2) 5606b3.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Card Manipulate Destiny (2) 5606b3.yaml new file mode 100644 index 000000000..2a5a0a783 --- /dev/null +++ b/unpacked/Custom_Model_Bag Neutral aef7dd/Card Manipulate Destiny (2) 5606b3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232110 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5606b3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Manipulate Destiny (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 52.94 + posY: 1.31 + posZ: -52.02 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Card Moment of Respite (3) d78375.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Card Moment of Respite (3) d78375.yaml index bc36136e1..3917b32ca 100644 --- a/unpacked/Custom_Model_Bag Neutral aef7dd/Card Moment of Respite (3) d78375.yaml +++ b/unpacked/Custom_Model_Bag Neutral aef7dd/Card Moment of Respite (3) d78375.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.31 - posZ: -54.32 + posZ: -56.62 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.ttslua b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.ttslua new file mode 100644 index 000000000..b25806e6f --- /dev/null +++ b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.ttslua @@ -0,0 +1,503 @@ +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.yaml new file mode 100644 index 000000000..d27a13f12 --- /dev/null +++ b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.yaml @@ -0,0 +1,74 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag Neutral 3559eb/Card Manipulate Destiny (2) 5606b3.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Ornate Bow (3) 08097a.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Elder Sign Amulet (3) 0aece0.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Emergency Cache (2) 1b1f60.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Key of Ys (5) 1ea991.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card The Black Cat (5) 2acaa8.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Hemispheric Map (3) 519cc4.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Charisma (3) 67dfca.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card The Red-Gloved Man (5) 6b6ed9.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Emergency Cache (3) 73aab3.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card The Council''s Coffer (2) 79ef94.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Bulletproof Vest (3) 8737b5.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Backpack (2) 8be56a.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Lucid Dreaming (2) b5763a.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Versatile (2) c1124f.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Anna Kaslow (4) cd426b.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Timeworn Brand (5) cf212b.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Moment of Respite (3) d78375.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Ace of Rods (1) eef2a9.yaml' +- !include 'Custom_Model_Bag Neutral 3559eb/Card Relic Hunter (3) fa4c7c.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515017130/AD0A2EDADD663473879A6A391FACD32966983B17/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3559eb +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Neutral 3559eb.ttslua' +LuaScriptState: '{"ml":{"08097a":{"lock":false,"pos":{"x":40.2901878356934,"y":1.29901671409607,"z":-63.5197677612305},"rot":{"x":0.0208103973418474,"y":269.993560791016,"z":0.0167687591165304}},"0aece0":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208092872053385,"y":269.997711181641,"z":0.0167702492326498}},"11e940":{"lock":false,"pos":{"x":44.2289657592773,"y":1.30489218235016,"z":-52.0008277893066},"rot":{"x":0.0208084173500538,"y":270.0009765625,"z":0.0167719889432192}},"1b1f60":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30832493305206,"z":-47.420295715332},"rot":{"x":0.0208084918558598,"y":270,"z":0.0167713183909655}},"1ea991":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29699695110321,"z":-70.4198684692383},"rot":{"x":0.0208088550716639,"y":269.998962402344,"z":0.0167708061635494}},"2acaa8":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632365703583,"z":-72.7199783325195},"rot":{"x":0.0208089668303728,"y":269.999145507813,"z":0.0167708620429039}},"519cc4":{"lock":false,"pos":{"x":40.2905426025391,"y":1.29969012737274,"z":-61.2206115722656},"rot":{"x":0.0207742936909199,"y":269.997741699219,"z":0.0167464800179005}},"5606b3":{"lock":false,"pos":{"x":52.944206237793,"y":1.30697846412659,"z":-52.0203399658203},"rot":{"x":0.0208086706697941,"y":269.999877929688,"z":0.0167707782238722}},"67dfca":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208093468099833,"y":269.997711181641,"z":0.016770277172327}},"6b6ed9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208087507635355,"y":269.998962402344,"z":0.0167708285152912}},"73aab3":{"lock":false,"pos":{"x":52.9442100524902,"y":1.3063051700592,"z":-54.3203468322754},"rot":{"x":0.0208088308572769,"y":270,"z":0.0167708583176136}},"79ef94":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30238282680511,"z":-52.0199928283691},"rot":{"x":0.0208086539059877,"y":269.999755859375,"z":0.0167712084949017}},"8737b5":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208092704415321,"y":269.997711181641,"z":0.0167702995240688}},"8be56a":{"lock":false,"pos":{"x":40.2900619506836,"y":1.3030561208725,"z":-49.7198753356934},"rot":{"x":0.0208081211894751,"y":270.001159667969,"z":0.0167715661227703}},"b5763a":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30765163898468,"z":-49.7202949523926},"rot":{"x":0.0208114702254534,"y":269.990203857422,"z":0.0167673714458942}},"c1124f":{"lock":false,"pos":{"x":58.0997047424316,"y":1.31018245220184,"z":-47.4709968566895},"rot":{"x":0.0208080373704433,"y":270.001098632813,"z":0.0167716331779957}},"cd426b":{"lock":false,"pos":{"x":40.2900466918945,"y":1.2976701259613,"z":-68.1198654174805},"rot":{"x":0.0208088308572769,"y":269.999053955078,"z":0.0167707521468401}},"cf212b":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208088029175997,"y":269.998931884766,"z":0.0167708676308393}},"d78375":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30563187599182,"z":-56.6203498840332},"rot":{"x":0.0208086259663105,"y":270,"z":0.0167709123343229}},"eef2a9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208084601908922,"y":269.999816894531,"z":0.0167710911482573}},"fa4c7c":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198623657227},"rot":{"x":0.0208090394735336,"y":269.998291015625,"z":0.0167705770581961}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Neutral +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.31 + posY: 1.66 + posZ: -90.84 + rotX: 0.02 + rotY: 270.01 + rotZ: 0.02 + scaleX: 1.2 + scaleY: 1.2 + scaleZ: 1.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Ace of Rods (1) eef2a9.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Ace of Rods (1) eef2a9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Ace of Rods (1) eef2a9.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Ace of Rods (1) eef2a9.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Anna Kaslow (4) cd426b.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Anna Kaslow (4) cd426b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Anna Kaslow (4) cd426b.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Anna Kaslow (4) cd426b.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Backpack (2) 8be56a.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Backpack (2) 8be56a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Backpack (2) 8be56a.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Backpack (2) 8be56a.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Bulletproof Vest (3) 8737b5.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Bulletproof Vest (3) 8737b5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Bulletproof Vest (3) 8737b5.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Bulletproof Vest (3) 8737b5.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Charisma (3) 67dfca.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Charisma (3) 67dfca.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Charisma (3) 67dfca.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Charisma (3) 67dfca.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Elder Sign Amulet (3) 0aece0.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Elder Sign Amulet (3) 0aece0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Elder Sign Amulet (3) 0aece0.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Elder Sign Amulet (3) 0aece0.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Emergency Cache (2) 1b1f60.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Emergency Cache (2) 1b1f60.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Emergency Cache (2) 1b1f60.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Emergency Cache (2) 1b1f60.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Emergency Cache (3) 73aab3.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Emergency Cache (3) 73aab3.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Emergency Cache (3) 73aab3.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Emergency Cache (3) 73aab3.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Hemispheric Map (3) 519cc4.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Hemispheric Map (3) 519cc4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Hemispheric Map (3) 519cc4.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Hemispheric Map (3) 519cc4.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Key of Ys (5) 1ea991.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Key of Ys (5) 1ea991.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Key of Ys (5) 1ea991.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Key of Ys (5) 1ea991.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Lucid Dreaming (2) b5763a.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Lucid Dreaming (2) b5763a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Lucid Dreaming (2) b5763a.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Lucid Dreaming (2) b5763a.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Manipulate Destiny (2) 5606b3.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Manipulate Destiny (2) 5606b3.yaml new file mode 100644 index 000000000..0a76f1a09 --- /dev/null +++ b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Manipulate Destiny (2) 5606b3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232110 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5606b3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Manipulate Destiny (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.32 + posY: 1.41 + posZ: -90.83 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Moment of Respite (3) d78375.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Moment of Respite (3) d78375.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Moment of Respite (3) d78375.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Moment of Respite (3) d78375.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Ornate Bow (3) 08097a.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Ornate Bow (3) 08097a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Ornate Bow (3) 08097a.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Ornate Bow (3) 08097a.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Relic Hunter (3) fa4c7c.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Relic Hunter (3) fa4c7c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Relic Hunter (3) fa4c7c.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Relic Hunter (3) fa4c7c.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card The Black Cat (5) 2acaa8.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card The Black Cat (5) 2acaa8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card The Black Cat (5) 2acaa8.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card The Black Cat (5) 2acaa8.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card The Council's Coffer (2) 79ef94.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card The Council's Coffer (2) 79ef94.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card The Council's Coffer (2) 79ef94.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card The Council's Coffer (2) 79ef94.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card The Red-Gloved Man (5) 6b6ed9.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card The Red-Gloved Man (5) 6b6ed9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card The Red-Gloved Man (5) 6b6ed9.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card The Red-Gloved Man (5) 6b6ed9.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Timeworn Brand (5) cf212b.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Timeworn Brand (5) cf212b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Timeworn Brand (5) cf212b.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Timeworn Brand (5) cf212b.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Versatile (2) c1124f.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Versatile (2) c1124f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514/Card Versatile (2) c1124f.yaml rename to unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb/Card Versatile (2) c1124f.yaml diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514.ttslua b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514.ttslua deleted file mode 100644 index f999547e7..000000000 --- a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514.ttslua +++ /dev/null @@ -1,503 +0,0 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514.yaml b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514.yaml deleted file mode 100644 index 31001e588..000000000 --- a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 574514.yaml +++ /dev/null @@ -1,73 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 -ContainedObjects: -- !include 'Custom_Model_Bag Neutral 574514/Card Ornate Bow (3) 08097a.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Elder Sign Amulet (3) 0aece0.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Emergency Cache (2) 1b1f60.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Key of Ys (5) 1ea991.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card The Black Cat (5) 2acaa8.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Hemispheric Map (3) 519cc4.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Charisma (3) 67dfca.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card The Red-Gloved Man (5) 6b6ed9.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Emergency Cache (3) 73aab3.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card The Council''s Coffer (2) 79ef94.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Bulletproof Vest (3) 8737b5.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Backpack (2) 8be56a.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Lucid Dreaming (2) b5763a.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Versatile (2) c1124f.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Anna Kaslow (4) cd426b.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Timeworn Brand (5) cf212b.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Moment of Respite (3) d78375.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Ace of Rods (1) eef2a9.yaml' -- !include 'Custom_Model_Bag Neutral 574514/Card Relic Hunter (3) fa4c7c.yaml' -CustomMesh: - CastShadows: true - ColliderURL: '' - Convex: true - CustomShader: - FresnelStrength: 0.0 - SpecularColor: - b: 1.0 - g: 1.0 - r: 1.0 - SpecularIntensity: 0.0 - SpecularSharpness: 2.0 - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515017130/AD0A2EDADD663473879A6A391FACD32966983B17/ - MaterialIndex: 3 - MeshURL: https://pastebin.com/raw/ALrYhQGb - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: '574514' -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: !include 'Custom_Model_Bag Neutral 574514.ttslua' -LuaScriptState: '{"ml":{"08097a":{"lock":false,"pos":{"x":40.2901878356934,"y":1.29901659488678,"z":-63.5197677612305},"rot":{"x":0.02081049233675,"y":269.993560791016,"z":0.0167693644762039}},"0aece0":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208092276006937,"y":269.997711181641,"z":0.0167702436447144}},"11e940":{"lock":false,"pos":{"x":44.2289657592773,"y":1.30489218235016,"z":-52.0008277893066},"rot":{"x":0.0208084173500538,"y":270.0009765625,"z":0.0167719889432192}},"1b1f60":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30832493305206,"z":-47.420295715332},"rot":{"x":0.020808644592762,"y":270,"z":0.0167712215334177}},"1ea991":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29699683189392,"z":-70.4198684692383},"rot":{"x":0.0208095759153366,"y":269.998962402344,"z":0.0167714338749647}},"2acaa8":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632365703583,"z":-72.7199783325195},"rot":{"x":0.0208085719496012,"y":269.999145507813,"z":0.0167693458497524}},"519cc4":{"lock":false,"pos":{"x":40.2905235290527,"y":1.31392920017242,"z":-61.2202796936035},"rot":{"x":0.02097337692976,"y":269.998870849609,"z":359.270690917969}},"67dfca":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208091493695974,"y":269.997711181641,"z":0.0167699102312326}},"6b6ed9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208083279430866,"y":269.998962402344,"z":0.0167705584317446}},"73aab3":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30697846412659,"z":-52.0202980041504},"rot":{"x":0.0208086259663105,"y":270,"z":0.0167710147798061}},"79ef94":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30238282680511,"z":-52.0199928283691},"rot":{"x":0.0208089482039213,"y":269.999755859375,"z":0.0167707111686468}},"8737b5":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208091828972101,"y":269.997711181641,"z":0.01677006483078}},"8be56a":{"lock":false,"pos":{"x":40.2900619506836,"y":1.3030561208725,"z":-49.7198753356934},"rot":{"x":0.0208065211772919,"y":270.001159667969,"z":0.0167736783623695}},"b5763a":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30765163898468,"z":-49.7202949523926},"rot":{"x":0.0208115093410015,"y":269.990203857422,"z":0.0167675968259573}},"c1124f":{"lock":false,"pos":{"x":58.0997047424316,"y":1.31018245220184,"z":-47.4709968566895},"rot":{"x":0.0208082292228937,"y":270.001098632813,"z":0.0167714823037386}},"cd426b":{"lock":false,"pos":{"x":40.2900466918945,"y":1.2976701259613,"z":-68.1198654174805},"rot":{"x":0.0208095759153366,"y":269.999053955078,"z":0.0167713686823845}},"cf212b":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29497730731964,"z":-77.3199005126953},"rot":{"x":0.0208097882568836,"y":269.998931884766,"z":0.016771150752902}},"d78375":{"lock":false,"pos":{"x":52.9442024230957,"y":1.3063051700592,"z":-54.3202972412109},"rot":{"x":0.0208087638020515,"y":270,"z":0.0167711302638054}},"eef2a9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.020808894187212,"y":269.999816894531,"z":0.0167707558721304}},"fa4c7c":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198623657227},"rot":{"x":0.0208097919821739,"y":269.998291015625,"z":0.0167709831148386}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Neutral -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 66.31 - posY: 1.66 - posZ: -90.84 - rotX: 0.02 - rotY: 270.01 - rotZ: 0.02 - scaleX: 1.2 - scaleY: 1.2 - scaleZ: 1.2 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Neutral c5261f.ttslua b/unpacked/Custom_Model_Bag Neutral c5261f.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Neutral c5261f.ttslua +++ b/unpacked/Custom_Model_Bag Neutral c5261f.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral c5261f/Custom_Model_Bag Neutral 3fe354.ttslua b/unpacked/Custom_Model_Bag Neutral c5261f/Custom_Model_Bag Neutral 3fe354.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Neutral c5261f/Custom_Model_Bag Neutral 3fe354.ttslua +++ b/unpacked/Custom_Model_Bag Neutral c5261f/Custom_Model_Bag Neutral 3fe354.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.ttslua b/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.ttslua index 4798d294b..daed6bf90 100644 --- a/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.ttslua +++ b/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.yaml b/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.yaml index ca0369ec8..aa7d03937 100644 --- a/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.yaml +++ b/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.yaml @@ -4,23 +4,22 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: +- !include 'Custom_Model_Bag Promo Investigators 5fe24e/Card Gloria Goldberg 8de7e4.yaml' - !include 'Custom_Model_Bag Promo Investigators 5fe24e/Custom_Model_Bag signature cards 10681c.yaml' -- !include 'Custom_Model_Bag Promo Investigators 5fe24e/CardCustom Gloria Goldberg - 304ca2.yaml' -- !include 'Custom_Model_Bag Promo Investigators 5fe24e/CardCustom Gloria Goldberg - 8d4d81.yaml' -- !include 'Custom_Model_Bag Promo Investigators 5fe24e/Custom_Model 6bd479.yaml' -- !include 'Custom_Model_Bag Promo Investigators 5fe24e/Custom_Model 97b325.yaml' -- !include 'Custom_Model_Bag Promo Investigators 5fe24e/Custom_Model 87a46c.yaml' - !include 'Custom_Model_Bag Promo Investigators 5fe24e/Custom_Model Survivor turn token 26f88d.yaml' - !include 'Custom_Model_Bag Promo Investigators 5fe24e/Card Norman Withers 298237.yaml' - !include 'Custom_Model_Bag Promo Investigators 5fe24e/Card Norman Withers 3f60eb.yaml' +- !include 'Custom_Model_Bag Promo Investigators 5fe24e/Custom_Model 6bd479.yaml' - !include 'Custom_Model_Bag Promo Investigators 5fe24e/Custom_Model Survivor turn token 72caa1.yaml' +- !include 'Custom_Model_Bag Promo Investigators 5fe24e/Custom_Model 87a46c.yaml' - !include 'Custom_Model_Bag Promo Investigators 5fe24e/Custom_Model Survivor turn token 8b0a9e.yaml' +- !include 'Custom_Model_Bag Promo Investigators 5fe24e/CardCustom Gloria Goldberg + 8d4d81.yaml' +- !include 'Custom_Model_Bag Promo Investigators 5fe24e/Custom_Model 97b325.yaml' - !include 'Custom_Model_Bag Promo Investigators 5fe24e/Custom_Model_Bag starter deck & cards fc27ff.yaml' CustomMesh: @@ -51,7 +50,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: false LuaScript: !include 'Custom_Model_Bag Promo Investigators 5fe24e.ttslua' -LuaScriptState: '{"ml":{"10681c":{"lock":false,"pos":{"x":-26.3001728057861,"y":1.26878046989441,"z":-76.9456329345703},"rot":{"x":359.979156494141,"y":90.0019836425781,"z":359.983215332031}},"26f88d":{"lock":false,"pos":{"x":-16.6400470733643,"y":1.36149287223816,"z":-62.4609298706055},"rot":{"x":0.020813936367631,"y":270.0166015625,"z":0.0167716238647699}},"298237":{"lock":false,"pos":{"x":-22.6169605255127,"y":1.31328415870667,"z":-61.2413864135742},"rot":{"x":0.0167715828865767,"y":180.000198364258,"z":359.979187011719}},"304ca2":{"lock":false,"pos":{"x":-22.6157627105713,"y":1.30868756771088,"z":-76.946044921875},"rot":{"x":0.0167718324810266,"y":179.999923706055,"z":359.979187011719}},"3f60eb":{"lock":false,"pos":{"x":-19.3000774383545,"y":1.31449115276337,"z":-61.2332534790039},"rot":{"x":0.0208097435534,"y":269.998504638672,"z":0.0167695209383965}},"6bd479":{"lock":false,"pos":{"x":-16.6403007507324,"y":1.35761606693268,"z":-75.7054290771484},"rot":{"x":0.0208021905273199,"y":270.036193847656,"z":0.0167729649692774}},"72caa1":{"lock":false,"pos":{"x":-16.6400871276855,"y":1.3618528842926,"z":-61.2309913635254},"rot":{"x":0.0208195671439171,"y":269.998291015625,"z":0.0167642813175917}},"87a46c":{"lock":false,"pos":{"x":-16.6401386260986,"y":1.35689306259155,"z":-78.175651550293},"rot":{"x":0.0208384096622467,"y":269.978759765625,"z":0.0167642887681723}},"8b0a9e":{"lock":false,"pos":{"x":-16.6400909423828,"y":1.36221301555634,"z":-60.0009918212891},"rot":{"x":0.0208213999867439,"y":269.990661621094,"z":0.0167617201805115}},"8d4d81":{"lock":false,"pos":{"x":-19.2936096191406,"y":1.30989539623261,"z":-76.9415512084961},"rot":{"x":0.0208108406513929,"y":269.999969482422,"z":0.016773110255599}},"97b325":{"lock":false,"pos":{"x":-16.6395988464355,"y":1.357253074646,"z":-76.9456481933594},"rot":{"x":0.0208098776638508,"y":270.04345703125,"z":0.0167948119342327}},"fc27ff":{"lock":false,"pos":{"x":-26.3001327514648,"y":1.27337777614594,"z":-61.2409515380859},"rot":{"x":359.979156494141,"y":90.0019454956055,"z":359.983245849609}}}}' +LuaScriptState: '{"ml":{"10681c":{"lock":false,"pos":{"x":-26.3001728057861,"y":1.26878118515015,"z":-76.9456329345703},"rot":{"x":359.979187011719,"y":90.0019912719727,"z":359.983215332031}},"26f88d":{"lock":false,"pos":{"x":-16.6400470733643,"y":1.36149287223816,"z":-62.4609298706055},"rot":{"x":0.0208116266876459,"y":270.0166015625,"z":0.0167740751057863}},"298237":{"lock":false,"pos":{"x":-22.6169605255127,"y":1.31328415870667,"z":-61.2413864135742},"rot":{"x":0.0167714301496744,"y":180.000183105469,"z":359.979187011719}},"3f60eb":{"lock":false,"pos":{"x":-19.3000774383545,"y":1.31449115276337,"z":-61.2332534790039},"rot":{"x":0.0208093021064997,"y":269.998504638672,"z":0.0167706180363894}},"6bd479":{"lock":false,"pos":{"x":-16.6403007507324,"y":1.35761594772339,"z":-75.7054290771484},"rot":{"x":0.0208060145378113,"y":270.036193847656,"z":0.0167813114821911}},"72caa1":{"lock":false,"pos":{"x":-16.6400871276855,"y":1.3618528842926,"z":-61.2309913635254},"rot":{"x":0.0208173934370279,"y":269.998291015625,"z":0.0167674440890551}},"87a46c":{"lock":false,"pos":{"x":-16.6401386260986,"y":1.35689294338226,"z":-78.175651550293},"rot":{"x":0.0208227299153805,"y":269.978759765625,"z":0.0167599022388458}},"8b0a9e":{"lock":false,"pos":{"x":-16.6400909423828,"y":1.36221289634705,"z":-60.0009918212891},"rot":{"x":0.0208195596933365,"y":269.990661621094,"z":0.0167646147310734}},"8d4d81":{"lock":false,"pos":{"x":-19.2936096191406,"y":1.30989539623261,"z":-76.9415512084961},"rot":{"x":0.0208089351654053,"y":269.999969482422,"z":0.0167707242071629}},"8de7e4":{"lock":false,"pos":{"x":-22.6157627105713,"y":1.30868756771088,"z":-76.946044921875},"rot":{"x":0.0167715586721897,"y":179.999984741211,"z":359.979187011719}},"97b325":{"lock":false,"pos":{"x":-16.6395988464355,"y":1.35725319385529,"z":-76.9456481933594},"rot":{"x":0.0208035595715046,"y":270.04345703125,"z":0.0167842507362366}},"fc27ff":{"lock":false,"pos":{"x":-26.3001327514648,"y":1.27337801456451,"z":-61.2409515380859},"rot":{"x":359.979156494141,"y":90.0019454956055,"z":359.983215332031}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Promo Investigators 5fe24e/CardCustom Gloria Goldberg 304ca2.yaml b/unpacked/Custom_Model_Bag Promo Investigators 5fe24e/Card Gloria Goldberg 8de7e4.yaml similarity index 62% rename from unpacked/Custom_Model_Bag Promo Investigators 5fe24e/CardCustom Gloria Goldberg 304ca2.yaml rename to unpacked/Custom_Model_Bag Promo Investigators 5fe24e/Card Gloria Goldberg 8de7e4.yaml index ddcb3ab1a..064d4b201 100644 --- a/unpacked/Custom_Model_Bag Promo Investigators 5fe24e/CardCustom Gloria Goldberg 304ca2.yaml +++ b/unpacked/Custom_Model_Bag Promo Investigators 5fe24e/Card Gloria Goldberg 8de7e4.yaml @@ -1,22 +1,22 @@ Autoraise: true -CardID: 272800 +CardID: 270200 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2728': + '2702': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1684870715280921029/0A553093B8985289C8982340ADBE52EBB82CEC24/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280920872/218BBC9E56ED0EAF53672AC46E0E961C0EA1DC23/ - NumHeight: 1 - NumWidth: 1 + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154537387/9BBCF9ACFA26E3C0649434C832E5681AB731A77B/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154536333/92BABC93BFBC5E1DA2C2A7B5EA5E62151E0DE3D7/ + NumHeight: 2 + NumWidth: 3 Type: 0 - UniqueBack: false + UniqueBack: true Description: The Writer DragSelectable: true GMNotes: '' -GUID: 304ca2 +GUID: 8de7e4 Grid: true GridProjection: false Hands: true @@ -26,7 +26,7 @@ Locked: false LuaScript: '' LuaScriptState: '' MeasureMovement: false -Name: CardCustom +Name: Card Nickname: Gloria Goldberg SidewaysCard: true Snap: true diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130.ttslua index 7ba1823d7..b855e99ad 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130.ttslua @@ -1,504 +1,504 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e/Custom_Tile The Dunwich Legacy a74352.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e/Custom_Tile The Dunwich Legacy a74352.ttslua index 39ecc5466..cfa110e20 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e/Custom_Tile The Dunwich Legacy a74352.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e/Custom_Tile The Dunwich Legacy a74352.ttslua @@ -1,21 +1,21 @@ -name = 'The Dunwich Legacy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Dunwich Legacy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082/Custom_Tile The Dunwich Legacy 1d6227.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082/Custom_Tile The Dunwich Legacy 1d6227.ttslua index 39ecc5466..cfa110e20 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082/Custom_Tile The Dunwich Legacy 1d6227.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082/Custom_Tile The Dunwich Legacy 1d6227.ttslua @@ -1,21 +1,21 @@ -name = 'The Dunwich Legacy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Dunwich Legacy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a/Custom_Tile The Miskatonic Museum 4b5e17.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a/Custom_Tile The Miskatonic Museum 4b5e17.ttslua index ca89f18f6..f92a55f33 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a/Custom_Tile The Miskatonic Museum 4b5e17.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a/Custom_Tile The Miskatonic Museum 4b5e17.ttslua @@ -1,25 +1,25 @@ -name = 'The Miskatonic Museum' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Miskatonic Museum' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86/Custom_Tile The Essex County Express 247967.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86/Custom_Tile The Essex County Express 247967.ttslua index 9ff549176..8942d6ff8 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86/Custom_Tile The Essex County Express 247967.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86/Custom_Tile The Essex County Express 247967.ttslua @@ -1,25 +1,25 @@ -name = 'The Essex County Express' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Essex County Express' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7/Custom_Tile Blood on the Altar 92b54a.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7/Custom_Tile Blood on the Altar 92b54a.ttslua index b50b2762f..35359436c 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7/Custom_Tile Blood on the Altar 92b54a.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7/Custom_Tile Blood on the Altar 92b54a.ttslua @@ -1,25 +1,25 @@ -name = 'Blood on the Altar' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Blood on the Altar' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde/Custom_Tile Undimensioned and Unseen 393c71.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde/Custom_Tile Undimensioned and Unseen 393c71.ttslua index 4da502b94..796c0adfa 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde/Custom_Tile Undimensioned and Unseen 393c71.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde/Custom_Tile Undimensioned and Unseen 393c71.ttslua @@ -1,25 +1,25 @@ -name = 'Undimensioned and Unseen' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Undimensioned and Unseen' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29/Custom_Tile Where Doom Awaits a621ae.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29/Custom_Tile Where Doom Awaits a621ae.ttslua index 5f3588cb8..c8658d789 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29/Custom_Tile Where Doom Awaits a621ae.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29/Custom_Tile Where Doom Awaits a621ae.ttslua @@ -1,25 +1,25 @@ -name = 'Where Doom Awaits' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Where Doom Awaits' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b/Custom_Tile Lost in Time and Space 64a607.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b/Custom_Tile Lost in Time and Space 64a607.ttslua index 09337160a..a649f8c03 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b/Custom_Tile Lost in Time and Space 64a607.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b/Custom_Tile Lost in Time and Space 64a607.ttslua @@ -1,25 +1,25 @@ -name = 'Lost in Time and Space' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Lost in Time and Space' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua index 3d43d4f4c..690a83709 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua @@ -1,669 +1,669 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First checkbox --- { --- pos = {-0.62,0.1,0.056}, --- size = 400, --- state = false --- }, - --Second checkbox --- { --- pos = {-0.629,0.1,0.199}, --- size = 400, --- state = false --- }, - --Third checkbox --- { --- pos = {-0.594,0.1,0.355}, --- size = 400, --- state = false --- }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.45,0.1,0.55}, - rows =18, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.384,0.1,0.228}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists interrogated - { - pos = {0.384,0.1,0.69}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First checkbox +-- { +-- pos = {-0.62,0.1,0.056}, +-- size = 400, +-- state = false +-- }, + --Second checkbox +-- { +-- pos = {-0.629,0.1,0.199}, +-- size = 400, +-- state = false +-- }, + --Third checkbox +-- { +-- pos = {-0.594,0.1,0.355}, +-- size = 400, +-- state = false +-- }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.45,0.1,0.55}, + rows =18, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.384,0.1,0.228}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists interrogated + { + pos = {0.384,0.1,0.69}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3.ttslua index 7ba1823d7..b855e99ad 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3.ttslua @@ -1,504 +1,504 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2/Custom_Tile The Forgotten Age e95200.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2/Custom_Tile The Forgotten Age e95200.ttslua index 200437b6c..75c4561fb 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2/Custom_Tile The Forgotten Age e95200.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2/Custom_Tile The Forgotten Age e95200.ttslua @@ -1,21 +1,21 @@ -name = 'The Forgotten Age' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Forgotten Age' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2/Custom_Tile The Doom of Eztli 294ec4.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2/Custom_Tile The Doom of Eztli 294ec4.ttslua index 5672c33bc..25a046b6a 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2/Custom_Tile The Doom of Eztli 294ec4.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2/Custom_Tile The Doom of Eztli 294ec4.ttslua @@ -1,25 +1,25 @@ -name = 'The Doom of Eztli' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Doom of Eztli' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940/Custom_Tile Threads of Fate 7a95f6.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940/Custom_Tile Threads of Fate 7a95f6.ttslua index 0d6a8bd42..aa256f497 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940/Custom_Tile Threads of Fate 7a95f6.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940/Custom_Tile Threads of Fate 7a95f6.ttslua @@ -1,25 +1,25 @@ -name = 'Threads of Fate' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Threads of Fate' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4/Custom_Tile The Boundary Beyond 010761.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4/Custom_Tile The Boundary Beyond 010761.ttslua index f46c523bf..88130bf52 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4/Custom_Tile The Boundary Beyond 010761.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4/Custom_Tile The Boundary Beyond 010761.ttslua @@ -1,25 +1,25 @@ -name = 'The Boundary Beyond' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Boundary Beyond' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f/Custom_Tile Heart of the Elders 493cb1.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f/Custom_Tile Heart of the Elders 493cb1.ttslua index 5a7299c73..4f3609807 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f/Custom_Tile Heart of the Elders 493cb1.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f/Custom_Tile Heart of the Elders 493cb1.ttslua @@ -1,25 +1,25 @@ -name = 'Heart of the Elders' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Heart of the Elders' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 2 3ccabf.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 2 3ccabf.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 2 3ccabf.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 2 3ccabf.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427/Custom_Tile The City of Archives 2fb6dc.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427/Custom_Tile The City of Archives 2fb6dc.ttslua index 3224092d4..787f8705f 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427/Custom_Tile The City of Archives 2fb6dc.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427/Custom_Tile The City of Archives 2fb6dc.ttslua @@ -1,25 +1,25 @@ -name = 'The City of Archives' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The City of Archives' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Tile The Depths of Yoth 7aa4e3.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Tile The Depths of Yoth 7aa4e3.ttslua index e569e19b2..7d9affdc4 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Tile The Depths of Yoth 7aa4e3.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Tile The Depths of Yoth 7aa4e3.ttslua @@ -1,25 +1,25 @@ -name = 'The Depths of Yoth' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Depths of Yoth' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - EasyStandard dd61f1.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - EasyStandard dd61f1.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - EasyStandard dd61f1.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - EasyStandard dd61f1.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - HardExpert 2da146.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - HardExpert 2da146.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - HardExpert 2da146.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - HardExpert 2da146.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7/Custom_Tile Shattered Aeons 6dc72a.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7/Custom_Tile Shattered Aeons 6dc72a.ttslua index b31a42434..b78ce3eb4 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7/Custom_Tile Shattered Aeons 6dc72a.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7/Custom_Tile Shattered Aeons 6dc72a.ttslua @@ -1,21 +1,21 @@ -name = 'Shattered Aeons' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Shattered Aeons' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 9 Return to Secret Scenario 496395.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 9 Return to Secret Scenario 496395.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 9 Return to Secret Scenario 496395.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 9 Return to Secret Scenario 496395.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua index 682c9d34c..3e3ff898f 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua @@ -1,691 +1,691 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Yig's Fury - { - pos = {0.097,0.1,0.88}, - size = 500, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one Supplies - { - pos = {-0.637,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two supplies - { - pos = {-0.2,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three supplies - { - pos = {0.24,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four supplies - { - pos = {0.671,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.475,0.1,0.62}, - rows =12, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.527,0.1,0.507}, - rows = 12, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Yig's Fury + { + pos = {0.097,0.1,0.88}, + size = 500, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one Supplies + { + pos = {-0.637,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two supplies + { + pos = {-0.2,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three supplies + { + pos = {0.24,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four supplies + { + pos = {0.671,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.475,0.1,0.62}, + rows =12, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.527,0.1,0.507}, + rows = 12, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a.ttslua index 7ba1823d7..b855e99ad 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a.ttslua @@ -1,504 +1,504 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua index 7878134ac..978a9d2b5 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua @@ -1,21 +1,21 @@ -name = 'The Path to Carcosa' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Path to Carcosa' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.yaml index 670ceadad..a65446a08 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.yaml @@ -19,31 +19,33 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Model_Bag Set-aside af5282.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Encounter Deck 9869cb.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck 041cfc.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Discovering the Truth 985957.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality 59504e.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Setup 93a42f.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Notecard Errata f66b3b.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Gallery cce10d.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Dining Room aa08d4.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile dfdabe.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper + 47a40e.yaml' - !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 01b9fa.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 7234af.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile d4d0a1.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 472b87.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile b25fa2.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 657fc6.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck 041cfc.yaml' - !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 170d3d.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile f935dd.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 472b87.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality 59504e.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 657fc6.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 7234af.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Setup 93a42f.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Discovering the Truth 985957.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Encounter Deck 9869cb.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Dining Room aa08d4.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Model_Bag Set-aside af5282.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile b25fa2.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Gallery cce10d.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile d4d0a1.yaml' - !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Bystanders dc02e3.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile dfdabe.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Notecard Errata f66b3b.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile f935dd.yaml' CustomMesh: CastShadows: true ColliderURL: '' @@ -72,7 +74,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: false LuaScript: !include 'Custom_Model_Bag 2 The Last King 6730a1.ttslua' -LuaScriptState: '{"ml":{"01b9fa":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":359.9831,"y":0.0003,"z":359.9201}},"041cfc":{"lock":false,"pos":{"x":-2.7248,"y":1.664,"z":0.3733},"rot":{"x":0.0168,"y":179.9995,"z":0.0803}},"170d3d":{"lock":false,"pos":{"x":-20.0997,"y":1.6105,"z":3.2408},"rot":{"x":359.9554,"y":224.9999,"z":0.0684}},"472b87":{"lock":false,"pos":{"x":-27.4076,"y":1.6185,"z":-3.9855},"rot":{"x":359.9316,"y":315,"z":359.9554}},"4b6478":{"lock":false,"pos":{"x":-30.2243,"y":1.6954,"z":-0.03},"rot":{"x":359.9201,"y":270,"z":0.0169}},"59504e":{"lock":false,"pos":{"x":-3.956,"y":1.6497,"z":-10.4412},"rot":{"x":359.9198,"y":270.0002,"z":180.017}},"657fc6":{"lock":false,"pos":{"x":-20.5635,"y":1.6124,"z":7.5489},"rot":{"x":359.9201,"y":269.9947,"z":0.0169}},"7234af":{"lock":false,"pos":{"x":-26.7542,"y":1.6189,"z":0.1696},"rot":{"x":359.9201,"y":269.9948,"z":0.0169}},"857d0d":{"lock":false,"pos":{"x":-4.2848,"y":1.5829,"z":-15.6022},"rot":{"x":359.9197,"y":269.9991,"z":0.0168}},"93a42f":{"lock":false,"pos":{"x":-0.425,"y":1.6507,"z":-10.4281},"rot":{"x":359.9197,"y":269.9999,"z":0.0168}},"981fa3":{"lock":false,"pos":{"x":-23.6765,"y":1.6862,"z":-0.03},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"985957":{"lock":false,"pos":{"x":-2.6886,"y":1.6555,"z":-5.0485},"rot":{"x":0.0168,"y":179.9999,"z":0.0803}},"9869cb":{"lock":false,"pos":{"x":-3.9277,"y":1.7397,"z":5.7572},"rot":{"x":359.9197,"y":270.0002,"z":180.0168}},"aa08d4":{"lock":false,"pos":{"x":-17.12,"y":1.6793,"z":7.57},"rot":{"x":359.9201,"y":270,"z":0.0169}},"af5282":{"lock":false,"pos":{"x":1.6964,"y":1.5583,"z":14.2788},"rot":{"x":359.9551,"y":224.998,"z":0.0687}},"b25fa2":{"lock":false,"pos":{"x":-20.004,"y":1.6083,"z":-3.8134},"rot":{"x":359.9316,"y":315,"z":359.9554}},"b3c25b":{"lock":false,"pos":{"x":-23.6766,"y":1.684,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"c605d3":{"lock":false,"pos":{"x":-23.6765,"y":1.6885,"z":7.57},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"cce10d":{"lock":false,"pos":{"x":-17.1201,"y":1.6748,"z":-7.7},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"d4d0a1":{"lock":false,"pos":{"x":-27.2821,"y":1.6207,"z":3.8853},"rot":{"x":359.9554,"y":224.9999,"z":0.0684}},"dc02e3":{"lock":false,"pos":{"x":-17.1201,"y":1.6804,"z":15.19},"rot":{"x":359.9201,"y":270.0005,"z":0.0169}},"dd2d33":{"lock":false,"pos":{"x":-4.4431,"y":1.7756,"z":-10.4201},"rot":{"x":359.9202,"y":270.0326,"z":0.0169}},"dfdabe":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":359.9831,"y":0.0002,"z":359.9201}},"f66b3b":{"lock":false,"pos":{"x":-11.3753,"y":1.5603,"z":-23.9306},"rot":{"x":0.0799,"y":89.9999,"z":359.9831}},"f935dd":{"lock":false,"pos":{"x":-20.4019,"y":1.6078,"z":-7.3231},"rot":{"x":359.9201,"y":269.9874,"z":0.0169}}}}' +LuaScriptState: '{"ml":{"01b9fa":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.61334502696991,"z":-3.82999873161316},"rot":{"x":359.983154296875,"y":0.000313962111249566,"z":359.920074462891}},"041cfc":{"lock":false,"pos":{"x":-2.72482419013977,"y":1.61594653129578,"z":0.373305648565292},"rot":{"x":0.0168363638222218,"y":179.999481201172,"z":0.0802556425333023}},"170d3d":{"lock":false,"pos":{"x":-20.0997009277344,"y":1.61043536663055,"z":3.24080085754395},"rot":{"x":359.955413818359,"y":224.999893188477,"z":0.0683811381459236}},"472b87":{"lock":false,"pos":{"x":-27.407600402832,"y":1.61850214004517,"z":-3.98550176620483},"rot":{"x":359.931579589844,"y":315,"z":359.955413818359}},"47a40e":{"lock":false,"pos":{"x":-13.6480073928833,"y":1.60382449626923,"z":11.358118057251},"rot":{"x":359.920104980469,"y":269.998931884766,"z":0.0168507695198059}},"4b6478":{"lock":false,"pos":{"x":-30.2243175506592,"y":1.63719701766968,"z":-0.0299971085041761},"rot":{"x":359.920104980469,"y":269.999938964844,"z":0.0168397463858128}},"59504e":{"lock":false,"pos":{"x":-3.95596528053284,"y":1.67043948173523,"z":-10.4412088394165},"rot":{"x":359.920532226563,"y":270.000305175781,"z":180.012573242188}},"657fc6":{"lock":false,"pos":{"x":-20.5634994506836,"y":1.61234819889069,"z":7.54890012741089},"rot":{"x":359.920104980469,"y":269.994720458984,"z":0.0168747045099735}},"7234af":{"lock":false,"pos":{"x":-26.7541999816895,"y":1.61881196498871,"z":0.169599458575249},"rot":{"x":359.920104980469,"y":269.994812011719,"z":0.0168746262788773}},"857d0d":{"lock":false,"pos":{"x":-4.28480100631714,"y":1.58287870883942,"z":-15.6022024154663},"rot":{"x":359.919738769531,"y":269.998992919922,"z":0.0168392397463322}},"93a42f":{"lock":false,"pos":{"x":-0.425016075372696,"y":1.59259748458862,"z":-10.4280986785889},"rot":{"x":359.919738769531,"y":269.999938964844,"z":0.0168372616171837}},"981fa3":{"lock":false,"pos":{"x":-23.6765174865723,"y":1.6280665397644,"z":-0.0299972500652075},"rot":{"x":359.920104980469,"y":269.999938964844,"z":0.0168396960943937}},"985957":{"lock":false,"pos":{"x":-2.68861651420593,"y":1.59734880924225,"z":-5.04849720001221},"rot":{"x":0.0168361533433199,"y":179.999908447266,"z":0.0802551060914993}},"9869cb":{"lock":false,"pos":{"x":-3.92770791053772,"y":1.72512233257294,"z":5.75720310211182},"rot":{"x":359.919738769531,"y":270.000213623047,"z":180.016815185547}},"aa08d4":{"lock":false,"pos":{"x":-17.1200160980225,"y":1.62115752696991,"z":7.57000303268433},"rot":{"x":359.920104980469,"y":270,"z":0.0168396141380072}},"af5282":{"lock":false,"pos":{"x":1.6964019536972,"y":1.55831718444824,"z":14.2788038253784},"rot":{"x":359.955139160156,"y":224.997985839844,"z":0.0686738342046738}},"b25fa2":{"lock":false,"pos":{"x":-20.0039958953857,"y":1.60822880268097,"z":-3.81340050697327},"rot":{"x":359.931579589844,"y":314.999816894531,"z":359.955413818359}},"b3c25b":{"lock":false,"pos":{"x":-23.6766128540039,"y":1.62581253051758,"z":-7.69999742507935},"rot":{"x":359.920104980469,"y":269.999755859375,"z":0.0168400425463915}},"c605d3":{"lock":false,"pos":{"x":-23.6765174865723,"y":1.63030016422272,"z":7.57000160217285},"rot":{"x":359.920104980469,"y":269.999694824219,"z":0.0168400499969721}},"cce10d":{"lock":false,"pos":{"x":-17.1201171875,"y":1.61667001247406,"z":-7.69999837875366},"rot":{"x":359.920104980469,"y":269.999725341797,"z":0.0168399997055531}},"d4d0a1":{"lock":false,"pos":{"x":-27.2821006774902,"y":1.62064015865326,"z":3.88530087471008},"rot":{"x":359.955413818359,"y":224.999893188477,"z":0.0683813244104385}},"dc02e3":{"lock":false,"pos":{"x":-17.1201095581055,"y":1.65479302406311,"z":15.1900033950806},"rot":{"x":359.920104980469,"y":270.000549316406,"z":0.0168415680527687}},"dd2d33":{"lock":false,"pos":{"x":-4.44311237335205,"y":1.59820711612701,"z":-10.4201030731201},"rot":{"x":359.919952392578,"y":270.032531738281,"z":0.0153820477426052}},"dfdabe":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.6156051158905,"z":3.86000037193298},"rot":{"x":359.983154296875,"y":0.000263456080574542,"z":359.920074462891}},"f66b3b":{"lock":false,"pos":{"x":-11.3753042221069,"y":1.56032085418701,"z":-23.930606842041},"rot":{"x":0.0798780247569084,"y":89.9999313354492,"z":359.983123779297}},"f935dd":{"lock":false,"pos":{"x":-20.4018993377686,"y":1.60775220394135,"z":-7.32310104370117},"rot":{"x":359.920104980469,"y":269.9873046875,"z":0.016886418685317}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml index 1bb104f8c..7ea74342c 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.69 + posY: 1.63 posZ: 7.57 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml index 1b64d359b..87939a70f 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.69 + posY: 1.63 posZ: -0.03 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Dining Room aa08d4.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Dining Room aa08d4.yaml index 9a131397b..651633426 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Dining Room aa08d4.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Dining Room aa08d4.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -17.12 - posY: 1.68 + posY: 1.62 posZ: 7.57 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Discovering the Truth 985957.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Discovering the Truth 985957.yaml index 2d8600e59..95cecd97a 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Discovering the Truth 985957.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Discovering the Truth 985957.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -2.69 - posY: 1.66 + posY: 1.6 posZ: -5.05 rotX: 0.02 rotY: 180.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml index f3241c311..9f128ff2d 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -30.22 - posY: 1.7 + posY: 1.64 posZ: -0.03 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Gallery cce10d.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Gallery cce10d.yaml index 0573888d1..7ceccb1f7 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Gallery cce10d.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Gallery cce10d.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -17.12 - posY: 1.67 + posY: 1.62 posZ: -7.7 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml index a3e323f46..dc1da93e8 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.68 + posY: 1.63 posZ: -7.7 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml index 29ac8f56c..d8087816a 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -4.44 - posY: 1.78 + posY: 1.6 posZ: -10.42 rotX: 359.92 rotY: 270.03 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Setup 93a42f.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Setup 93a42f.yaml index 115d8938d..14c3e12ad 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Setup 93a42f.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Card Setup 93a42f.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -0.43 - posY: 1.65 + posY: 1.59 posZ: -10.43 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua index 80ce317d3..c9acd00d0 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua @@ -1,25 +1,25 @@ -name = 'The Last King' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Last King' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.ttslua new file mode 100644 index 000000000..4f6a8a0bc --- /dev/null +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.ttslua @@ -0,0 +1,74 @@ +BYSTANDERS_GUID = "a2d9f5" +BYSTANDERS_RETURN_TO_GUID = "dc02e3" +PLAYAREA_GUID = "721ba2" +LOCATIONS_GUID = { + { guid="aa08d4", offset=Vector({ 0, 0, 2.42 }) }, + { guid="c605d3", offset=Vector({ 0, 0, 2.42 }) }, + { guid="981fa3", offset=Vector({ 3.14, 0, 0 }) }, + { guid="b3c25b", offset=Vector({ 0, 0, -2.31 }) }, + { guid="cce10d", offset=Vector({ 0, 0, -2.31 }) } +} + +function onLoad() + self.createButton({ + label="Set Up", + click_function="setup", + function_owner=self, + position={0,0.1,0.4}, + height=120, + width=400, + scale={x=1.75, y=1.75, z=1.75}, + font_size=100 + }) + + playarea = getObjectFromGUID(PLAYAREA_GUID) + PLAYER_COUNTER = getObjectFromGUID('f182ee') + math.randomseed(os.time()) +end + +function setup(obj, color, alt_click) + local bystanders = getObjectFromGUID(BYSTANDERS_GUID) + if bystanders == nil then + bystanders = getObjectFromGUID(BYSTANDERS_RETURN_TO_GUID) + if bystanders == nil then + printToColor("Bystanders deck not found", color) + return + end + end + + -- place bystanders + bystanders.shuffle() + local cards = bystanders.getObjects() + local bPositions = {} + for i=1,#LOCATIONS_GUID-1 do + local b = cards[i] + local loc = LOCATIONS_GUID[i] + local pos = getObjectFromGUID(loc.guid).getPosition() + loc.offset + bystanders.takeObject({ + guid = b.guid, + position = pos, + smooth = false + }) + table.insert(bPositions, pos) + end + local finalLoc = LOCATIONS_GUID[5] + local finalPos = getObjectFromGUID(finalLoc.guid).getPosition() + + finalLoc.offset + bystanders.remainder.setPosition(finalPos) + table.insert(bPositions, finalPos) + + -- spawn clues + local numClues = PLAYER_COUNTER.getVar('val') + 1 + for i=1,#LOCATIONS_GUID do + local bPos = bPositions[i] + for j=0,numClues-1 do + local pos = bPos + if j < 4 then + pos = pos + Vector(0.3, 0.2, (0.55*j) - 0.8) + else + pos = pos + Vector(0.85, 0.2, (0.55*j) - 3) + end + Global.call("spawnToken", { pos, "clue" }) + end + end +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.yaml new file mode 100644 index 000000000..e558f7590 --- /dev/null +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 0 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1666857701582751097/F7A8A49BBC657C0FD9D147C131855BD5DFCE04AF/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1666857701582751097/F7A8A49BBC657C0FD9D147C131855BD5DFCE04AF/ + WidthScale: 0.0 +Description: Randomly places bystanders at locations and spawns clues on them. +DragSelectable: true +GMNotes: '' +GUID: 47a40e +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Tile The Last King Helper 47a40e.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: The Last King Helper +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -13.65 + posY: 1.6 + posZ: 11.36 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.65 + scaleY: 1.0 + scaleZ: 0.65 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck 041cfc.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck 041cfc.yaml index d58cf9238..9f3149e42 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck 041cfc.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck 041cfc.yaml @@ -135,7 +135,7 @@ Sticky: true Tooltip: true Transform: posX: -2.72 - posY: 1.66 + posY: 1.62 posZ: 0.37 rotX: 0.02 rotY: 180.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Bystanders dc02e3.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Bystanders dc02e3.yaml index 3e369b6f1..5d931be0b 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Bystanders dc02e3.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Bystanders dc02e3.yaml @@ -265,7 +265,7 @@ Sticky: true Tooltip: true Transform: posX: -17.12 - posY: 1.68 + posY: 1.65 posZ: 15.19 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Encounter Deck 9869cb.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Encounter Deck 9869cb.yaml index 2f56ba6f1..828351b2d 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Encounter Deck 9869cb.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Encounter Deck 9869cb.yaml @@ -1155,7 +1155,7 @@ Sticky: true Tooltip: true Transform: posX: -3.93 - posY: 1.74 + posY: 1.73 posZ: 5.76 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality 59504e.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality 59504e.yaml index 2349e327c..f7d4b36fe 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality 59504e.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality 59504e.yaml @@ -411,11 +411,11 @@ Sticky: true Tooltip: true Transform: posX: -3.96 - posY: 1.65 + posY: 1.67 posZ: -10.44 rotX: 359.92 rotY: 270.0 - rotZ: 180.02 + rotZ: 180.01 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua index fd833106f..9852aeb27 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua @@ -1,25 +1,25 @@ -name = 'Echoes of the Past' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Echoes of the Past' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua index e78b2e78a..f7109dddb 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua @@ -1,25 +1,25 @@ -name = 'The Unspeakable Oath' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Unspeakable Oath' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua index bacd5051f..e092a5769 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua @@ -1,25 +1,25 @@ -name = 'A Phantom of Truth' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'A Phantom of Truth' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua index c36627e17..9607689ac 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua @@ -1,25 +1,25 @@ -name = 'The Pallid Mask' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Pallid Mask' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.yaml index 745651a35..645786d05 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.yaml @@ -75,7 +75,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: false LuaScript: !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua' -LuaScriptState: '{"ml":{"014bd6":{"lock":false,"pos":{"x":-25.1036,"y":1.7321,"z":-15.3068},"rot":{"x":359.9212,"y":270.0045,"z":0.0164}},"04d6e6":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":0.0169,"y":179.9999,"z":0.0799}},"106f19":{"lock":false,"pos":{"x":-23.6766,"y":1.6885,"z":7.57},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"1163a0":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9999,"z":0.0168}},"20c21d":{"lock":false,"pos":{"x":-3.6194,"y":1.582,"z":-15.7683},"rot":{"x":359.9209,"y":269.9998,"z":0.0193}},"20de8b":{"lock":false,"pos":{"x":-30.2243,"y":1.6931,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"38d12d":{"lock":false,"pos":{"x":-23.6762,"y":1.6862,"z":-0.0302},"rot":{"x":359.9201,"y":270.0016,"z":0.0166}},"425d3a":{"lock":false,"pos":{"x":-5.9079,"y":1.4895,"z":-15.8996},"rot":{"x":359.9821,"y":0.0112,"z":5.6744}},"5b38c6":{"lock":false,"pos":{"x":-23.6766,"y":1.6122,"z":-7.7},"rot":{"x":359.9551,"y":225.2476,"z":0.0682}},"5bd383":{"lock":false,"pos":{"x":0.8537,"y":1.3938,"z":-4.7761},"rot":{"x":359.9832,"y":0,"z":359.9197}},"5bebe6":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":0.0169,"y":179.9998,"z":0.0799}},"69eae5":{"lock":false,"pos":{"x":-18.5802,"y":1.7604,"z":-7.6925},"rot":{"x":358.7954,"y":269.9853,"z":0.0269}},"73720d":{"lock":false,"pos":{"x":-26.9588,"y":1.6168,"z":-7.6633},"rot":{"x":359.9201,"y":270.0027,"z":0.0169}},"7c8232":{"lock":false,"pos":{"x":1.0476,"y":1.3951,"z":0.5264},"rot":{"x":359.9196,"y":269.9843,"z":0.0169}},"8d134d":{"lock":false,"pos":{"x":-33.6312,"y":1.6262,"z":-7.6001},"rot":{"x":0.0799,"y":90,"z":359.9831}},"93a42f":{"lock":false,"pos":{"x":-0.3529,"y":1.6506,"z":-10.4336},"rot":{"x":359.9197,"y":269.999,"z":0.0168}},"93d8de":{"lock":false,"pos":{"x":-23.6765,"y":1.6111,"z":-11.51},"rot":{"x":0.0169,"y":179.9999,"z":0.0799}},"b52eaf":{"lock":false,"pos":{"x":-2.8742,"y":1.6617,"z":15.2703},"rot":{"x":359.9198,"y":269.9969,"z":0.0165}},"c0362a":{"lock":false,"pos":{"x":-17.1168,"y":1.6879,"z":-7.6998},"rot":{"x":359.4389,"y":269.994,"z":0.0168}},"c2651e":{"lock":false,"pos":{"x":-25.09,"y":1.7365,"z":-0.014},"rot":{"x":359.9211,"y":270.0295,"z":0.0163}},"c380e4":{"lock":false,"pos":{"x":-3.9277,"y":1.7717,"z":5.7572},"rot":{"x":359.9197,"y":269.9998,"z":180.0168}},"c647a3":{"lock":false,"pos":{"x":-36.7733,"y":1.7022,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"c7ee02":{"lock":false,"pos":{"x":-4.3056,"y":1.712,"z":15.2833},"rot":{"x":0.0516,"y":270.0387,"z":359.8142}},"d4528c":{"lock":false,"pos":{"x":-20.4212,"y":1.6077,"z":-7.6621},"rot":{"x":359.9198,"y":270.0008,"z":0.0158}},"db972a":{"lock":false,"pos":{"x":-23.6765,"y":1.6817,"z":-15.2798},"rot":{"x":359.9201,"y":270.0013,"z":0.0165}}}}' +LuaScriptState: '{"ml":{"014bd6":{"lock":false,"pos":{"x":-25.1036396026611,"y":1.67355036735535,"z":-15.3067989349365},"rot":{"x":359.921264648438,"y":270.004333496094,"z":0.0162953250110149}},"04d6e6":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.61560475826263,"z":3.8600001335144},"rot":{"x":0.0168393440544605,"y":179.999862670898,"z":0.0799407586455345}},"106f19":{"lock":false,"pos":{"x":-23.6766166687012,"y":1.63030028343201,"z":7.57000207901001},"rot":{"x":359.920104980469,"y":269.999877929688,"z":0.0168405137956142}},"1163a0":{"lock":false,"pos":{"x":-3.9560170173645,"y":1.59753942489624,"z":-10.441198348999},"rot":{"x":359.919738769531,"y":269.999908447266,"z":0.0168381482362747}},"20c21d":{"lock":false,"pos":{"x":-3.61939096450806,"y":1.58189785480499,"z":-15.7683153152466},"rot":{"x":359.919738769531,"y":269.999908447266,"z":0.0168379135429859}},"20de8b":{"lock":false,"pos":{"x":-30.2243175506592,"y":1.63494288921356,"z":-7.69999742507935},"rot":{"x":359.920104980469,"y":269.999877929688,"z":0.0168403834104538}},"38d12d":{"lock":false,"pos":{"x":-23.6762142181396,"y":1.62806081771851,"z":-0.0302023328840733},"rot":{"x":359.920166015625,"y":270.001586914063,"z":0.0164922587573528}},"425d3a":{"lock":false,"pos":{"x":-6.58480930328369,"y":1.40212249755859,"z":-12.006649017334},"rot":{"x":359.983154296875,"y":-5.77712453377899E-05,"z":359.919677734375}},"5b38c6":{"lock":false,"pos":{"x":-23.6765995025635,"y":1.61220765113831,"z":-7.69999980926514},"rot":{"x":359.955108642578,"y":225.247604370117,"z":0.0682073757052422}},"5bd383":{"lock":false,"pos":{"x":0.853700518608093,"y":1.39382791519165,"z":-4.77610015869141},"rot":{"x":359.983154296875,"y":-3.55558381670562E-06,"z":359.919677734375}},"5bebe6":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.61334478855133,"z":-3.82999968528748},"rot":{"x":0.0168396066874266,"y":179.999786376953,"z":0.0799542590975761}},"69eae5":{"lock":false,"pos":{"x":-18.5802173614502,"y":1.70447313785553,"z":-7.69251012802124},"rot":{"x":358.952117919922,"y":269.981994628906,"z":0.0179013442248106}},"73720d":{"lock":false,"pos":{"x":-26.9587993621826,"y":1.61679530143738,"z":-7.66330099105835},"rot":{"x":359.920104980469,"y":270.002655029297,"z":0.0168635658919811}},"7c8232":{"lock":false,"pos":{"x":1.18845331668854,"y":1.3958306312561,"z":3.6325581073761},"rot":{"x":359.919647216797,"y":270.000885009766,"z":0.0168734136968851}},"8d134d":{"lock":false,"pos":{"x":-33.6311988830566,"y":1.6261180639267,"z":-7.60010099411011},"rot":{"x":0.07989452034235,"y":89.9999771118164,"z":359.983123779297}},"93a42f":{"lock":false,"pos":{"x":-0.352916568517685,"y":1.59249484539032,"z":-10.4335975646973},"rot":{"x":359.919738769531,"y":269.998992919922,"z":0.0168393421918154}},"93d8de":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.61108767986298,"z":-11.5100021362305},"rot":{"x":0.016839437186718,"y":179.999908447266,"z":0.0799364894628525}},"b52eaf":{"lock":false,"pos":{"x":-2.87421679496765,"y":1.60357391834259,"z":15.2703056335449},"rot":{"x":359.919799804688,"y":269.996887207031,"z":0.0164822842925787}},"c0362a":{"lock":false,"pos":{"x":-17.1168079376221,"y":1.64247798919678,"z":-7.69977378845215},"rot":{"x":358.954650878906,"y":269.990447998047,"z":0.0169564709067345}},"c2651e":{"lock":false,"pos":{"x":-25.0900325775146,"y":1.67803597450256,"z":-0.0140054672956467},"rot":{"x":359.921234130859,"y":270.029602050781,"z":0.0162676814943552}},"c380e4":{"lock":false,"pos":{"x":-3.92770743370056,"y":1.76363480091095,"z":5.7572021484375},"rot":{"x":359.919738769531,"y":269.999786376953,"z":180.016815185547}},"c647a3":{"lock":false,"pos":{"x":-36.7733154296875,"y":1.64407503604889,"z":-7.69999742507935},"rot":{"x":359.920104980469,"y":269.999877929688,"z":0.0168410502374172}},"c7ee02":{"lock":false,"pos":{"x":-4.3056173324585,"y":1.65352654457092,"z":15.2833070755005},"rot":{"x":0.0813425332307816,"y":270.038696289063,"z":359.983245849609}},"d4528c":{"lock":false,"pos":{"x":-20.4211959838867,"y":1.60767769813538,"z":-7.66212940216064},"rot":{"x":359.919281005859,"y":270.000152587891,"z":0.0172294210642576}},"db972a":{"lock":false,"pos":{"x":-23.676513671875,"y":1.62357914447784,"z":-15.2798013687134},"rot":{"x":359.920166015625,"y":270.001281738281,"z":0.0164680276066065}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag CloisterKnight's Hall Randomizer 5bd383.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag CloisterKnight's Hall Randomizer 5bd383.yaml index a05bdbfd5..f30ec3a70 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag CloisterKnight's Hall Randomizer 5bd383.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag CloisterKnight's Hall Randomizer 5bd383.yaml @@ -2,7 +2,7 @@ Autoraise: true ColorDiffuse: b: 0.5792406 g: 0.6313726 - r: 0.04705876 + r: 0.04705874 ContainedObjects: - !include 'Bag CloisterKnight''s Hall Randomizer 5bd383/Deck CloisterKnight''s Hall b2a2df.yaml' diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag New Chaos Token 425d3a.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag New Chaos Token 425d3a.yaml index 2f611be4d..45a4b8158 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag New Chaos Token 425d3a.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag New Chaos Token 425d3a.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.07843689 - g: 0.07843689 - r: 0.3021676 + b: 0.07843686 + g: 0.07843686 + r: 0.302167565 ContainedObjects: - !include 'Bag New Chaos Token 425d3a/Custom_Tile 81a1d7.yaml' - !include 'Bag New Chaos Token 425d3a/Custom_Tile 2460df.yaml' @@ -29,12 +29,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: -5.91 - posY: 1.49 - posZ: -15.9 + posX: -6.58 + posY: 1.4 + posZ: -12.01 rotX: 359.98 - rotY: 0.01 - rotZ: 5.68 + rotY: 0.0 + rotZ: 359.92 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232.yaml index caf6d2385..2e6415cad 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.0509800762 + b: 0.05098004 g: 0.6313726 - r: 0.169647127 + r: 0.169647068 ContainedObjects: - !include 'Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.yaml' - !include 'Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.yaml' @@ -28,11 +28,11 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 1.05 + posX: 1.19 posY: 1.4 - posZ: 0.53 + posZ: 3.63 rotX: 359.92 - rotY: 269.98 + rotY: 270.0 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua index 512f2eed0..4d4017455 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua index 512f2eed0..4d4017455 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Abbey Church 106f19.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Abbey Church 106f19.yaml index ee4315194..805412781 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Abbey Church 106f19.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Abbey Church 106f19.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.69 + posY: 1.63 posZ: 7.57 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps 38d12d.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps 38d12d.yaml index 1e0d517df..d82893066 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps 38d12d.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps 38d12d.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.69 + posY: 1.63 posZ: -0.03 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps c2651e.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps c2651e.yaml index 312ba4861..43ef52bfb 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps c2651e.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps c2651e.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -25.09 - posY: 1.74 + posY: 1.68 posZ: -0.01 rotX: 359.92 rotY: 270.03 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique b52eaf.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique b52eaf.yaml index b3f6193b6..69cb9d242 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique b52eaf.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique b52eaf.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -2.87 - posY: 1.66 + posY: 1.6 posZ: 15.27 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique c7ee02.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique c7ee02.yaml index b3ce83df6..a938cdf2a 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique c7ee02.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique c7ee02.yaml @@ -34,11 +34,11 @@ Sticky: true Tooltip: true Transform: posX: -4.31 - posY: 1.71 + posY: 1.65 posZ: 15.28 - rotX: 0.05 + rotX: 0.08 rotY: 270.04 - rotZ: 359.82 + rotZ: 359.98 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Grand Rue 20de8b.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Grand Rue 20de8b.yaml index 9efd420e5..5af84794b 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Grand Rue 20de8b.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Grand Rue 20de8b.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -30.22 - posY: 1.69 + posY: 1.63 posZ: -7.7 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower 69eae5.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower 69eae5.yaml index 6d0462f0b..36d1c4541 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower 69eae5.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower 69eae5.yaml @@ -34,9 +34,9 @@ Sticky: true Tooltip: true Transform: posX: -18.58 - posY: 1.77 + posY: 1.7 posZ: -7.69 - rotX: 359.27 + rotX: 358.95 rotY: 269.98 rotZ: 0.02 scaleX: 1.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower c0362a.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower c0362a.yaml index 0e1c5263c..ba2e202a7 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower c0362a.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower c0362a.yaml @@ -34,9 +34,9 @@ Sticky: true Tooltip: true Transform: posX: -17.12 - posY: 1.69 + posY: 1.64 posZ: -7.7 - rotX: 359.27 + rotX: 358.95 rotY: 269.99 rotZ: 0.02 scaleX: 1.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall 014bd6.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall 014bd6.yaml index 7ce1c9955..e6a5f30f1 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall 014bd6.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall 014bd6.yaml @@ -34,10 +34,10 @@ Sticky: true Tooltip: true Transform: posX: -25.1 - posY: 1.73 + posY: 1.67 posZ: -15.31 rotX: 359.92 - rotY: 270.01 + rotY: 270.0 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall db972a.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall db972a.yaml index 3abcbcfd3..5198c5e99 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall db972a.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall db972a.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.68 + posY: 1.62 posZ: -15.28 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Porte de l'Avancée c647a3.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Porte de l'Avancée c647a3.yaml index 4b294d091..6da357e9e 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Porte de l'Avancée c647a3.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Porte de l'Avancée c647a3.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -36.77 - posY: 1.7 + posY: 1.64 posZ: -7.7 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Scenario 1163a0.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Scenario 1163a0.yaml index db72c59db..5d1717b53 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Scenario 1163a0.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Scenario 1163a0.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -3.96 - posY: 1.66 + posY: 1.6 posZ: -10.44 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Setup 93a42f.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Setup 93a42f.yaml index a9cb9d899..1096a6f95 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Setup 93a42f.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Setup 93a42f.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -0.35 - posY: 1.65 + posY: 1.59 posZ: -10.43 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua index a505ccca6..78350373e 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua @@ -1,25 +1,25 @@ -name = 'Black Stars Rise' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Black Stars Rise' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Deck Encounter Deck c380e4.yaml b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Deck Encounter Deck c380e4.yaml index 2984cb377..e1e909c25 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Deck Encounter Deck c380e4.yaml +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Deck Encounter Deck c380e4.yaml @@ -1523,10 +1523,10 @@ Sticky: true Tooltip: true Transform: posX: -3.93 - posY: 1.78 + posY: 1.76 posZ: 5.76 rotX: 359.92 - rotY: 269.99 + rotY: 270.0 rotZ: 180.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua index ffa409a5f..710b4a84e 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua @@ -1,25 +1,25 @@ -name = 'Dim Carcosa' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Dim Carcosa' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Tile Carcosa Campaign Log ae8317.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Tile Carcosa Campaign Log ae8317.ttslua index 7a861eb36..108024431 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Tile Carcosa Campaign Log ae8317.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Tile Carcosa Campaign Log ae8317.ttslua @@ -1,755 +1,755 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --Doubt 1 - { - pos = {-0.482,0.1,0.776}, - size = 200, - state = false - }, - --Doubt 2 - { - pos = {-0.43,0.1,0.776}, - size = 200, - state = false - }, - --Doubt 3 - { - pos = {-0.38,0.1,0.775}, - size = 200, - state = false - }, - --Doubt 4 - { - pos = {-0.325,0.1,0.778}, - size = 200, - state = false - }, - --Doubt 5 - { - pos = {-0.27,0.1,0.779}, - size = 200, - state = false - }, - --Doubt 6 - { - pos = {-0.219,0.1,0.778}, - size = 200, - state = false - }, - --Doubt 7 - { - pos = {-0.168,0.1,0.782}, - size = 200, - state = false - }, - --Doubt 8 - { - pos = {-0.111,0.1,0.783}, - size = 200, - state = false - }, - --Conviction 1 - { - pos = {-0.736,0.1,0.868}, - size = 200, - state = false - }, - --Conviction 2 - { - pos = {-0.68,0.1,0.869}, - size = 200, - state = false - }, - --Conviction 3 - { - pos = {-0.626,0.1,0.869}, - size = 200, - state = false - }, - --Conviction 4 - { - pos = {-0.574,0.1,0.874}, - size = 200, - state = false - }, - --Conviction 5 - { - pos = {-0.519,0.1,0.874}, - size = 200, - state = false - }, - --Conviction 6 - { - pos = {-0.467,0.1,0.879}, - size = 200, - state = false - }, - --Conviction 7 - { - pos = {-0.416,0.1,0.876}, - size = 200, - state = false - }, - --Conviction 8 - { - pos = {-0.357,0.1,0.879}, - size = 200, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Chasing The Stranger - { - pos = {0.414,0.1,0.106}, - size = 500, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.38,0.1,0.339}, - rows =16, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --VIPs Interviewed - { - pos = {0.43,0.1,0.338}, - rows = 6, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --VIPs Slain - { - pos = {0.43,0.1,0.643}, - rows = 6, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --Doubt 1 + { + pos = {-0.482,0.1,0.776}, + size = 200, + state = false + }, + --Doubt 2 + { + pos = {-0.43,0.1,0.776}, + size = 200, + state = false + }, + --Doubt 3 + { + pos = {-0.38,0.1,0.775}, + size = 200, + state = false + }, + --Doubt 4 + { + pos = {-0.325,0.1,0.778}, + size = 200, + state = false + }, + --Doubt 5 + { + pos = {-0.27,0.1,0.779}, + size = 200, + state = false + }, + --Doubt 6 + { + pos = {-0.219,0.1,0.778}, + size = 200, + state = false + }, + --Doubt 7 + { + pos = {-0.168,0.1,0.782}, + size = 200, + state = false + }, + --Doubt 8 + { + pos = {-0.111,0.1,0.783}, + size = 200, + state = false + }, + --Conviction 1 + { + pos = {-0.736,0.1,0.868}, + size = 200, + state = false + }, + --Conviction 2 + { + pos = {-0.68,0.1,0.869}, + size = 200, + state = false + }, + --Conviction 3 + { + pos = {-0.626,0.1,0.869}, + size = 200, + state = false + }, + --Conviction 4 + { + pos = {-0.574,0.1,0.874}, + size = 200, + state = false + }, + --Conviction 5 + { + pos = {-0.519,0.1,0.874}, + size = 200, + state = false + }, + --Conviction 6 + { + pos = {-0.467,0.1,0.879}, + size = 200, + state = false + }, + --Conviction 7 + { + pos = {-0.416,0.1,0.876}, + size = 200, + state = false + }, + --Conviction 8 + { + pos = {-0.357,0.1,0.879}, + size = 200, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Chasing The Stranger + { + pos = {0.414,0.1,0.106}, + size = 500, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.38,0.1,0.339}, + rows =16, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --VIPs Interviewed + { + pos = {0.43,0.1,0.338}, + rows = 6, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --VIPs Slain + { + pos = {0.43,0.1,0.643}, + rows = 6, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d.ttslua index 7ba1823d7..b855e99ad 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d.ttslua @@ -1,504 +1,504 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8/Custom_Tile Core Difficulty 527f29.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8/Custom_Tile Core Difficulty 527f29.ttslua index ce26fb1d9..c7ea585c8 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8/Custom_Tile Core Difficulty 527f29.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8/Custom_Tile Core Difficulty 527f29.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c.ttslua index d3a73c99a..34e9ba52b 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c/Custom_Tile Core Difficulty 47f3de.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c/Custom_Tile Core Difficulty 47f3de.ttslua index ce26fb1d9..c7ea585c8 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c/Custom_Tile Core Difficulty 47f3de.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c/Custom_Tile Core Difficulty 47f3de.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 3 Return to The Devourer Below 604753.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 3 Return to The Devourer Below 604753.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 3 Return to The Devourer Below 604753.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 3 Return to The Devourer Below 604753.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua index 40b104bf0..a86ae03a8 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua @@ -1,679 +1,679 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First checkbox - { - pos = {-0.62,0.1,0.056}, - size = 400, - state = false - }, - --Second checkbox - { - pos = {-0.629,0.1,0.199}, - size = 400, - state = false - }, - --Third checkbox - { - pos = {-0.594,0.1,0.355}, - size = 400, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Killed Textbox - { - pos = {-0.4,0.1,0.68}, - rows = 8, - width = 3800, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {0.507,0.1,0.15}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists interrogated - { - pos = {0.507,0.1,0.509}, - rows = 4, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists got away - { - pos = {0.507,0.1,0.771}, - rows = 4, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First checkbox + { + pos = {-0.62,0.1,0.056}, + size = 400, + state = false + }, + --Second checkbox + { + pos = {-0.629,0.1,0.199}, + size = 400, + state = false + }, + --Third checkbox + { + pos = {-0.594,0.1,0.355}, + size = 400, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Killed Textbox + { + pos = {-0.4,0.1,0.68}, + rows = 8, + width = 3800, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {0.507,0.1,0.15}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists interrogated + { + pos = {0.507,0.1,0.509}, + rows = 4, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists got away + { + pos = {0.507,0.1,0.771}, + rows = 4, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Rogue 68d7b8.ttslua b/unpacked/Custom_Model_Bag Rogue 68d7b8.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Rogue 68d7b8.ttslua +++ b/unpacked/Custom_Model_Bag Rogue 68d7b8.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Rogue 68d7b8/Custom_Model_Bag Rogue 21d547.ttslua b/unpacked/Custom_Model_Bag Rogue 68d7b8/Custom_Model_Bag Rogue 21d547.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Rogue 68d7b8/Custom_Model_Bag Rogue 21d547.ttslua +++ b/unpacked/Custom_Model_Bag Rogue 68d7b8/Custom_Model_Bag Rogue 21d547.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d.ttslua b/unpacked/Custom_Model_Bag Rogue deaa6d.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d.ttslua +++ b/unpacked/Custom_Model_Bag Rogue deaa6d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d.yaml index b69637410..c4606f156 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d.yaml @@ -4,9 +4,9 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49.yaml' -- !include 'Custom_Model_Bag Rogue deaa6d/Card False Covenant (2) 3442f5.yaml' -- !include 'Custom_Model_Bag Rogue deaa6d/Card Skeptic (1) 37882c.yaml' +- !include 'Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.yaml' +- !include 'Custom_Model_Bag Rogue deaa6d/Card Under Surveillance (1) cc8321.yaml' +- !include 'Custom_Model_Bag Rogue deaa6d/Card Priest of Two Faiths (1) 48e4a3.yaml' - !include 'Custom_Model_Bag Rogue deaa6d/Card Another Day, Another Dollar (3) 006d44.yaml' - !include 'Custom_Model_Bag Rogue deaa6d/Card Ace in the Hole (3) 074858.yaml' - !include 'Custom_Model_Bag Rogue deaa6d/Card Cheap Shot (2) 0b963c.yaml' @@ -30,6 +30,8 @@ ContainedObjects: - !include 'Custom_Model_Bag Rogue deaa6d/Card Cat Burglar (1) 2fe723.yaml' - !include 'Custom_Model_Bag Rogue deaa6d/Card Three Aces (1) 30062e.yaml' - !include 'Custom_Model_Bag Rogue deaa6d/Card Sure Gamble (3) 308be1.yaml' +- !include 'Custom_Model_Bag Rogue deaa6d/Card False Covenant (2) 3442f5.yaml' +- !include 'Custom_Model_Bag Rogue deaa6d/Card Skeptic (1) 37882c.yaml' - !include 'Custom_Model_Bag Rogue deaa6d/Card Cheat Death (5) 3add54.yaml' - !include 'Custom_Model_Bag Rogue deaa6d/Card Think on Your Feet (2) 3e0653.yaml' - !include 'Custom_Model_Bag Rogue deaa6d/Card Slip Away (2) 4a45c6.yaml' @@ -102,7 +104,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: true LuaScript: !include 'Custom_Model_Bag Rogue deaa6d.ttslua' -LuaScriptState: '{"ml":{"006d44":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208092760294676,"y":269.999420166016,"z":0.0167703833431005}},"074858":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30159258842468,"z":-70.4202041625977},"rot":{"x":0.0208090171217918,"y":269.998901367188,"z":0.0167705975472927}},"098da7":{"lock":false,"pos":{"x":58.0935859680176,"y":1.30816042423248,"z":-54.3712768554688},"rot":{"x":0.0208071302622557,"y":270.004486083984,"z":0.0167728867381811}},"0b963c":{"lock":false,"pos":{"x":52.944221496582,"y":1.30697858333588,"z":-52.0198783874512},"rot":{"x":0.0208123680204153,"y":269.987548828125,"z":0.0167668387293816}},"0db666":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768872261047,"z":-63.5084457397461},"rot":{"x":0.0208093971014023,"y":269.999389648438,"z":0.0167707167565823}},"0e0530":{"lock":false,"pos":{"x":32.9852981567383,"y":1.30107951164246,"z":-47.4095573425293},"rot":{"x":0.0208172202110291,"y":269.970947265625,"z":0.0167613811790943}},"0e72b6":{"lock":false,"pos":{"x":32.985279083252,"y":1.29906010627747,"z":-54.3083381652832},"rot":{"x":0.02082066424191,"y":269.958343505859,"z":0.0167555846273899}},"0ec9bf":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29767024517059,"z":-68.119873046875},"rot":{"x":0.0208085533231497,"y":269.999542236328,"z":0.0167709365487099}},"0feb74":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208167433738709,"y":269.970153808594,"z":0.0167600121349096}},"117b7c":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208026114851236,"y":270.02294921875,"z":0.0167798530310392}},"15643b":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208025388419628,"y":270.023132324219,"z":0.0167798269540071}},"18927e":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29632365703583,"z":-72.719970703125},"rot":{"x":0.0208086185157299,"y":269.999572753906,"z":0.0167709179222584}},"1bd139":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.02080262824893,"y":270.02294921875,"z":0.0167800076305866}},"1dbc95":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208087600767612,"y":269.999450683594,"z":0.0167709533125162}},"2423e7":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170965194702,"z":-54.3199996948242},"rot":{"x":0.0208087954670191,"y":269.999481201172,"z":0.0167708713561296}},"26a3bf":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29230272769928,"z":-81.9085083007813},"rot":{"x":0.020808506757021,"y":269.999267578125,"z":0.0167694017291069}},"27446e":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036318302155,"z":-58.9200057983398},"rot":{"x":0.0208086427301168,"y":269.999481201172,"z":0.0167708210647106}},"2aeb8a":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29497730731964,"z":-77.3199081420898},"rot":{"x":0.0208017602562904,"y":270.023284912109,"z":0.0167795997112989}},"2cfa4f":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293905735016,"z":-65.8202133178711},"rot":{"x":0.0208086222410202,"y":270.000274658203,"z":0.0167712960392237}},"2f4db2":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208032093942165,"y":270.019836425781,"z":0.01677774079144}},"2fba3b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208088997751474,"y":270.000610351563,"z":0.0167708750814199}},"2fe723":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208086147904396,"y":269.999450683594,"z":0.0167707521468401}},"30062e":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30883598327637,"z":-52.0709686279297},"rot":{"x":0.0208017639815807,"y":270.022705078125,"z":0.0167791415005922}},"308be1":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202514648438},"rot":{"x":0.0208088271319866,"y":269.998748779297,"z":0.0167703907936811}},"3442f5":{"lock":false,"pos":{"x":40.2920913696289,"y":1.29363143444061,"z":-81.9201049804688},"rot":{"x":0.0208085235208273,"y":269.998931884766,"z":0.0167708415538073}},"37882c":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950927734375,"z":-49.7709617614746},"rot":{"x":0.0208085048943758,"y":269.998962402344,"z":0.0167708918452263}},"3add54":{"lock":false,"pos":{"x":52.9462394714355,"y":1.29822707176209,"z":-81.9204635620117},"rot":{"x":0.0208089258521795,"y":269.999328613281,"z":0.0167710725218058}},"3bd955":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208088047802448,"y":269.998901367188,"z":0.0167707744985819}},"3e0653":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202163696289},"rot":{"x":0.0208083707839251,"y":270.000396728516,"z":0.0167714115232229}},"4a45c6":{"lock":false,"pos":{"x":52.9442176818848,"y":1.30428564548492,"z":-61.2198486328125},"rot":{"x":0.0208134297281504,"y":269.98388671875,"z":0.0167652182281017}},"4b4df3":{"lock":false,"pos":{"x":32.9852867126465,"y":1.29973292350769,"z":-52.0095596313477},"rot":{"x":0.0208076201379299,"y":270.004333496094,"z":0.016772111877799}},"4eb231":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889965057373,"z":-79.620246887207},"rot":{"x":0.020808657631278,"y":269.999267578125,"z":0.0167710408568382}},"5065a6":{"lock":false,"pos":{"x":40.2900619506836,"y":1.29969000816345,"z":-61.2195243835449},"rot":{"x":0.0208149272948503,"y":269.978210449219,"z":0.0167631711810827}},"587bc5":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.0208018943667412,"y":270.023376464844,"z":0.016779126599431}},"5f19e0":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30361223220825,"z":-63.5203590393066},"rot":{"x":0.0208082981407642,"y":270.000549316406,"z":0.0167712233960629}},"5fe780":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208087954670191,"y":269.99951171875,"z":0.0167712066322565}},"620b6e":{"lock":false,"pos":{"x":52.9442100524902,"y":1.3063051700592,"z":-54.3203468322754},"rot":{"x":0.0208082180470228,"y":270.000732421875,"z":0.0167711284011602}},"62d930":{"lock":false,"pos":{"x":32.985279083252,"y":1.29973292350769,"z":-52.0095634460449},"rot":{"x":0.0208149123936892,"y":269.978515625,"z":0.0167629700154066}},"63f145":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208105612546206,"y":269.993408203125,"z":0.0167683623731136}},"705e27":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29095637798309,"z":-86.5083084106445},"rot":{"x":0.0208175927400589,"y":269.971008300781,"z":0.0167607720941305}},"731d2a":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372941493988,"z":-47.4200057983398},"rot":{"x":0.0208088979125023,"y":269.999450683594,"z":0.0167707968503237}},"7b918b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.2956690788269,"z":-70.4083023071289},"rot":{"x":0.0208081752061844,"y":270.000061035156,"z":0.0167697407305241}},"7baf75":{"lock":false,"pos":{"x":52.9442176818848,"y":1.30091941356659,"z":-72.7198333740234},"rot":{"x":0.020814711228013,"y":269.979187011719,"z":0.0167635828256607}},"7d3a27":{"lock":false,"pos":{"x":58.0996894836426,"y":1.30546903610229,"z":-63.5731620788574},"rot":{"x":0.0208336543291807,"y":269.915924072266,"z":0.016740545630455}},"7f27d6":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.608283996582},"rot":{"x":0.0208184029906988,"y":269.965637207031,"z":0.0167571827769279}},"8bec05":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083892822266},"rot":{"x":0.0208080857992172,"y":269.999450683594,"z":0.0167705006897449}},"91da6b":{"lock":false,"pos":{"x":36.6086463928223,"y":1.29028046131134,"z":-88.7977447509766},"rot":{"x":0.0208183489739895,"y":269.965606689453,"z":0.0167574789375067}},"96ed77":{"lock":false,"pos":{"x":36.6243705749512,"y":1.29364931583405,"z":-77.3084411621094},"rot":{"x":0.0208086725324392,"y":270,"z":0.0167709607630968}},"981f41":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29701554775238,"z":-65.8082962036133},"rot":{"x":0.0208085309714079,"y":269.999481201172,"z":0.0167695712298155}},"982716":{"lock":false,"pos":{"x":58.099666595459,"y":1.3074893951416,"z":-56.6709747314453},"rot":{"x":0.0208121724426746,"y":269.988311767578,"z":0.0167665407061577}},"9dd911":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208017807453871,"y":270.023010253906,"z":0.0167793035507202}},"a6af13":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.0208080317825079,"y":269.999450683594,"z":0.0167706310749054}},"b05089":{"lock":false,"pos":{"x":40.6759,"y":1.3023,"z":-56.6129},"rot":{"x":0.0208,"y":269.9999,"z":0.0168}},"b3cad4":{"lock":false,"pos":{"x":58.099666595459,"y":1.30816268920898,"z":-54.3709716796875},"rot":{"x":0.0208022575825453,"y":270.022705078125,"z":0.016779026016593}},"b5e5f1":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29095637798309,"z":-86.5082931518555},"rot":{"x":0.02080830745399,"y":269.999481201172,"z":0.0167694929987192}},"b81c84":{"lock":false,"pos":{"x":36.6243362426758,"y":1.296342253685,"z":-68.1082992553711},"rot":{"x":0.0208079889416695,"y":269.999450683594,"z":0.0167707167565823}},"bab03b":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29430389404297,"z":-79.6199111938477},"rot":{"x":0.0208016652613878,"y":270.023193359375,"z":0.0167794395238161}},"cb4730":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208081230521202,"y":270.001678466797,"z":0.0167717300355434}},"cdbb37":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30832493305206,"z":-47.420295715332},"rot":{"x":0.0208085924386978,"y":269.99951171875,"z":0.0167709868401289}},"cdd6aa":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208085924386978,"y":269.999481201172,"z":0.0167710017412901}},"ce1b89":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093325138092,"z":-91.1157989501953},"rot":{"x":0.0208020973950624,"y":270.02294921875,"z":0.016779949888587}},"d041f0":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208086390048265,"y":269.99951171875,"z":0.0167709290981293}},"d4dbc7":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.0208092778921127,"y":269.999420166016,"z":0.0167703665792942}},"d753d7":{"lock":false,"pos":{"x":58.098804473877,"y":1.31018531322479,"z":-47.4597969055176},"rot":{"x":0.0208099950104952,"y":269.994689941406,"z":0.0167692359536886}},"d7dbac":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29162967205048,"z":-84.2082901000977},"rot":{"x":0.0208083968609571,"y":269.999542236328,"z":0.0167703125625849}},"de40c8":{"lock":false,"pos":{"x":58.1010513305664,"y":1.30613505840302,"z":-61.2994766235352},"rot":{"x":0.0208303611725569,"y":269.925231933594,"z":0.0167440343648195}},"e1c0f8":{"lock":false,"pos":{"x":32.985279083252,"y":1.29838681221008,"z":-56.608341217041},"rot":{"x":0.0208079852163792,"y":270.002868652344,"z":0.0167718678712845}},"e503ce":{"lock":false,"pos":{"x":52.9442176818848,"y":1.3002462387085,"z":-75.0198440551758},"rot":{"x":0.0208148825913668,"y":269.978363037109,"z":0.0167633462697268}},"e7f37b":{"lock":false,"pos":{"x":32.985279083252,"y":1.30040621757507,"z":-49.7095642089844},"rot":{"x":0.0208172537386417,"y":269.970855712891,"z":0.0167601369321346}},"e80bd8":{"lock":false,"pos":{"x":40.2900543212891,"y":1.29699695110321,"z":-70.4198608398438},"rot":{"x":0.0208088792860508,"y":269.999572753906,"z":0.0167709421366453}},"e84232":{"lock":false,"pos":{"x":44.229,"y":1.2968,"z":-79.6006},"rot":{"x":0.0208,"y":269.9999,"z":0.0168}},"e92e98":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30563187599182,"z":-56.6203498840332},"rot":{"x":0.0208081025630236,"y":270.000732421875,"z":0.0167712345719337}},"eaa415":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30765163898468,"z":-49.7202949523926},"rot":{"x":0.0208086669445038,"y":269.99951171875,"z":0.0167709980159998}},"ecfa42":{"lock":false,"pos":{"x":36.6082725524902,"y":1.28960525989532,"z":-91.1042709350586},"rot":{"x":0.0208169128745794,"y":269.971038818359,"z":0.0167596116662025}},"edd6c4":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.0208086650818586,"y":269.999542236328,"z":0.0167708732187748}},"eef1e6":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30024588108063,"z":-75.0203475952148},"rot":{"x":0.0208095647394657,"y":269.998809814453,"z":0.0167709831148386}},"f2508d":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208083130419254,"y":270.000610351563,"z":0.0167713221162558}},"f4434f":{"lock":false,"pos":{"x":52.944206237793,"y":1.30697846412659,"z":-52.0203437805176},"rot":{"x":0.0208083316683769,"y":270.000793457031,"z":0.016771350055933}},"f57af7":{"lock":false,"pos":{"x":40.2900390625,"y":1.29565036296844,"z":-75.0200042724609},"rot":{"x":0.0208017565310001,"y":270.023376464844,"z":0.0167798902839422}},"f8dc01":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208083726465702,"y":270.001556396484,"z":0.0167714580893517}},"fb4e3f":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208082739263773,"y":270.000579833984,"z":0.0167713910341263}},"fc20b9":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30172824859619,"z":-49.7084617614746},"rot":{"x":0.0208157207816839,"y":269.975402832031,"z":0.016761913895607}},"fc82a5":{"lock":false,"pos":{"x":52.9442291259766,"y":1.3056321144104,"z":-56.6198539733887},"rot":{"x":0.0208129268139601,"y":269.984924316406,"z":0.016765670850873}},"ff1b0c":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29499578475952,"z":-72.7084045410156},"rot":{"x":0.0208092220127583,"y":269.999450683594,"z":0.0167716108262539}}}}' +LuaScriptState: '{"ml":{"006d44":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768860340118,"z":-63.5084457397461},"rot":{"x":0.0208092592656612,"y":269.999450683594,"z":0.0167710669338703}},"074858":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208086036145687,"y":269.998962402344,"z":0.0167694743722677}},"098da7":{"lock":false,"pos":{"x":58.0935859680176,"y":1.30816042423248,"z":-54.3712768554688},"rot":{"x":0.0208071302622557,"y":270.004486083984,"z":0.0167728867381811}},"0b963c":{"lock":false,"pos":{"x":52.9442138671875,"y":1.3063051700592,"z":-54.3203430175781},"rot":{"x":0.0208126567304134,"y":269.987518310547,"z":0.0167661812156439}},"0db666":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29701542854309,"z":-65.8083038330078},"rot":{"x":0.0208095610141754,"y":269.999481201172,"z":0.0167712066322565}},"0e0530":{"lock":false,"pos":{"x":32.9852828979492,"y":1.30040621757507,"z":-49.7095603942871},"rot":{"x":0.0208172593265772,"y":269.970916748047,"z":0.0167602971196175}},"0e72b6":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29838681221008,"z":-56.6083374023438},"rot":{"x":0.0208211019635201,"y":269.958312988281,"z":0.0167557131499052}},"0ec9bf":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29699683189392,"z":-70.4198684692383},"rot":{"x":0.0208094976842403,"y":269.999420166016,"z":0.0167714655399323}},"0feb74":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364919662476,"z":-77.3083343505859},"rot":{"x":0.0208182092756033,"y":269.970123291016,"z":0.0167607236653566}},"117b7c":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208026859909296,"y":270.022857666016,"z":0.0167794115841389}},"15643b":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.0208011101931334,"y":270.023193359375,"z":0.0167795047163963}},"18927e":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565036296844,"z":-75.0199966430664},"rot":{"x":0.0208094622939825,"y":269.999481201172,"z":0.0167713444679976}},"1bd139":{"lock":false,"pos":{"x":40.2741050720215,"y":1.29093313217163,"z":-91.1157989501953},"rot":{"x":0.0208026058971882,"y":270.022857666016,"z":0.0167798530310392}},"1dbc95":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208087451756001,"y":269.999450683594,"z":0.0167708732187748}},"2423e7":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208086203783751,"y":269.999481201172,"z":0.0167711060494184}},"26a3bf":{"lock":false,"pos":{"x":36.623477935791,"y":1.29163753986359,"z":-84.1799621582031},"rot":{"x":0.0208244808018208,"y":269.94580078125,"z":0.016751566901803}},"27446e":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208088383078575,"y":269.999481201172,"z":0.0167709812521935}},"2aeb8a":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.0208027884364128,"y":270.023315429688,"z":0.0167799927294254}},"2cfa4f":{"lock":false,"pos":{"x":52.944206237793,"y":1.30226576328278,"z":-68.1202087402344},"rot":{"x":0.0208079963922501,"y":270.000305175781,"z":0.0167699549347162}},"2f4db2":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208028610795736,"y":270.019805908203,"z":0.0167779419571161}},"2fba3b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208085421472788,"y":270.000549316406,"z":0.0167709644883871}},"2fe723":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208086706697941,"y":269.999450683594,"z":0.0167709868401289}},"30062e":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30883586406708,"z":-52.0709686279297},"rot":{"x":0.0208017993718386,"y":270.022705078125,"z":0.0167794991284609}},"308be1":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208083838224411,"y":269.998779296875,"z":0.0167695600539446}},"3442f5":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208098292350769,"y":269.998840332031,"z":0.0167711265385151}},"37882c":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950915813446,"z":-49.7709617614746},"rot":{"x":0.0208088513463736,"y":269.998962402344,"z":0.0167707968503237}},"3add54":{"lock":false,"pos":{"x":52.9441146850586,"y":1.29755306243896,"z":-84.2202377319336},"rot":{"x":0.0208085961639881,"y":269.999450683594,"z":0.0167695879936218}},"3bd955":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208088047802448,"y":269.998901367188,"z":0.0167707744985819}},"3e0653":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30159246921539,"z":-70.4202117919922},"rot":{"x":0.0208080690354109,"y":270.000457763672,"z":0.0167700164020061}},"48e4a3":{"lock":false,"pos":{"x":40.2900466918945,"y":1.2976701259613,"z":-68.1198654174805},"rot":{"x":0.0208095870912075,"y":269.999755859375,"z":0.0167711488902569}},"4a45c6":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30361223220825,"z":-63.5203552246094},"rot":{"x":0.0208132155239582,"y":269.98388671875,"z":0.016764298081398}},"4b4df3":{"lock":false,"pos":{"x":32.9852867126465,"y":1.29973292350769,"z":-52.0095596313477},"rot":{"x":0.0208076201379299,"y":270.004333496094,"z":0.016772111877799}},"4eb231":{"lock":false,"pos":{"x":52.9462394714355,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.0208084750920534,"y":269.999328613281,"z":0.0167697500437498}},"5065a6":{"lock":false,"pos":{"x":40.2900619506836,"y":1.29969000816345,"z":-61.2195243835449},"rot":{"x":0.0208148863166571,"y":269.978210449219,"z":0.0167632550001144}},"587bc5":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.0208018943667412,"y":270.023376464844,"z":0.016779126599431}},"5f19e0":{"lock":false,"pos":{"x":52.944206237793,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208078678697348,"y":270.000549316406,"z":0.0167700089514256}},"5fe780":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208086855709553,"y":269.99951171875,"z":0.0167711935937405}},"620b6e":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30563187599182,"z":-56.6203460693359},"rot":{"x":0.0208087228238583,"y":270.000732421875,"z":0.0167712587863207}},"62d930":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29906010627747,"z":-54.3083343505859},"rot":{"x":0.0208150148391724,"y":269.978485107422,"z":0.016762925311923}},"63f145":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208105221390724,"y":269.993408203125,"z":0.0167688652873039}},"705e27":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29095637798309,"z":-86.5083084106445},"rot":{"x":0.0208175927400589,"y":269.971008300781,"z":0.0167607720941305}},"731d2a":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208087712526321,"y":269.999450683594,"z":0.0167710408568382}},"7b918b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083969116211},"rot":{"x":0.0208092499524355,"y":270.000152587891,"z":0.0167716555297375}},"7baf75":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30024600028992,"z":-75.0203399658203},"rot":{"x":0.0208139289170504,"y":269.979248046875,"z":0.0167632903903723}},"7d3a27":{"lock":false,"pos":{"x":58.0996894836426,"y":1.30546903610229,"z":-63.5731620788574},"rot":{"x":0.02083302102983,"y":269.915954589844,"z":0.016740707680583}},"7f27d6":{"lock":false,"pos":{"x":36.6243705749512,"y":1.29230332374573,"z":-81.9062652587891},"rot":{"x":0.020834356546402,"y":269.914306640625,"z":0.0167397260665894}},"8bec05":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.0084228515625},"rot":{"x":0.0208097063004971,"y":269.999542236328,"z":0.0167712830007076}},"91da6b":{"lock":false,"pos":{"x":36.6082649230957,"y":1.28960514068604,"z":-91.1042785644531},"rot":{"x":0.0208195243030787,"y":269.965515136719,"z":0.0167591255158186}},"96ed77":{"lock":false,"pos":{"x":36.6243705749512,"y":1.29364931583405,"z":-77.3084411621094},"rot":{"x":0.0208086725324392,"y":270,"z":0.0167709607630968}},"981f41":{"lock":false,"pos":{"x":36.6243362426758,"y":1.296342253685,"z":-68.1083068847656},"rot":{"x":0.0208093151450157,"y":269.999664306641,"z":0.0167712904512882}},"982716":{"lock":false,"pos":{"x":58.099666595459,"y":1.3074893951416,"z":-56.6709747314453},"rot":{"x":0.0208120942115784,"y":269.988311767578,"z":0.0167667847126722}},"9dd911":{"lock":false,"pos":{"x":36.6243362426758,"y":1.3017281293869,"z":-49.7084617614746},"rot":{"x":0.0208019074052572,"y":270.022979736328,"z":0.0167790483683348}},"a6af13":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.6082916259766},"rot":{"x":0.0208095666021109,"y":269.999542236328,"z":0.0167714338749647}},"b05089":{"lock":false,"pos":{"x":40.6759,"y":1.3023,"z":-56.6129},"rot":{"x":0.0208,"y":269.9999,"z":0.0168}},"b3cad4":{"lock":false,"pos":{"x":58.099666595459,"y":1.30816268920898,"z":-54.3709716796875},"rot":{"x":0.0208019595593214,"y":270.022705078125,"z":0.0167795233428478}},"b5e5f1":{"lock":false,"pos":{"x":36.6086463928223,"y":1.29028046131134,"z":-88.7977523803711},"rot":{"x":0.0208094641566277,"y":269.999542236328,"z":0.0167714599519968}},"b81c84":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29566895961761,"z":-70.4083099365234},"rot":{"x":0.0208095125854015,"y":269.999572753906,"z":0.0167714040726423}},"bab03b":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363131523132,"z":-81.9201202392578},"rot":{"x":0.0208026189357042,"y":270.023132324219,"z":0.0167800765484571}},"cb4730":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208081230521202,"y":270.001678466797,"z":0.0167717300355434}},"cc8321":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30697846412659,"z":-52.020336151123},"rot":{"x":0.0208118185400963,"y":269.989074707031,"z":0.0167667083442211}},"cdbb37":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30832493305206,"z":-47.420295715332},"rot":{"x":0.020808594301343,"y":269.99951171875,"z":0.0167710985988379}},"cdd6aa":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208088755607605,"y":269.999481201172,"z":0.0167709849774837}},"ce1b89":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.0208020359277725,"y":270.022918701172,"z":0.0167791191488504}},"d041f0":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208086390048265,"y":269.99951171875,"z":0.0167709290981293}},"d4dbc7":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208089891821146,"y":269.999389648438,"z":0.0167706925421953}},"d753d7":{"lock":false,"pos":{"x":58.098804473877,"y":1.31018531322479,"z":-47.4597969055176},"rot":{"x":0.0208100453019142,"y":269.994689941406,"z":0.0167692713439465}},"d7dbac":{"lock":false,"pos":{"x":36.6243362426758,"y":1.2909562587738,"z":-86.50830078125},"rot":{"x":0.0208096131682396,"y":269.99951171875,"z":0.0167715679854155}},"de40c8":{"lock":false,"pos":{"x":58.1010513305664,"y":1.30613505840302,"z":-61.2994766235352},"rot":{"x":0.0208303909748793,"y":269.925231933594,"z":0.0167439430952072}},"e1c0f8":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29771363735199,"z":-58.9083404541016},"rot":{"x":0.0208078417927027,"y":270.002838134766,"z":0.0167718306183815}},"e503ce":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202438354492},"rot":{"x":0.0208141934126616,"y":269.978424072266,"z":0.0167628526687622}},"e7f37b":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29973292350769,"z":-52.0095596313477},"rot":{"x":0.0208174716681242,"y":269.970825195313,"z":0.0167602244764566}},"e80bd8":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632353782654,"z":-72.7199859619141},"rot":{"x":0.020809730514884,"y":269.999572753906,"z":0.0167714040726423}},"e84232":{"lock":false,"pos":{"x":44.229,"y":1.2968,"z":-79.6006},"rot":{"x":0.0208,"y":269.9999,"z":0.0168}},"e92e98":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30563187599182,"z":-56.6203498840332},"rot":{"x":0.0208081025630236,"y":270.000732421875,"z":0.0167712345719337}},"eaa415":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30765163898468,"z":-49.7202949523926},"rot":{"x":0.0208087675273418,"y":269.99951171875,"z":0.016771012917161}},"ecfa42":{"lock":false,"pos":{"x":32.9852867126465,"y":1.30107951164246,"z":-47.4095611572266},"rot":{"x":0.0208173599094152,"y":269.971008300781,"z":0.0167602095752954}},"edd6c4":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.0208086688071489,"y":269.999542236328,"z":0.0167710017412901}},"eef1e6":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30024588108063,"z":-75.0203475952148},"rot":{"x":0.0208095647394657,"y":269.998809814453,"z":0.0167709831148386}},"f2508d":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208089035004377,"y":270.000579833984,"z":0.016770888119936}},"f4434f":{"lock":false,"pos":{"x":52.944206237793,"y":1.30697846412659,"z":-52.0203437805176},"rot":{"x":0.0208083316683769,"y":270.000793457031,"z":0.016771350055933}},"f57af7":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208025611937046,"y":270.023254394531,"z":0.0167800020426512}},"f8dc01":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.0208082776516676,"y":270.001525878906,"z":0.0167712923139334}},"fb4e3f":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208082739263773,"y":270.000579833984,"z":0.0167713910341263}},"fc20b9":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208159796893597,"y":269.975372314453,"z":0.0167620256543159}},"fc82a5":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495870113373,"z":-58.9203491210938},"rot":{"x":0.0208133850246668,"y":269.984924316406,"z":0.0167651046067476}},"ff1b0c":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29499578475952,"z":-72.7084045410156},"rot":{"x":0.0208092220127583,"y":269.999450683594,"z":0.0167716108262539}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card .41 Derringer (2) f57af7.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card .41 Derringer (2) f57af7.yaml index cfac50d13..dd90a73fc 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card .41 Derringer (2) f57af7.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card .41 Derringer (2) f57af7.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 40.29 - posY: 1.3 - posZ: -75.02 + posY: 1.29 + posZ: -77.32 rotX: 0.02 rotY: 270.02 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card .45 Thompson (3) d4dbc7.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card .45 Thompson (3) d4dbc7.yaml index b15ce1b5c..d6f432625 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card .45 Thompson (3) d4dbc7.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card .45 Thompson (3) d4dbc7.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -58.91 + posZ: -61.21 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Ace in the Hole (3) 074858.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Ace in the Hole (3) 074858.yaml index 2e1dbbc09..d835e4b04 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Ace in the Hole (3) 074858.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Ace in the Hole (3) 074858.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -70.42 + posZ: -72.72 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Another Day, Another Dollar (3) 006d44.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Another Day, Another Dollar (3) 006d44.yaml index 053bb96e6..79075e98c 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Another Day, Another Dollar (3) 006d44.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Another Day, Another Dollar (3) 006d44.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -61.21 + posZ: -63.51 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Backstab (3) 7baf75.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Backstab (3) 7baf75.yaml index 187dc45c3..8733d8c5e 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Backstab (3) 7baf75.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Backstab (3) 7baf75.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -72.72 + posZ: -75.02 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Beretta M1918 (4) 91da6b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Beretta M1918 (4) 91da6b.yaml index 22b5a317c..72ed22c42 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Beretta M1918 (4) 91da6b.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Beretta M1918 (4) 91da6b.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.61 posY: 1.29 - posZ: -88.8 + posZ: -91.1 rotX: 0.02 rotY: 269.97 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Borrowed Time (3) 0db666.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Borrowed Time (3) 0db666.yaml index b79e25bdd..f16d5ac65 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Borrowed Time (3) 0db666.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Borrowed Time (3) 0db666.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -63.51 + posZ: -65.81 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Burglary (2) 2aeb8a.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Burglary (2) 2aeb8a.yaml index d454a4ea5..bc3d91162 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Burglary (2) 2aeb8a.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Burglary (2) 2aeb8a.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.29 - posZ: -77.32 + posZ: -79.62 rotX: 0.02 rotY: 270.02 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Cheap Shot (2) 0b963c.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Cheap Shot (2) 0b963c.yaml index 2dd5fbb2c..5e5dbf147 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Cheap Shot (2) 0b963c.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Cheap Shot (2) 0b963c.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.31 - posZ: -52.02 + posZ: -54.32 rotX: 0.02 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Cheat Death (5) 3add54.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Cheat Death (5) 3add54.yaml index 53eb6e47c..fde8c253c 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Cheat Death (5) 3add54.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Cheat Death (5) 3add54.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.95 + posX: 52.94 posY: 1.3 - posZ: -81.92 + posZ: -84.22 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Chicago Typewriter (4) ecfa42.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Chicago Typewriter (4) ecfa42.yaml index d66fbd51f..a43b21a43 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Chicago Typewriter (4) ecfa42.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Chicago Typewriter (4) ecfa42.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 36.61 - posY: 1.29 - posZ: -91.1 + posX: 32.99 + posY: 1.3 + posZ: -47.41 rotX: 0.02 rotY: 269.97 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Chuck Fergus (5) 0e72b6.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Chuck Fergus (5) 0e72b6.yaml index b37698850..18c7bd13c 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Chuck Fergus (5) 0e72b6.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Chuck Fergus (5) 0e72b6.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -54.31 + posZ: -56.61 rotX: 0.02 rotY: 269.96 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Colt Vest Pocket (2) bab03b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Colt Vest Pocket (2) bab03b.yaml index 7bfbd0d2d..460069ba5 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Colt Vest Pocket (2) bab03b.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Colt Vest Pocket (2) bab03b.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.29 - posZ: -79.62 + posZ: -81.92 rotX: 0.02 rotY: 270.02 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Contraband (2) 620b6e.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Contraband (2) 620b6e.yaml index 88c5ff807..dd1a0f65d 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Contraband (2) 620b6e.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Contraband (2) 620b6e.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.31 - posZ: -54.32 + posZ: -56.62 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Daring Maneuver (2) fc82a5.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Daring Maneuver (2) fc82a5.yaml index de1921f1f..fd4d5088a 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Daring Maneuver (2) fc82a5.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Daring Maneuver (2) fc82a5.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 52.94 - posY: 1.31 - posZ: -56.62 + posY: 1.3 + posZ: -58.92 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Decorated Skull (3) 981f41.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Decorated Skull (3) 981f41.yaml index 82108199b..83d216a7c 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Decorated Skull (3) 981f41.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Decorated Skull (3) 981f41.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -65.81 + posZ: -68.11 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Delilah O'Rourke (3) b81c84.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Delilah O'Rourke (3) b81c84.yaml index ca3d78df9..446c63175 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Delilah O'Rourke (3) b81c84.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Delilah O'Rourke (3) b81c84.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -68.11 + posZ: -70.41 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Double, Double (4) 0e0530.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Double, Double (4) 0e0530.yaml index 7c62a311b..eb2dee441 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Double, Double (4) 0e0530.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Double, Double (4) 0e0530.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -47.41 + posZ: -49.71 rotX: 0.02 rotY: 269.97 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card False Covenant (2) 3442f5.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card False Covenant (2) 3442f5.yaml index 6abf07830..c9b2d5156 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card False Covenant (2) 3442f5.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card False Covenant (2) 3442f5.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.29 - posZ: -81.92 + posZ: -84.22 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Garrote Wire (2) 117b7c.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Garrote Wire (2) 117b7c.yaml index 9be0fa95d..e8238139a 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Garrote Wire (2) 117b7c.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Garrote Wire (2) 117b7c.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.29 - posZ: -84.22 + posZ: -86.52 rotX: 0.02 rotY: 270.02 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hard Knocks (2) 15643b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hard Knocks (2) 15643b.yaml index 76035807e..55816ebee 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hard Knocks (2) 15643b.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hard Knocks (2) 15643b.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 40.29 + posX: 40.27 posY: 1.29 - posZ: -86.52 + posZ: -88.81 rotX: 0.02 rotY: 270.02 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Haste (2) 1bd139.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Haste (2) 1bd139.yaml index 059acd193..ac9be72bc 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Haste (2) 1bd139.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Haste (2) 1bd139.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.27 posY: 1.29 - posZ: -88.81 + posZ: -91.12 rotX: 0.02 rotY: 270.02 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card High Roller (2) ce1b89.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card High Roller (2) ce1b89.yaml index 11515177c..5361e6e24 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card High Roller (2) ce1b89.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card High Roller (2) ce1b89.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 40.27 - posY: 1.29 - posZ: -91.12 + posX: 36.62 + posY: 1.3 + posZ: -47.41 rotX: 0.02 rotY: 270.02 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hot Streak (2) f2508d.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hot Streak (2) f2508d.yaml index 198344253..4b1d25401 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hot Streak (2) f2508d.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hot Streak (2) f2508d.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -58.92 + posZ: -61.22 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hot Streak (4) 4eb231.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hot Streak (4) 4eb231.yaml index b09e58c09..aa0661e9a 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hot Streak (4) 4eb231.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Hot Streak (4) 4eb231.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.94 + posX: 52.95 posY: 1.3 - posZ: -79.62 + posZ: -81.92 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Joey The Rat Vigil (3) 7b918b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Joey The Rat Vigil (3) 7b918b.yaml index f68164366..c9b880ee1 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Joey The Rat Vigil (3) 7b918b.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Joey The Rat Vigil (3) 7b918b.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 36.62 - posY: 1.3 - posZ: -70.41 + posY: 1.29 + posZ: -72.71 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lola Santiago (3) 8bec05.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lola Santiago (3) 8bec05.yaml index ff31bfe15..0fb070056 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lola Santiago (3) 8bec05.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lola Santiago (3) 8bec05.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -72.71 + posZ: -75.01 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lucky Cigarette Case (3) 0feb74.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lucky Cigarette Case (3) 0feb74.yaml index 19e2909af..c14df1647 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lucky Cigarette Case (3) 0feb74.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lucky Cigarette Case (3) 0feb74.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -75.01 + posZ: -77.31 rotX: 0.02 rotY: 269.97 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lucky Dice (2) 9dd911.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lucky Dice (2) 9dd911.yaml index a2197af27..209d03645 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lucky Dice (2) 9dd911.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lucky Dice (2) 9dd911.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -47.41 + posZ: -49.71 rotX: 0.02 rotY: 270.02 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lupara (3) a6af13.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lupara (3) a6af13.yaml index 59dbfbdd4..01a551239 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lupara (3) a6af13.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Lupara (3) a6af13.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -77.31 + posZ: -79.61 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Mauser C96 (2) fc20b9.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Mauser C96 (2) fc20b9.yaml index 4322a30f0..aa2e5eb1e 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Mauser C96 (2) fc20b9.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Mauser C96 (2) fc20b9.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -49.71 + posZ: -52.01 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Pickpocketing (2) 2f4db2.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Pickpocketing (2) 2f4db2.yaml index b6f9f01ee..50cd67a1a 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Pickpocketing (2) 2f4db2.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Pickpocketing (2) 2f4db2.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -52.01 + posZ: -54.31 rotX: 0.02 rotY: 270.02 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Pilfer (3) e503ce.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Pilfer (3) e503ce.yaml index fe9338f3a..aa0e21e80 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Pilfer (3) e503ce.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Pilfer (3) e503ce.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -75.02 + posZ: -77.32 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Priest of Two Faiths (1) 48e4a3.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Priest of Two Faiths (1) 48e4a3.yaml new file mode 100644 index 000000000..3fbaf6f4a --- /dev/null +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Priest of Two Faiths (1) 48e4a3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232104 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 48e4a3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Priest of Two Faiths (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 40.29 + posY: 1.3 + posZ: -68.12 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sawed-Off Shotgun (5) e1c0f8.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sawed-Off Shotgun (5) e1c0f8.yaml index 1d6968ba2..3a38f3d5b 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sawed-Off Shotgun (5) e1c0f8.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sawed-Off Shotgun (5) e1c0f8.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -56.61 + posZ: -58.91 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sharpshooter (3) 7f27d6.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sharpshooter (3) 7f27d6.yaml index 0ecbca25d..a1439c461 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sharpshooter (3) 7f27d6.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sharpshooter (3) 7f27d6.yaml @@ -35,9 +35,9 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -79.61 + posZ: -81.91 rotX: 0.02 - rotY: 269.97 + rotY: 269.91 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Slip Away (2) 4a45c6.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Slip Away (2) 4a45c6.yaml index 6e32e431b..3f585c62e 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Slip Away (2) 4a45c6.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Slip Away (2) 4a45c6.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -61.22 + posZ: -63.52 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sneak Attack (2) 5f19e0.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sneak Attack (2) 5f19e0.yaml index ac2d57d12..e61138594 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sneak Attack (2) 5f19e0.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sneak Attack (2) 5f19e0.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -63.52 + posZ: -65.82 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Stealth (3) 26a3bf.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Stealth (3) 26a3bf.yaml index bdda1d9cd..ed91fa62f 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Stealth (3) 26a3bf.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Stealth (3) 26a3bf.yaml @@ -35,9 +35,9 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -81.91 + posZ: -84.18 rotX: 0.02 - rotY: 270.0 + rotY: 269.95 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Streetwise (3) d7dbac.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Streetwise (3) d7dbac.yaml index 6d02debca..63fd905b7 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Streetwise (3) d7dbac.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Streetwise (3) d7dbac.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.29 - posZ: -84.21 + posZ: -86.51 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Suggestion (1) 0ec9bf.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Suggestion (1) 0ec9bf.yaml index ff8d60348..5d337c48c 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Suggestion (1) 0ec9bf.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Suggestion (1) 0ec9bf.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.3 - posZ: -68.12 + posZ: -70.42 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Suggestion (4) e7f37b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Suggestion (4) e7f37b.yaml index c7a1d57eb..4e5a80b15 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Suggestion (4) e7f37b.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Suggestion (4) e7f37b.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -49.71 + posZ: -52.01 rotX: 0.02 rotY: 269.97 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sure Gamble (3) 308be1.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sure Gamble (3) 308be1.yaml index 0d431c378..fe688adb5 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sure Gamble (3) 308be1.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Sure Gamble (3) 308be1.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -77.32 + posZ: -79.62 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Swift Reload (2) 2cfa4f.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Swift Reload (2) 2cfa4f.yaml index 129b6f942..e64641cfa 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Swift Reload (2) 2cfa4f.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Swift Reload (2) 2cfa4f.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -65.82 + posZ: -68.12 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Switchblade (2) 2fba3b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Switchblade (2) 2fba3b.yaml index e8f924749..0dbe1d31e 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Switchblade (2) 2fba3b.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Switchblade (2) 2fba3b.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -54.31 + posZ: -56.61 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Tennessee Sour Mash (3) b5e5f1.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Tennessee Sour Mash (3) b5e5f1.yaml index 71d3aa061..328ed55a0 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Tennessee Sour Mash (3) b5e5f1.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Tennessee Sour Mash (3) b5e5f1.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 36.62 + posX: 36.61 posY: 1.29 - posZ: -86.51 + posZ: -88.8 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Gold Pocket Watch (4) 62d930.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Gold Pocket Watch (4) 62d930.yaml index 90d576b77..82becd26c 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Gold Pocket Watch (4) 62d930.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Gold Pocket Watch (4) 62d930.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 32.99 posY: 1.3 - posZ: -52.01 + posZ: -54.31 rotX: 0.02 rotY: 269.98 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Moon • XVIII (1) e80bd8.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Moon • XVIII (1) e80bd8.yaml index 3a03dbffd..257d6c3ad 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Moon • XVIII (1) e80bd8.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Moon • XVIII (1) e80bd8.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.3 - posZ: -70.42 + posZ: -72.72 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Skeleton Key (2) f8dc01.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Skeleton Key (2) f8dc01.yaml index 68f7cc588..5d492fb66 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Skeleton Key (2) f8dc01.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card The Skeleton Key (2) f8dc01.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 36.62 posY: 1.3 - posZ: -56.61 + posZ: -58.91 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Think on Your Feet (2) 3e0653.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Think on Your Feet (2) 3e0653.yaml index 66a664c24..bb42b2794 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Think on Your Feet (2) 3e0653.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Think on Your Feet (2) 3e0653.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -68.12 + posZ: -70.42 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Treasure Hunter (1) 18927e.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Treasure Hunter (1) 18927e.yaml index 20507f483..236af8ce3 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Treasure Hunter (1) 18927e.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Treasure Hunter (1) 18927e.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 40.29 posY: 1.3 - posZ: -72.72 + posZ: -75.02 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Card Under Surveillance (1) cc8321.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Under Surveillance (1) cc8321.yaml new file mode 100644 index 000000000..0c5306ecd --- /dev/null +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Card Under Surveillance (1) cc8321.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232105 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cc8321 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Under Surveillance (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 52.94 + posY: 1.31 + posZ: -52.02 + rotX: 0.02 + rotY: 269.99 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.ttslua b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.ttslua new file mode 100644 index 000000000..b25806e6f --- /dev/null +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.ttslua @@ -0,0 +1,503 @@ +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.yaml new file mode 100644 index 000000000..5c9ee3f58 --- /dev/null +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.yaml @@ -0,0 +1,125 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Under Surveillance (1) cc8321.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Priest of Two Faiths (1) 48e4a3.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Another Day, Another Dollar (3) 006d44.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Ace in the Hole (3) 074858.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Cheap Shot (2) 0b963c.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Borrowed Time (3) 0db666.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Double, Double (4) 0e0530.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Chuck Fergus (5) 0e72b6.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Suggestion (1) 0ec9bf.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Lucky Cigarette Case (3) 0feb74.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Garrote Wire (2) 117b7c.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Hard Knocks (2) 15643b.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Treasure Hunter (1) 18927e.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Haste (2) 1bd139.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Charon''s Obol (1) 1dbc95.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Fence (1) 2423e7.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Stealth (3) 26a3bf.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Leo de Luca (1) 27446e.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Burglary (2) 2aeb8a.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Swift Reload (2) 2cfa4f.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Pickpocketing (2) 2f4db2.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Switchblade (2) 2fba3b.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Cat Burglar (1) 2fe723.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Three Aces (1) 30062e.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Sure Gamble (3) 308be1.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card False Covenant (2) 3442f5.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Skeptic (1) 37882c.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Cheat Death (5) 3add54.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Think on Your Feet (2) 3e0653.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Slip Away (2) 4a45c6.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Hot Streak (4) 4eb231.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Liquid Courage (1) 5065a6.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Sneak Attack (2) 5f19e0.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Moxie (1) 5fe780.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Contraband (2) 620b6e.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card The Gold Pocket Watch (4) 62d930.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Opportunist (2) 63f145.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Adaptable (1) 731d2a.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Joey The Rat Vigil (3) 7b918b.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Backstab (3) 7baf75.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card All In (5) 7d3a27.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Sharpshooter (3) 7f27d6.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Lola Santiago (3) 8bec05.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Beretta M1918 (4) 91da6b.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Decorated Skull (3) 981f41.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Manual Dexterity (2) 982716.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Lucky Dice (2) 9dd911.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Lupara (3) a6af13.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Daredevil (2) b3cad4.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Tennessee Sour Mash (3) b5e5f1.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Delilah O''Rourke (3) b81c84.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Colt Vest Pocket (2) bab03b.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Easy Mark (1) cdbb37.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Hired Muscle (1) cdd6aa.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card High Roller (2) ce1b89.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card .45 Thompson (3) d4dbc7.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Momentum (1) d753d7.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Streetwise (3) d7dbac.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Copycat (3) de40c8.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Sawed-Off Shotgun (5) e1c0f8.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Pilfer (3) e503ce.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Suggestion (4) e7f37b.yaml' +- !include "Custom_Model_Bag Rogue 6c6b22/Card The Moon \u2022 XVIII (1) e80bd8.yaml" +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Pay Day (1) eaa415.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Chicago Typewriter (4) ecfa42.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Lockpicks (1) edd6c4.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Hot Streak (2) f2508d.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card .41 Derringer (2) f57af7.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card The Skeleton Key (2) f8dc01.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Mauser C96 (2) fc20b9.yaml' +- !include 'Custom_Model_Bag Rogue 6c6b22/Card Daring Maneuver (2) fc82a5.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515898740/E92441671B056D4CDF99DF9E6C88BE6598AAB50F/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6c6b22 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Rogue 6c6b22.ttslua' +LuaScriptState: '{"ml":{"006d44":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768860340118,"z":-63.5084457397461},"rot":{"x":0.0208092592656612,"y":269.999450683594,"z":0.0167710669338703}},"074858":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208086036145687,"y":269.998962402344,"z":0.0167694743722677}},"098da7":{"lock":false,"pos":{"x":58.0935859680176,"y":1.30816042423248,"z":-54.3712768554688},"rot":{"x":0.0208071302622557,"y":270.004486083984,"z":0.0167728867381811}},"0b963c":{"lock":false,"pos":{"x":52.9442138671875,"y":1.3063051700592,"z":-54.3203430175781},"rot":{"x":0.0208126567304134,"y":269.987518310547,"z":0.0167661812156439}},"0db666":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29701542854309,"z":-65.8083038330078},"rot":{"x":0.0208095610141754,"y":269.999481201172,"z":0.0167712066322565}},"0e0530":{"lock":false,"pos":{"x":32.9852828979492,"y":1.30040621757507,"z":-49.7095603942871},"rot":{"x":0.0208172593265772,"y":269.970916748047,"z":0.0167602971196175}},"0e72b6":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29838681221008,"z":-56.6083374023438},"rot":{"x":0.0208211019635201,"y":269.958312988281,"z":0.0167557131499052}},"0ec9bf":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29699683189392,"z":-70.4198684692383},"rot":{"x":0.0208094976842403,"y":269.999420166016,"z":0.0167714655399323}},"0feb74":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364919662476,"z":-77.3083343505859},"rot":{"x":0.0208182092756033,"y":269.970123291016,"z":0.0167607236653566}},"117b7c":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208026859909296,"y":270.022857666016,"z":0.0167794115841389}},"15643b":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.0208011101931334,"y":270.023193359375,"z":0.0167795047163963}},"18927e":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565036296844,"z":-75.0199966430664},"rot":{"x":0.0208094622939825,"y":269.999481201172,"z":0.0167713444679976}},"1bd139":{"lock":false,"pos":{"x":40.2741050720215,"y":1.29093313217163,"z":-91.1157989501953},"rot":{"x":0.0208026058971882,"y":270.022857666016,"z":0.0167798530310392}},"1dbc95":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208087451756001,"y":269.999450683594,"z":0.0167708732187748}},"2423e7":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208086203783751,"y":269.999481201172,"z":0.0167711060494184}},"26a3bf":{"lock":false,"pos":{"x":36.623477935791,"y":1.29163753986359,"z":-84.1799621582031},"rot":{"x":0.0208244808018208,"y":269.94580078125,"z":0.016751566901803}},"27446e":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208088383078575,"y":269.999481201172,"z":0.0167709812521935}},"2aeb8a":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.0208027884364128,"y":270.023315429688,"z":0.0167799927294254}},"2cfa4f":{"lock":false,"pos":{"x":52.944206237793,"y":1.30226576328278,"z":-68.1202087402344},"rot":{"x":0.0208079963922501,"y":270.000305175781,"z":0.0167699549347162}},"2f4db2":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208028610795736,"y":270.019805908203,"z":0.0167779419571161}},"2fba3b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208085421472788,"y":270.000549316406,"z":0.0167709644883871}},"2fe723":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208086706697941,"y":269.999450683594,"z":0.0167709868401289}},"30062e":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30883586406708,"z":-52.0709686279297},"rot":{"x":0.0208017993718386,"y":270.022705078125,"z":0.0167794991284609}},"308be1":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208083838224411,"y":269.998779296875,"z":0.0167695600539446}},"3442f5":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208098292350769,"y":269.998840332031,"z":0.0167711265385151}},"37882c":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950915813446,"z":-49.7709617614746},"rot":{"x":0.0208088513463736,"y":269.998962402344,"z":0.0167707968503237}},"3add54":{"lock":false,"pos":{"x":52.9441146850586,"y":1.29755306243896,"z":-84.2202377319336},"rot":{"x":0.0208085961639881,"y":269.999450683594,"z":0.0167695879936218}},"3bd955":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208088047802448,"y":269.998901367188,"z":0.0167707744985819}},"3e0653":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30159246921539,"z":-70.4202117919922},"rot":{"x":0.0208080690354109,"y":270.000457763672,"z":0.0167700164020061}},"48e4a3":{"lock":false,"pos":{"x":40.2900466918945,"y":1.2976701259613,"z":-68.1198654174805},"rot":{"x":0.0208095870912075,"y":269.999755859375,"z":0.0167711488902569}},"4a45c6":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30361223220825,"z":-63.5203552246094},"rot":{"x":0.0208132155239582,"y":269.98388671875,"z":0.016764298081398}},"4b4df3":{"lock":false,"pos":{"x":32.9852867126465,"y":1.29973292350769,"z":-52.0095596313477},"rot":{"x":0.0208076201379299,"y":270.004333496094,"z":0.016772111877799}},"4eb231":{"lock":false,"pos":{"x":52.9462394714355,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.0208084750920534,"y":269.999328613281,"z":0.0167697500437498}},"5065a6":{"lock":false,"pos":{"x":40.2900619506836,"y":1.29969000816345,"z":-61.2195243835449},"rot":{"x":0.0208148863166571,"y":269.978210449219,"z":0.0167632550001144}},"587bc5":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.0208018943667412,"y":270.023376464844,"z":0.016779126599431}},"5f19e0":{"lock":false,"pos":{"x":52.944206237793,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208078678697348,"y":270.000549316406,"z":0.0167700089514256}},"5fe780":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208086855709553,"y":269.99951171875,"z":0.0167711935937405}},"620b6e":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30563187599182,"z":-56.6203460693359},"rot":{"x":0.0208087228238583,"y":270.000732421875,"z":0.0167712587863207}},"62d930":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29906010627747,"z":-54.3083343505859},"rot":{"x":0.0208150148391724,"y":269.978485107422,"z":0.016762925311923}},"63f145":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208105221390724,"y":269.993408203125,"z":0.0167688652873039}},"705e27":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29095637798309,"z":-86.5083084106445},"rot":{"x":0.0208175927400589,"y":269.971008300781,"z":0.0167607720941305}},"731d2a":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208087712526321,"y":269.999450683594,"z":0.0167710408568382}},"7b918b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083969116211},"rot":{"x":0.0208092499524355,"y":270.000152587891,"z":0.0167716555297375}},"7baf75":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30024600028992,"z":-75.0203399658203},"rot":{"x":0.0208139289170504,"y":269.979248046875,"z":0.0167632903903723}},"7d3a27":{"lock":false,"pos":{"x":58.0996894836426,"y":1.30546903610229,"z":-63.5731620788574},"rot":{"x":0.02083302102983,"y":269.915954589844,"z":0.016740707680583}},"7f27d6":{"lock":false,"pos":{"x":36.6243705749512,"y":1.29230332374573,"z":-81.9062652587891},"rot":{"x":0.020834356546402,"y":269.914306640625,"z":0.0167397260665894}},"8bec05":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.0084228515625},"rot":{"x":0.0208097063004971,"y":269.999542236328,"z":0.0167712830007076}},"91da6b":{"lock":false,"pos":{"x":36.6082649230957,"y":1.28960514068604,"z":-91.1042785644531},"rot":{"x":0.0208195243030787,"y":269.965515136719,"z":0.0167591255158186}},"96ed77":{"lock":false,"pos":{"x":36.6243705749512,"y":1.29364931583405,"z":-77.3084411621094},"rot":{"x":0.0208086725324392,"y":270,"z":0.0167709607630968}},"981f41":{"lock":false,"pos":{"x":36.6243362426758,"y":1.296342253685,"z":-68.1083068847656},"rot":{"x":0.0208093151450157,"y":269.999664306641,"z":0.0167712904512882}},"982716":{"lock":false,"pos":{"x":58.099666595459,"y":1.3074893951416,"z":-56.6709747314453},"rot":{"x":0.0208120942115784,"y":269.988311767578,"z":0.0167667847126722}},"9dd911":{"lock":false,"pos":{"x":36.6243362426758,"y":1.3017281293869,"z":-49.7084617614746},"rot":{"x":0.0208019074052572,"y":270.022979736328,"z":0.0167790483683348}},"a6af13":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.6082916259766},"rot":{"x":0.0208095666021109,"y":269.999542236328,"z":0.0167714338749647}},"b05089":{"lock":false,"pos":{"x":40.6759,"y":1.3023,"z":-56.6129},"rot":{"x":0.0208,"y":269.9999,"z":0.0168}},"b3cad4":{"lock":false,"pos":{"x":58.099666595459,"y":1.30816268920898,"z":-54.3709716796875},"rot":{"x":0.0208019595593214,"y":270.022705078125,"z":0.0167795233428478}},"b5e5f1":{"lock":false,"pos":{"x":36.6086463928223,"y":1.29028046131134,"z":-88.7977523803711},"rot":{"x":0.0208094641566277,"y":269.999542236328,"z":0.0167714599519968}},"b81c84":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29566895961761,"z":-70.4083099365234},"rot":{"x":0.0208095125854015,"y":269.999572753906,"z":0.0167714040726423}},"bab03b":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363131523132,"z":-81.9201202392578},"rot":{"x":0.0208026189357042,"y":270.023132324219,"z":0.0167800765484571}},"cb4730":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208081230521202,"y":270.001678466797,"z":0.0167717300355434}},"cc8321":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30697846412659,"z":-52.020336151123},"rot":{"x":0.0208118185400963,"y":269.989074707031,"z":0.0167667083442211}},"cdbb37":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30832493305206,"z":-47.420295715332},"rot":{"x":0.020808594301343,"y":269.99951171875,"z":0.0167710985988379}},"cdd6aa":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208088755607605,"y":269.999481201172,"z":0.0167709849774837}},"ce1b89":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.0208020359277725,"y":270.022918701172,"z":0.0167791191488504}},"d041f0":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208086390048265,"y":269.99951171875,"z":0.0167709290981293}},"d4dbc7":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208089891821146,"y":269.999389648438,"z":0.0167706925421953}},"d753d7":{"lock":false,"pos":{"x":58.098804473877,"y":1.31018531322479,"z":-47.4597969055176},"rot":{"x":0.0208100453019142,"y":269.994689941406,"z":0.0167692713439465}},"d7dbac":{"lock":false,"pos":{"x":36.6243362426758,"y":1.2909562587738,"z":-86.50830078125},"rot":{"x":0.0208096131682396,"y":269.99951171875,"z":0.0167715679854155}},"de40c8":{"lock":false,"pos":{"x":58.1010513305664,"y":1.30613505840302,"z":-61.2994766235352},"rot":{"x":0.0208303909748793,"y":269.925231933594,"z":0.0167439430952072}},"e1c0f8":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29771363735199,"z":-58.9083404541016},"rot":{"x":0.0208078417927027,"y":270.002838134766,"z":0.0167718306183815}},"e503ce":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202438354492},"rot":{"x":0.0208141934126616,"y":269.978424072266,"z":0.0167628526687622}},"e7f37b":{"lock":false,"pos":{"x":32.9852828979492,"y":1.29973292350769,"z":-52.0095596313477},"rot":{"x":0.0208174716681242,"y":269.970825195313,"z":0.0167602244764566}},"e80bd8":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632353782654,"z":-72.7199859619141},"rot":{"x":0.020809730514884,"y":269.999572753906,"z":0.0167714040726423}},"e84232":{"lock":false,"pos":{"x":44.229,"y":1.2968,"z":-79.6006},"rot":{"x":0.0208,"y":269.9999,"z":0.0168}},"e92e98":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30563187599182,"z":-56.6203498840332},"rot":{"x":0.0208081025630236,"y":270.000732421875,"z":0.0167712345719337}},"eaa415":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30765163898468,"z":-49.7202949523926},"rot":{"x":0.0208087675273418,"y":269.99951171875,"z":0.016771012917161}},"ecfa42":{"lock":false,"pos":{"x":32.9852867126465,"y":1.30107951164246,"z":-47.4095611572266},"rot":{"x":0.0208173599094152,"y":269.971008300781,"z":0.0167602095752954}},"edd6c4":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.0208086688071489,"y":269.999542236328,"z":0.0167710017412901}},"eef1e6":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30024588108063,"z":-75.0203475952148},"rot":{"x":0.0208095647394657,"y":269.998809814453,"z":0.0167709831148386}},"f2508d":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208089035004377,"y":270.000579833984,"z":0.016770888119936}},"f4434f":{"lock":false,"pos":{"x":52.944206237793,"y":1.30697846412659,"z":-52.0203437805176},"rot":{"x":0.0208083316683769,"y":270.000793457031,"z":0.016771350055933}},"f57af7":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208025611937046,"y":270.023254394531,"z":0.0167800020426512}},"f8dc01":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.0208082776516676,"y":270.001525878906,"z":0.0167712923139334}},"fb4e3f":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208082739263773,"y":270.000579833984,"z":0.0167713910341263}},"fc20b9":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208159796893597,"y":269.975372314453,"z":0.0167620256543159}},"fc82a5":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495870113373,"z":-58.9203491210938},"rot":{"x":0.0208133850246668,"y":269.984924316406,"z":0.0167651046067476}},"ff1b0c":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29499578475952,"z":-72.7084045410156},"rot":{"x":0.0208092220127583,"y":269.999450683594,"z":0.0167716108262539}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Rogue +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.31 + posY: 1.66 + posZ: -74.79 + rotX: 0.02 + rotY: 270.02 + rotZ: 0.02 + scaleX: 1.2 + scaleY: 1.2 + scaleZ: 1.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card .41 Derringer (2) f57af7.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card .41 Derringer (2) f57af7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card .41 Derringer (2) f57af7.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card .41 Derringer (2) f57af7.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card .45 Thompson (3) d4dbc7.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card .45 Thompson (3) d4dbc7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card .45 Thompson (3) d4dbc7.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card .45 Thompson (3) d4dbc7.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Ace in the Hole (3) 074858.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Ace in the Hole (3) 074858.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Ace in the Hole (3) 074858.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Ace in the Hole (3) 074858.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Adaptable (1) 731d2a.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Adaptable (1) 731d2a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Adaptable (1) 731d2a.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Adaptable (1) 731d2a.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card All In (5) 7d3a27.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card All In (5) 7d3a27.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card All In (5) 7d3a27.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card All In (5) 7d3a27.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Another Day, Another Dollar (3) 006d44.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Another Day, Another Dollar (3) 006d44.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Another Day, Another Dollar (3) 006d44.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Another Day, Another Dollar (3) 006d44.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Backstab (3) 7baf75.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Backstab (3) 7baf75.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Backstab (3) 7baf75.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Backstab (3) 7baf75.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Beretta M1918 (4) 91da6b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Beretta M1918 (4) 91da6b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Beretta M1918 (4) 91da6b.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Beretta M1918 (4) 91da6b.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Borrowed Time (3) 0db666.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Borrowed Time (3) 0db666.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Borrowed Time (3) 0db666.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Borrowed Time (3) 0db666.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Burglary (2) 2aeb8a.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Burglary (2) 2aeb8a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Burglary (2) 2aeb8a.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Burglary (2) 2aeb8a.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Cat Burglar (1) 2fe723.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Cat Burglar (1) 2fe723.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Cat Burglar (1) 2fe723.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Cat Burglar (1) 2fe723.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Charon's Obol (1) 1dbc95.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Charon's Obol (1) 1dbc95.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Charon's Obol (1) 1dbc95.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Charon's Obol (1) 1dbc95.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Cheap Shot (2) 0b963c.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Cheap Shot (2) 0b963c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Cheap Shot (2) 0b963c.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Cheap Shot (2) 0b963c.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Cheat Death (5) 3add54.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Cheat Death (5) 3add54.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Cheat Death (5) 3add54.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Cheat Death (5) 3add54.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Chicago Typewriter (4) ecfa42.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Chicago Typewriter (4) ecfa42.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Chicago Typewriter (4) ecfa42.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Chicago Typewriter (4) ecfa42.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Chuck Fergus (5) 0e72b6.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Chuck Fergus (5) 0e72b6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Chuck Fergus (5) 0e72b6.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Chuck Fergus (5) 0e72b6.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Colt Vest Pocket (2) bab03b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Colt Vest Pocket (2) bab03b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Colt Vest Pocket (2) bab03b.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Colt Vest Pocket (2) bab03b.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Contraband (2) 620b6e.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Contraband (2) 620b6e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Contraband (2) 620b6e.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Contraband (2) 620b6e.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Copycat (3) de40c8.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Copycat (3) de40c8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Copycat (3) de40c8.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Copycat (3) de40c8.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Daredevil (2) b3cad4.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Daredevil (2) b3cad4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Daredevil (2) b3cad4.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Daredevil (2) b3cad4.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Daring Maneuver (2) fc82a5.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Daring Maneuver (2) fc82a5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Daring Maneuver (2) fc82a5.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Daring Maneuver (2) fc82a5.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Decorated Skull (3) 981f41.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Decorated Skull (3) 981f41.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Decorated Skull (3) 981f41.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Decorated Skull (3) 981f41.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Delilah O'Rourke (3) b81c84.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Delilah O'Rourke (3) b81c84.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Delilah O'Rourke (3) b81c84.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Delilah O'Rourke (3) b81c84.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Double, Double (4) 0e0530.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Double, Double (4) 0e0530.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Double, Double (4) 0e0530.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Double, Double (4) 0e0530.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Easy Mark (1) cdbb37.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Easy Mark (1) cdbb37.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Easy Mark (1) cdbb37.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Easy Mark (1) cdbb37.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card False Covenant (2) 3442f5.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card False Covenant (2) 3442f5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card False Covenant (2) 3442f5.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card False Covenant (2) 3442f5.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Fence (1) 2423e7.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Fence (1) 2423e7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Fence (1) 2423e7.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Fence (1) 2423e7.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Garrote Wire (2) 117b7c.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Garrote Wire (2) 117b7c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Garrote Wire (2) 117b7c.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Garrote Wire (2) 117b7c.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Hard Knocks (2) 15643b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Hard Knocks (2) 15643b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Hard Knocks (2) 15643b.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Hard Knocks (2) 15643b.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Haste (2) 1bd139.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Haste (2) 1bd139.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Haste (2) 1bd139.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Haste (2) 1bd139.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card High Roller (2) ce1b89.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card High Roller (2) ce1b89.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card High Roller (2) ce1b89.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card High Roller (2) ce1b89.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Hired Muscle (1) cdd6aa.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Hired Muscle (1) cdd6aa.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Hired Muscle (1) cdd6aa.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Hired Muscle (1) cdd6aa.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Hot Streak (2) f2508d.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Hot Streak (2) f2508d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Hot Streak (2) f2508d.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Hot Streak (2) f2508d.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Hot Streak (4) 4eb231.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Hot Streak (4) 4eb231.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Hot Streak (4) 4eb231.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Hot Streak (4) 4eb231.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Joey The Rat Vigil (3) 7b918b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Joey The Rat Vigil (3) 7b918b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Joey The Rat Vigil (3) 7b918b.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Joey The Rat Vigil (3) 7b918b.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Leo de Luca (1) 27446e.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Leo de Luca (1) 27446e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Leo de Luca (1) 27446e.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Leo de Luca (1) 27446e.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Liquid Courage (1) 5065a6.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Liquid Courage (1) 5065a6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Liquid Courage (1) 5065a6.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Liquid Courage (1) 5065a6.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Lockpicks (1) edd6c4.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Lockpicks (1) edd6c4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Lockpicks (1) edd6c4.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Lockpicks (1) edd6c4.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Lola Santiago (3) 8bec05.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Lola Santiago (3) 8bec05.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Lola Santiago (3) 8bec05.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Lola Santiago (3) 8bec05.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Lucky Cigarette Case (3) 0feb74.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Lucky Cigarette Case (3) 0feb74.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Lucky Cigarette Case (3) 0feb74.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Lucky Cigarette Case (3) 0feb74.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Lucky Dice (2) 9dd911.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Lucky Dice (2) 9dd911.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Lucky Dice (2) 9dd911.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Lucky Dice (2) 9dd911.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Lupara (3) a6af13.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Lupara (3) a6af13.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Lupara (3) a6af13.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Lupara (3) a6af13.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Manual Dexterity (2) 982716.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Manual Dexterity (2) 982716.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Manual Dexterity (2) 982716.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Manual Dexterity (2) 982716.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Mauser C96 (2) fc20b9.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Mauser C96 (2) fc20b9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Mauser C96 (2) fc20b9.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Mauser C96 (2) fc20b9.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Momentum (1) d753d7.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Momentum (1) d753d7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Momentum (1) d753d7.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Momentum (1) d753d7.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Moxie (1) 5fe780.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Moxie (1) 5fe780.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Moxie (1) 5fe780.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Moxie (1) 5fe780.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Opportunist (2) 63f145.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Opportunist (2) 63f145.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Opportunist (2) 63f145.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Opportunist (2) 63f145.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Pay Day (1) eaa415.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Pay Day (1) eaa415.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Pay Day (1) eaa415.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Pay Day (1) eaa415.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Pickpocketing (2) 2f4db2.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Pickpocketing (2) 2f4db2.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Pickpocketing (2) 2f4db2.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Pickpocketing (2) 2f4db2.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Pilfer (3) e503ce.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Pilfer (3) e503ce.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Pilfer (3) e503ce.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Pilfer (3) e503ce.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Priest of Two Faiths (1) 48e4a3.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Priest of Two Faiths (1) 48e4a3.yaml new file mode 100644 index 000000000..f208edd3d --- /dev/null +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Priest of Two Faiths (1) 48e4a3.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232104 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 48e4a3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Priest of Two Faiths (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.33 + posY: 1.41 + posZ: -74.79 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Sawed-Off Shotgun (5) e1c0f8.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Sawed-Off Shotgun (5) e1c0f8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Sawed-Off Shotgun (5) e1c0f8.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Sawed-Off Shotgun (5) e1c0f8.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Sharpshooter (3) 7f27d6.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Sharpshooter (3) 7f27d6.yaml similarity index 98% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Sharpshooter (3) 7f27d6.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Sharpshooter (3) 7f27d6.yaml index 13a6c3927..d50263b50 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Sharpshooter (3) 7f27d6.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Sharpshooter (3) 7f27d6.yaml @@ -37,7 +37,7 @@ Transform: posY: 1.41 posZ: -74.79 rotX: 0.02 - rotY: 269.97 + rotY: 269.91 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Skeptic (1) 37882c.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Skeptic (1) 37882c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Skeptic (1) 37882c.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Skeptic (1) 37882c.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Slip Away (2) 4a45c6.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Slip Away (2) 4a45c6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Slip Away (2) 4a45c6.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Slip Away (2) 4a45c6.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Sneak Attack (2) 5f19e0.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Sneak Attack (2) 5f19e0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Sneak Attack (2) 5f19e0.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Sneak Attack (2) 5f19e0.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Stealth (3) 26a3bf.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Stealth (3) 26a3bf.yaml similarity index 98% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Stealth (3) 26a3bf.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Stealth (3) 26a3bf.yaml index 7b01a4c13..941cd3388 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Stealth (3) 26a3bf.yaml +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Stealth (3) 26a3bf.yaml @@ -37,7 +37,7 @@ Transform: posY: 1.41 posZ: -74.79 rotX: 0.02 - rotY: 270.0 + rotY: 269.95 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Streetwise (3) d7dbac.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Streetwise (3) d7dbac.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Streetwise (3) d7dbac.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Streetwise (3) d7dbac.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Suggestion (1) 0ec9bf.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Suggestion (1) 0ec9bf.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Suggestion (1) 0ec9bf.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Suggestion (1) 0ec9bf.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Suggestion (4) e7f37b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Suggestion (4) e7f37b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Suggestion (4) e7f37b.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Suggestion (4) e7f37b.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Sure Gamble (3) 308be1.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Sure Gamble (3) 308be1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Sure Gamble (3) 308be1.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Sure Gamble (3) 308be1.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Swift Reload (2) 2cfa4f.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Swift Reload (2) 2cfa4f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Swift Reload (2) 2cfa4f.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Swift Reload (2) 2cfa4f.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Switchblade (2) 2fba3b.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Switchblade (2) 2fba3b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Switchblade (2) 2fba3b.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Switchblade (2) 2fba3b.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Tennessee Sour Mash (3) b5e5f1.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Tennessee Sour Mash (3) b5e5f1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Tennessee Sour Mash (3) b5e5f1.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Tennessee Sour Mash (3) b5e5f1.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card The Gold Pocket Watch (4) 62d930.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card The Gold Pocket Watch (4) 62d930.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card The Gold Pocket Watch (4) 62d930.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card The Gold Pocket Watch (4) 62d930.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card The Moon • XVIII (1) e80bd8.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card The Moon • XVIII (1) e80bd8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card The Moon • XVIII (1) e80bd8.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card The Moon • XVIII (1) e80bd8.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card The Skeleton Key (2) f8dc01.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card The Skeleton Key (2) f8dc01.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card The Skeleton Key (2) f8dc01.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card The Skeleton Key (2) f8dc01.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Think on Your Feet (2) 3e0653.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Think on Your Feet (2) 3e0653.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Think on Your Feet (2) 3e0653.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Think on Your Feet (2) 3e0653.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Three Aces (1) 30062e.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Three Aces (1) 30062e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Three Aces (1) 30062e.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Three Aces (1) 30062e.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Treasure Hunter (1) 18927e.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Treasure Hunter (1) 18927e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49/Card Treasure Hunter (1) 18927e.yaml rename to unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Treasure Hunter (1) 18927e.yaml diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Under Surveillance (1) cc8321.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Under Surveillance (1) cc8321.yaml new file mode 100644 index 000000000..0eac486f9 --- /dev/null +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22/Card Under Surveillance (1) cc8321.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232105 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cc8321 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Under Surveillance (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.33 + posY: 1.41 + posZ: -74.79 + rotX: 0.02 + rotY: 269.99 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49.ttslua b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49.ttslua deleted file mode 100644 index f999547e7..000000000 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49.ttslua +++ /dev/null @@ -1,503 +0,0 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49.yaml b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49.yaml deleted file mode 100644 index cfa0c7cad..000000000 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue fa4d49.yaml +++ /dev/null @@ -1,123 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 -ContainedObjects: -- !include 'Custom_Model_Bag Rogue fa4d49/Card False Covenant (2) 3442f5.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Skeptic (1) 37882c.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Another Day, Another Dollar (3) 006d44.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Ace in the Hole (3) 074858.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Cheap Shot (2) 0b963c.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Borrowed Time (3) 0db666.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Double, Double (4) 0e0530.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Chuck Fergus (5) 0e72b6.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Suggestion (1) 0ec9bf.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Lucky Cigarette Case (3) 0feb74.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Garrote Wire (2) 117b7c.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Hard Knocks (2) 15643b.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Treasure Hunter (1) 18927e.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Haste (2) 1bd139.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Charon''s Obol (1) 1dbc95.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Fence (1) 2423e7.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Stealth (3) 26a3bf.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Leo de Luca (1) 27446e.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Burglary (2) 2aeb8a.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Swift Reload (2) 2cfa4f.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Pickpocketing (2) 2f4db2.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Switchblade (2) 2fba3b.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Cat Burglar (1) 2fe723.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Three Aces (1) 30062e.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Sure Gamble (3) 308be1.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Cheat Death (5) 3add54.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Think on Your Feet (2) 3e0653.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Slip Away (2) 4a45c6.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Hot Streak (4) 4eb231.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Liquid Courage (1) 5065a6.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Sneak Attack (2) 5f19e0.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Moxie (1) 5fe780.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Contraband (2) 620b6e.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card The Gold Pocket Watch (4) 62d930.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Opportunist (2) 63f145.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Adaptable (1) 731d2a.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Joey The Rat Vigil (3) 7b918b.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Backstab (3) 7baf75.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card All In (5) 7d3a27.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Sharpshooter (3) 7f27d6.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Lola Santiago (3) 8bec05.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Beretta M1918 (4) 91da6b.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Decorated Skull (3) 981f41.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Manual Dexterity (2) 982716.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Lucky Dice (2) 9dd911.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Lupara (3) a6af13.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Daredevil (2) b3cad4.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Tennessee Sour Mash (3) b5e5f1.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Delilah O''Rourke (3) b81c84.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Colt Vest Pocket (2) bab03b.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Easy Mark (1) cdbb37.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Hired Muscle (1) cdd6aa.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card High Roller (2) ce1b89.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card .45 Thompson (3) d4dbc7.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Momentum (1) d753d7.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Streetwise (3) d7dbac.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Copycat (3) de40c8.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Sawed-Off Shotgun (5) e1c0f8.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Pilfer (3) e503ce.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Suggestion (4) e7f37b.yaml' -- !include "Custom_Model_Bag Rogue fa4d49/Card The Moon \u2022 XVIII (1) e80bd8.yaml" -- !include 'Custom_Model_Bag Rogue fa4d49/Card Pay Day (1) eaa415.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Chicago Typewriter (4) ecfa42.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Lockpicks (1) edd6c4.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Hot Streak (2) f2508d.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card .41 Derringer (2) f57af7.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card The Skeleton Key (2) f8dc01.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Mauser C96 (2) fc20b9.yaml' -- !include 'Custom_Model_Bag Rogue fa4d49/Card Daring Maneuver (2) fc82a5.yaml' -CustomMesh: - CastShadows: true - ColliderURL: '' - Convex: true - CustomShader: - FresnelStrength: 0.0 - SpecularColor: - b: 1.0 - g: 1.0 - r: 1.0 - SpecularIntensity: 0.0 - SpecularSharpness: 2.0 - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515898740/E92441671B056D4CDF99DF9E6C88BE6598AAB50F/ - MaterialIndex: 3 - MeshURL: https://pastebin.com/raw/ALrYhQGb - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: fa4d49 -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: !include 'Custom_Model_Bag Rogue fa4d49.ttslua' -LuaScriptState: '{"ml":{"006d44":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208092760294676,"y":269.999420166016,"z":0.0167703833431005}},"074858":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30159258842468,"z":-70.4202041625977},"rot":{"x":0.0208090171217918,"y":269.998901367188,"z":0.0167705975472927}},"098da7":{"lock":false,"pos":{"x":58.0935859680176,"y":1.30816042423248,"z":-54.3712768554688},"rot":{"x":0.0208071302622557,"y":270.004486083984,"z":0.0167728867381811}},"0b963c":{"lock":false,"pos":{"x":52.944221496582,"y":1.30697858333588,"z":-52.0198783874512},"rot":{"x":0.0208123680204153,"y":269.987548828125,"z":0.0167668387293816}},"0db666":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768872261047,"z":-63.5084457397461},"rot":{"x":0.0208093971014023,"y":269.999389648438,"z":0.0167707167565823}},"0e0530":{"lock":false,"pos":{"x":32.9852981567383,"y":1.30107951164246,"z":-47.4095573425293},"rot":{"x":0.0208172202110291,"y":269.970947265625,"z":0.0167613811790943}},"0e72b6":{"lock":false,"pos":{"x":32.985279083252,"y":1.29906010627747,"z":-54.3083381652832},"rot":{"x":0.02082066424191,"y":269.958343505859,"z":0.0167555846273899}},"0ec9bf":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29767024517059,"z":-68.119873046875},"rot":{"x":0.0208085533231497,"y":269.999542236328,"z":0.0167709365487099}},"0feb74":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208167433738709,"y":269.970153808594,"z":0.0167600121349096}},"117b7c":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208026114851236,"y":270.02294921875,"z":0.0167798530310392}},"15643b":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208025388419628,"y":270.023132324219,"z":0.0167798269540071}},"18927e":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29632365703583,"z":-72.719970703125},"rot":{"x":0.0208086185157299,"y":269.999572753906,"z":0.0167709179222584}},"1bd139":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.02080262824893,"y":270.02294921875,"z":0.0167800076305866}},"1dbc95":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208087600767612,"y":269.999450683594,"z":0.0167709533125162}},"2423e7":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170965194702,"z":-54.3199996948242},"rot":{"x":0.0208087954670191,"y":269.999481201172,"z":0.0167708713561296}},"26a3bf":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29230272769928,"z":-81.9085083007813},"rot":{"x":0.020808506757021,"y":269.999267578125,"z":0.0167694017291069}},"27446e":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036318302155,"z":-58.9200057983398},"rot":{"x":0.0208086427301168,"y":269.999481201172,"z":0.0167708210647106}},"2aeb8a":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29497730731964,"z":-77.3199081420898},"rot":{"x":0.0208017602562904,"y":270.023284912109,"z":0.0167795997112989}},"2cfa4f":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293905735016,"z":-65.8202133178711},"rot":{"x":0.0208086222410202,"y":270.000274658203,"z":0.0167712960392237}},"2f4db2":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208032093942165,"y":270.019836425781,"z":0.01677774079144}},"2fba3b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208088997751474,"y":270.000610351563,"z":0.0167708750814199}},"2fe723":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208086147904396,"y":269.999450683594,"z":0.0167707521468401}},"30062e":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30883598327637,"z":-52.0709686279297},"rot":{"x":0.0208017639815807,"y":270.022705078125,"z":0.0167791415005922}},"308be1":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202514648438},"rot":{"x":0.0208088271319866,"y":269.998748779297,"z":0.0167703907936811}},"3442f5":{"lock":false,"pos":{"x":40.2920913696289,"y":1.29363143444061,"z":-81.9201049804688},"rot":{"x":0.0208085235208273,"y":269.998931884766,"z":0.0167708415538073}},"37882c":{"lock":false,"pos":{"x":58.099666595459,"y":1.30950927734375,"z":-49.7709617614746},"rot":{"x":0.0208085048943758,"y":269.998962402344,"z":0.0167708918452263}},"3add54":{"lock":false,"pos":{"x":52.9462394714355,"y":1.29822707176209,"z":-81.9204635620117},"rot":{"x":0.0208089258521795,"y":269.999328613281,"z":0.0167710725218058}},"3bd955":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208088047802448,"y":269.998901367188,"z":0.0167707744985819}},"3e0653":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202163696289},"rot":{"x":0.0208083707839251,"y":270.000396728516,"z":0.0167714115232229}},"4a45c6":{"lock":false,"pos":{"x":52.9442176818848,"y":1.30428564548492,"z":-61.2198486328125},"rot":{"x":0.0208134297281504,"y":269.98388671875,"z":0.0167652182281017}},"4b4df3":{"lock":false,"pos":{"x":32.9852867126465,"y":1.29973292350769,"z":-52.0095596313477},"rot":{"x":0.0208076201379299,"y":270.004333496094,"z":0.016772111877799}},"4eb231":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889965057373,"z":-79.620246887207},"rot":{"x":0.020808657631278,"y":269.999267578125,"z":0.0167710408568382}},"5065a6":{"lock":false,"pos":{"x":40.2900619506836,"y":1.29969000816345,"z":-61.2195243835449},"rot":{"x":0.0208149272948503,"y":269.978210449219,"z":0.0167631711810827}},"587bc5":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.0208018943667412,"y":270.023376464844,"z":0.016779126599431}},"5f19e0":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30361223220825,"z":-63.5203590393066},"rot":{"x":0.0208082981407642,"y":270.000549316406,"z":0.0167712233960629}},"5fe780":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208087954670191,"y":269.99951171875,"z":0.0167712066322565}},"620b6e":{"lock":false,"pos":{"x":52.9442100524902,"y":1.3063051700592,"z":-54.3203468322754},"rot":{"x":0.0208082180470228,"y":270.000732421875,"z":0.0167711284011602}},"62d930":{"lock":false,"pos":{"x":32.985279083252,"y":1.29973292350769,"z":-52.0095634460449},"rot":{"x":0.0208149123936892,"y":269.978515625,"z":0.0167629700154066}},"63f145":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208105612546206,"y":269.993408203125,"z":0.0167683623731136}},"705e27":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29095637798309,"z":-86.5083084106445},"rot":{"x":0.0208175927400589,"y":269.971008300781,"z":0.0167607720941305}},"731d2a":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372941493988,"z":-47.4200057983398},"rot":{"x":0.0208088979125023,"y":269.999450683594,"z":0.0167707968503237}},"7b918b":{"lock":false,"pos":{"x":36.6243362426758,"y":1.2956690788269,"z":-70.4083023071289},"rot":{"x":0.0208081752061844,"y":270.000061035156,"z":0.0167697407305241}},"7baf75":{"lock":false,"pos":{"x":52.9442176818848,"y":1.30091941356659,"z":-72.7198333740234},"rot":{"x":0.020814711228013,"y":269.979187011719,"z":0.0167635828256607}},"7d3a27":{"lock":false,"pos":{"x":58.0996894836426,"y":1.30546903610229,"z":-63.5731620788574},"rot":{"x":0.0208336543291807,"y":269.915924072266,"z":0.016740545630455}},"7f27d6":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.608283996582},"rot":{"x":0.0208184029906988,"y":269.965637207031,"z":0.0167571827769279}},"8bec05":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083892822266},"rot":{"x":0.0208080857992172,"y":269.999450683594,"z":0.0167705006897449}},"91da6b":{"lock":false,"pos":{"x":36.6086463928223,"y":1.29028046131134,"z":-88.7977447509766},"rot":{"x":0.0208183489739895,"y":269.965606689453,"z":0.0167574789375067}},"96ed77":{"lock":false,"pos":{"x":36.6243705749512,"y":1.29364931583405,"z":-77.3084411621094},"rot":{"x":0.0208086725324392,"y":270,"z":0.0167709607630968}},"981f41":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29701554775238,"z":-65.8082962036133},"rot":{"x":0.0208085309714079,"y":269.999481201172,"z":0.0167695712298155}},"982716":{"lock":false,"pos":{"x":58.099666595459,"y":1.3074893951416,"z":-56.6709747314453},"rot":{"x":0.0208121724426746,"y":269.988311767578,"z":0.0167665407061577}},"9dd911":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208017807453871,"y":270.023010253906,"z":0.0167793035507202}},"a6af13":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.0208080317825079,"y":269.999450683594,"z":0.0167706310749054}},"b05089":{"lock":false,"pos":{"x":40.6759,"y":1.3023,"z":-56.6129},"rot":{"x":0.0208,"y":269.9999,"z":0.0168}},"b3cad4":{"lock":false,"pos":{"x":58.099666595459,"y":1.30816268920898,"z":-54.3709716796875},"rot":{"x":0.0208022575825453,"y":270.022705078125,"z":0.016779026016593}},"b5e5f1":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29095637798309,"z":-86.5082931518555},"rot":{"x":0.02080830745399,"y":269.999481201172,"z":0.0167694929987192}},"b81c84":{"lock":false,"pos":{"x":36.6243362426758,"y":1.296342253685,"z":-68.1082992553711},"rot":{"x":0.0208079889416695,"y":269.999450683594,"z":0.0167707167565823}},"bab03b":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29430389404297,"z":-79.6199111938477},"rot":{"x":0.0208016652613878,"y":270.023193359375,"z":0.0167794395238161}},"cb4730":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208081230521202,"y":270.001678466797,"z":0.0167717300355434}},"cdbb37":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30832493305206,"z":-47.420295715332},"rot":{"x":0.0208085924386978,"y":269.99951171875,"z":0.0167709868401289}},"cdd6aa":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208085924386978,"y":269.999481201172,"z":0.0167710017412901}},"ce1b89":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093325138092,"z":-91.1157989501953},"rot":{"x":0.0208020973950624,"y":270.02294921875,"z":0.016779949888587}},"d041f0":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208086390048265,"y":269.99951171875,"z":0.0167709290981293}},"d4dbc7":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.0208092778921127,"y":269.999420166016,"z":0.0167703665792942}},"d753d7":{"lock":false,"pos":{"x":58.098804473877,"y":1.31018531322479,"z":-47.4597969055176},"rot":{"x":0.0208099950104952,"y":269.994689941406,"z":0.0167692359536886}},"d7dbac":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29162967205048,"z":-84.2082901000977},"rot":{"x":0.0208083968609571,"y":269.999542236328,"z":0.0167703125625849}},"de40c8":{"lock":false,"pos":{"x":58.1010513305664,"y":1.30613505840302,"z":-61.2994766235352},"rot":{"x":0.0208303611725569,"y":269.925231933594,"z":0.0167440343648195}},"e1c0f8":{"lock":false,"pos":{"x":32.985279083252,"y":1.29838681221008,"z":-56.608341217041},"rot":{"x":0.0208079852163792,"y":270.002868652344,"z":0.0167718678712845}},"e503ce":{"lock":false,"pos":{"x":52.9442176818848,"y":1.3002462387085,"z":-75.0198440551758},"rot":{"x":0.0208148825913668,"y":269.978363037109,"z":0.0167633462697268}},"e7f37b":{"lock":false,"pos":{"x":32.985279083252,"y":1.30040621757507,"z":-49.7095642089844},"rot":{"x":0.0208172537386417,"y":269.970855712891,"z":0.0167601369321346}},"e80bd8":{"lock":false,"pos":{"x":40.2900543212891,"y":1.29699695110321,"z":-70.4198608398438},"rot":{"x":0.0208088792860508,"y":269.999572753906,"z":0.0167709421366453}},"e84232":{"lock":false,"pos":{"x":44.229,"y":1.2968,"z":-79.6006},"rot":{"x":0.0208,"y":269.9999,"z":0.0168}},"e92e98":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30563187599182,"z":-56.6203498840332},"rot":{"x":0.0208081025630236,"y":270.000732421875,"z":0.0167712345719337}},"eaa415":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30765163898468,"z":-49.7202949523926},"rot":{"x":0.0208086669445038,"y":269.99951171875,"z":0.0167709980159998}},"ecfa42":{"lock":false,"pos":{"x":36.6082725524902,"y":1.28960525989532,"z":-91.1042709350586},"rot":{"x":0.0208169128745794,"y":269.971038818359,"z":0.0167596116662025}},"edd6c4":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.0208086650818586,"y":269.999542236328,"z":0.0167708732187748}},"eef1e6":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30024588108063,"z":-75.0203475952148},"rot":{"x":0.0208095647394657,"y":269.998809814453,"z":0.0167709831148386}},"f2508d":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208083130419254,"y":270.000610351563,"z":0.0167713221162558}},"f4434f":{"lock":false,"pos":{"x":52.944206237793,"y":1.30697846412659,"z":-52.0203437805176},"rot":{"x":0.0208083316683769,"y":270.000793457031,"z":0.016771350055933}},"f57af7":{"lock":false,"pos":{"x":40.2900390625,"y":1.29565036296844,"z":-75.0200042724609},"rot":{"x":0.0208017565310001,"y":270.023376464844,"z":0.0167798902839422}},"f8dc01":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208083726465702,"y":270.001556396484,"z":0.0167714580893517}},"fb4e3f":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208082739263773,"y":270.000579833984,"z":0.0167713910341263}},"fc20b9":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30172824859619,"z":-49.7084617614746},"rot":{"x":0.0208157207816839,"y":269.975402832031,"z":0.016761913895607}},"fc82a5":{"lock":false,"pos":{"x":52.9442291259766,"y":1.3056321144104,"z":-56.6198539733887},"rot":{"x":0.0208129268139601,"y":269.984924316406,"z":0.016765670850873}},"ff1b0c":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29499578475952,"z":-72.7084045410156},"rot":{"x":0.0208092220127583,"y":269.999450683594,"z":0.0167716108262539}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Rogue -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 66.31 - posY: 1.66 - posZ: -74.79 - rotX: 0.02 - rotY: 270.02 - rotZ: 0.02 - scaleX: 1.2 - scaleY: 1.2 - scaleZ: 1.2 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5.ttslua b/unpacked/Custom_Model_Bag Seeker 1e7fc5.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5.ttslua +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5.yaml index a1a820af6..b38a0d694 100644 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5.yaml +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5.yaml @@ -4,8 +4,8 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea.yaml' -- !include 'Custom_Model_Bag Seeker 1e7fc5/Card Eldritch Sophist 53d103.yaml' +- !include 'Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.yaml' +- !include 'Custom_Model_Bag Seeker 1e7fc5/Card The Truth Beckons ca1b5c.yaml' - !include 'Custom_Model_Bag Seeker 1e7fc5/Card Shortcut 00ade1.yaml' - !include 'Custom_Model_Bag Seeker 1e7fc5/Card Occult Invocation 010509.yaml' - !include 'Custom_Model_Bag Seeker 1e7fc5/Card Extensive Research 013446.yaml' @@ -26,8 +26,9 @@ ContainedObjects: - !include 'Custom_Model_Bag Seeker 1e7fc5/Card Plan of Action 3b9c2c.yaml' - !include 'Custom_Model_Bag Seeker 1e7fc5/Card Whitton Greene 3c5099.yaml' - !include 'Custom_Model_Bag Seeker 1e7fc5/Card Occult Lexicon 3d6f47.yaml' -- !include 'Custom_Model_Bag Seeker 1e7fc5/Card Dr. Milian Christopher 4ee663.yaml' +- !include 'Custom_Model_Bag Seeker 1e7fc5/Card Dr. Milan Christopher 4ee663.yaml' - !include 'Custom_Model_Bag Seeker 1e7fc5/Card Dream Diary 52f66c.yaml' +- !include 'Custom_Model_Bag Seeker 1e7fc5/Card Eldritch Sophist 53d103.yaml' - !include 'Custom_Model_Bag Seeker 1e7fc5/Card Archaic Glyphs 560b32.yaml' - !include 'Custom_Model_Bag Seeker 1e7fc5/Card Dr. William T. Maleson 5e0769.yaml' - !include 'Custom_Model_Bag Seeker 1e7fc5/Card Preposterous Sketches 65a64f.yaml' @@ -100,7 +101,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: true LuaScript: !include 'Custom_Model_Bag Seeker 1e7fc5.ttslua' -LuaScriptState: '{"ml":{"00ade1":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.0208089146763086,"y":269.999237060547,"z":0.0167710985988379}},"010509":{"lock":false,"pos":{"x":53.2284660339355,"y":1.2974728345871,"z":55.641185760498},"rot":{"x":0.0208114627748728,"y":269.990295410156,"z":0.0167677570134401}},"013446":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30285882949829,"z":74.0412216186523},"rot":{"x":0.0208111777901649,"y":269.99072265625,"z":0.0167678743600845}},"03bb19":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208170730620623,"y":269.971069335938,"z":0.0167604517191648}},"05125c":{"lock":false,"pos":{"x":37.4159965515137,"y":1.30250763893127,"z":92.4607315063477},"rot":{"x":0.0208078976720572,"y":269.999938964844,"z":0.0167709328234196}},"05660e":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30355060100555,"z":80.9527740478516},"rot":{"x":0.0208085905760527,"y":269.999938964844,"z":0.0167712699621916}},"070246":{"lock":false,"pos":{"x":53.2204895019531,"y":1.30017030239105,"z":64.8664398193359},"rot":{"x":0.0209635645151138,"y":269.467224121094,"z":0.0165769252926111}},"088c27":{"lock":false,"pos":{"x":53.2046852111816,"y":1.29612827301025,"z":51.0772857666016},"rot":{"x":0.0209585633128881,"y":269.485229492188,"z":0.0165835153311491}},"0a4d22":{"lock":false,"pos":{"x":40.9634208679199,"y":1.2916773557663,"z":51.0597610473633},"rot":{"x":0.0208115633577108,"y":269.990875244141,"z":0.0167674757540226}},"0abaf8":{"lock":false,"pos":{"x":40.9603080749512,"y":1.29638135433197,"z":67.1338729858398},"rot":{"x":0.0208081174641848,"y":270.001770019531,"z":0.0167716667056084}},"0d29be":{"lock":false,"pos":{"x":53.228588104248,"y":1.30622506141663,"z":85.5412445068359},"rot":{"x":0.020949499681592,"y":269.515899658203,"z":0.0165947545319796}},"1753a8":{"lock":false,"pos":{"x":53.2277336120605,"y":1.30420529842377,"z":78.6426696777344},"rot":{"x":0.0208094753324986,"y":269.952514648438,"z":0.0167681593447924}},"176d57":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30109846591949,"z":83.2488479614258},"rot":{"x":0.020808594301343,"y":270.000030517578,"z":0.0167710836976767}},"178794":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30353188514709,"z":76.3414459228516},"rot":{"x":0.0208091642707586,"y":269.999633789063,"z":0.0167708769440651}},"1c353d":{"lock":false,"pos":{"x":40.9601745605469,"y":1.29571235179901,"z":64.8486557006836},"rot":{"x":0.0208086147904396,"y":270,"z":0.0167713183909655}},"2239d4":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29981470108032,"z":83.2607192993164},"rot":{"x":0.0208092052489519,"y":270.000183105469,"z":0.0167716555297375}},"244e5d":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30875563621521,"z":87.7903671264648},"rot":{"x":0.0208189226686955,"y":269.964630126953,"z":0.0167582873255014}},"27258f":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208087135106325,"y":269.999328613281,"z":0.0167710948735476}},"338973":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30083978176117,"z":67.1435165405273},"rot":{"x":0.0209631063044071,"y":269.468658447266,"z":0.0165774803608656}},"38217d":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30689835548401,"z":87.8414535522461},"rot":{"x":0.0208083894103765,"y":270.000457763672,"z":0.0167712587863207}},"3b9c2c":{"lock":false,"pos":{"x":58.3838500976563,"y":1.30740916728973,"z":83.1903762817383},"rot":{"x":0.0208088159561157,"y":269.999450683594,"z":0.0167710911482573}},"3c5099":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29308223724365,"z":60.2607688903809},"rot":{"x":0.0208115875720978,"y":269.990539550781,"z":0.0167672373354435}},"3d6f47":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29779493808746,"z":76.360710144043},"rot":{"x":0.0208092927932739,"y":270.000061035156,"z":0.0167716797441244}},"3f0c57":{"lock":false,"pos":{"x":40.9634284973145,"y":1.2916773557663,"z":51.0598754882813},"rot":{"x":0.0208078045397997,"y":270.000061035156,"z":0.0167713537812233}},"4ee663":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29840540885925,"z":74.0486907958984},"rot":{"x":0.0208085309714079,"y":270.000061035156,"z":0.0167711935937405}},"52f66c":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638564586639,"z":67.148681640625},"rot":{"x":0.0208084583282471,"y":270.000030517578,"z":0.0167713686823845}},"53d103":{"lock":false,"pos":{"x":40.9602546691895,"y":1.29503774642944,"z":62.5439567565918},"rot":{"x":0.0208096951246262,"y":269.996398925781,"z":0.0167700108140707}},"560b32":{"lock":false,"pos":{"x":40.960205078125,"y":1.30311810970306,"z":90.1487045288086},"rot":{"x":0.0208085309714079,"y":270.000030517578,"z":0.0167714171111584}},"5e0769":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705893993378,"z":69.4486846923828},"rot":{"x":0.0208084564656019,"y":270.000061035156,"z":0.0167710464447737}},"65a64f":{"lock":false,"pos":{"x":53.2126159667969,"y":1.29544854164124,"z":48.7452774047852},"rot":{"x":0.0208086259663105,"y":270,"z":0.0167712587863207}},"6743e2":{"lock":false,"pos":{"x":40.9634399414063,"y":1.29369390010834,"z":57.9487953186035},"rot":{"x":0.02080855704844,"y":270.000366210938,"z":0.0167711358517408}},"6d5337":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29881918430328,"z":60.2411842346191},"rot":{"x":0.0208086259663105,"y":270.000335693359,"z":0.0167714841663837}},"70406e":{"lock":false,"pos":{"x":53.2285766601563,"y":1.3075715303421,"z":90.141471862793},"rot":{"x":0.0208083391189575,"y":270.000366210938,"z":0.0167713202536106}},"73172c":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29914140701294,"z":80.9607162475586},"rot":{"x":0.0208094585686922,"y":269.999938964844,"z":0.0167716164141893}},"7833aa":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30622506141663,"z":85.5414810180664},"rot":{"x":0.0208083316683769,"y":270.000518798828,"z":0.0167712830007076}},"7973c0":{"lock":false,"pos":{"x":40.9602088928223,"y":1.29773211479187,"z":71.7486877441406},"rot":{"x":0.0208083614706993,"y":270.00048828125,"z":0.0167712196707726}},"7b6e14":{"lock":false,"pos":{"x":53.228630065918,"y":1.29680037498474,"z":53.3435668945313},"rot":{"x":0.0209661237895489,"y":269.458129882813,"z":0.0165737457573414}},"7d0ada":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29375553131104,"z":62.5607681274414},"rot":{"x":0.0208084918558598,"y":270.000091552734,"z":0.0167706683278084}},"7dfe08":{"lock":false,"pos":{"x":40.960205078125,"y":1.30244493484497,"z":87.8487014770508},"rot":{"x":0.0208085477352142,"y":270.000030517578,"z":0.0167712103575468}},"8595fb":{"lock":false,"pos":{"x":37.4159736633301,"y":1.30183446407318,"z":90.1607284545898},"rot":{"x":0.0208120103925467,"y":269.990325927734,"z":0.0167681258171797}},"889177":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30048787593842,"z":85.5607223510742},"rot":{"x":0.0208090450614691,"y":270.001068115234,"z":0.0167719591408968}},"922850":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302072525024,"z":55.6492195129395},"rot":{"x":0.0208177138119936,"y":269.969573974609,"z":0.0167596247047186}},"92890f":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29644846916199,"z":71.7607116699219},"rot":{"x":0.0208092294633389,"y":270.000457763672,"z":0.0167714804410934}},"94abd7":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30555188655853,"z":83.2414474487305},"rot":{"x":0.0208084508776665,"y":270.000274658203,"z":0.0167712271213531}},"9902a8":{"lock":false,"pos":{"x":37.4159812927246,"y":1.3011611700058,"z":87.860725402832},"rot":{"x":0.0208091977983713,"y":270.000457763672,"z":0.0167717430740595}},"9bfe76":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29510200023651,"z":67.1606903076172},"rot":{"x":0.020808007568121,"y":270.000061035156,"z":0.0167708769440651}},"a5c1cd":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30379140377045,"z":92.4488830566406},"rot":{"x":0.0208085775375366,"y":270.000122070313,"z":0.0167712010443211}},"a614de":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369378089905,"z":57.9485626220703},"rot":{"x":0.0208115540444851,"y":269.990417480469,"z":0.0167671982198954}},"adde8d":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30353200435638,"z":76.3412246704102},"rot":{"x":0.020808732137084,"y":269.999389648438,"z":0.0167711768299341}},"af84e6":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30042517185211,"z":80.9486923217773},"rot":{"x":0.0208097752183676,"y":269.995544433594,"z":0.0167694855481386}},"b3debc":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29846823215485,"z":78.6607131958008},"rot":{"x":0.0208093021064997,"y":269.999938964844,"z":0.0167715214192867}},"b57f33":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30557036399841,"z":87.8527908325195},"rot":{"x":0.0208086408674717,"y":270.000183105469,"z":0.0167713351547718}},"b73951":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.0208087209612131,"y":270,"z":0.016770688816905}},"ba1c85":{"lock":false,"pos":{"x":58.3838539123535,"y":1.30808246135712,"z":85.4903793334961},"rot":{"x":0.0208169631659985,"y":269.971832275391,"z":0.0167610887438059}},"bc0fb2":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30489695072174,"z":85.5527801513672},"rot":{"x":0.0208084564656019,"y":270.000244140625,"z":0.0167711675167084}},"bc5a8d":{"lock":false,"pos":{"x":40.9601936340332,"y":1.2957124710083,"z":64.848876953125},"rot":{"x":0.0208088587969542,"y":270.000335693359,"z":0.0167714487761259}},"bf4815":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3021856546402,"z":71.7412185668945},"rot":{"x":0.0208084601908922,"y":270.000091552734,"z":0.0167710334062576}},"c03b59":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30422389507294,"z":83.2527770996094},"rot":{"x":0.0208083055913448,"y":270.000213623047,"z":0.0167712196707726}},"cc7761":{"lock":false,"pos":{"x":53.2305908203125,"y":1.29814684391022,"z":57.9409637451172},"rot":{"x":0.0208086352795362,"y":270.000274658203,"z":0.016771113499999}},"d1c417":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30042517185211,"z":80.9488067626953},"rot":{"x":0.0208072233945131,"y":269.999969482422,"z":0.0167714934796095}},"d287bc":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30177164077759,"z":85.5487060546875},"rot":{"x":0.0208111815154552,"y":269.990661621094,"z":0.0167677607387304}},"d5bad4":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29100203514099,"z":48.7527389526367},"rot":{"x":0.0208087358623743,"y":270,"z":0.0167706683278084}},"d6c44a":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29907870292664,"z":76.3486862182617},"rot":{"x":0.0208112820982933,"y":269.990600585938,"z":0.0167677719146013}},"d83a35":{"lock":false,"pos":{"x":53.2285804748535,"y":1.30487847328186,"z":80.9414367675781},"rot":{"x":0.0208084881305695,"y":270.000335693359,"z":0.0167712420225143}},"d950d8":{"lock":false,"pos":{"x":37.4159660339355,"y":1.29510200023651,"z":67.1606750488281},"rot":{"x":0.020809156820178,"y":270.000457763672,"z":0.0167718138545752}},"dbb0e0":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436600208282,"z":60.2487869262695},"rot":{"x":0.0208114571869373,"y":269.990356445313,"z":0.0167671535164118}},"dff559":{"lock":false,"pos":{"x":53.230598449707,"y":1.29814660549164,"z":57.9409141540527},"rot":{"x":0.0208087917417288,"y":270.000122070313,"z":0.0167707074433565}},"e13107":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29712176322937,"z":74.0607147216797},"rot":{"x":0.0208091102540493,"y":270.000457763672,"z":0.0167717114090919}},"e4f8ba":{"lock":false,"pos":{"x":49.5785140991211,"y":1.30691921710968,"z":92.4415512084961},"rot":{"x":0.0208086799830198,"y":270,"z":0.0167711228132248}},"e5d521":{"lock":false,"pos":{"x":37.4159660339355,"y":1.29442870616913,"z":64.8606719970703},"rot":{"x":0.0208094995468855,"y":270,"z":0.0167716350406408}},"e69708":{"lock":false,"pos":{"x":40.960205078125,"y":1.30379140377045,"z":92.4486923217773},"rot":{"x":0.020811403170228,"y":269.990142822266,"z":0.0167674291878939}},"e7f376":{"lock":false,"pos":{"x":58.3838577270508,"y":1.30942893028259,"z":90.0903930664063},"rot":{"x":0.0208188742399216,"y":269.96484375,"z":0.0167582537978888}},"e957df":{"lock":false,"pos":{"x":53.2285690307617,"y":1.3082447052002,"z":92.4413375854492},"rot":{"x":0.0208085123449564,"y":270.000030517578,"z":0.0167710185050964}},"eac7ac":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30177164077759,"z":85.5487518310547},"rot":{"x":0.0208083540201187,"y":269.999938964844,"z":0.0167701616883278}},"f475ca":{"lock":false,"pos":{"x":37.4159736633301,"y":1.2957751750946,"z":69.4607086181641},"rot":{"x":0.0208094362169504,"y":270,"z":0.0167716238647699}},"f6b017":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29949259757996,"z":62.5411834716797},"rot":{"x":0.0208085123449564,"y":270,"z":0.0167711041867733}},"f8e2fb":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30151236057281,"z":69.4412155151367},"rot":{"x":0.0208085831254721,"y":270.000183105469,"z":0.0167711284011602}},"fb48a9":{"lock":false,"pos":{"x":58.3838386535645,"y":1.31010210514069,"z":92.3903656005859},"rot":{"x":0.0208168085664511,"y":269.971313476563,"z":0.0167605876922607}},"ff2776":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30420529842377,"z":78.641227722168},"rot":{"x":0.0208113752305508,"y":269.990325927734,"z":0.0167676098644733}}}}' +LuaScriptState: '{"ml":{"00ade1":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.020808769389987,"y":269.999237060547,"z":0.0167711433023214}},"010509":{"lock":false,"pos":{"x":53.2284660339355,"y":1.29747271537781,"z":55.641185760498},"rot":{"x":0.0208113547414541,"y":269.990295410156,"z":0.0167675297707319}},"013446":{"lock":false,"pos":{"x":53.2285575866699,"y":1.302858710289,"z":74.0412216186523},"rot":{"x":0.0208112969994545,"y":269.99072265625,"z":0.0167677029967308}},"03bb19":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208170618861914,"y":269.971069335938,"z":0.0167606230825186}},"05125c":{"lock":false,"pos":{"x":37.4159965515137,"y":1.30250763893127,"z":92.4607315063477},"rot":{"x":0.0208084583282471,"y":269.999938964844,"z":0.0167710669338703}},"05660e":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30287730693817,"z":78.6527709960938},"rot":{"x":0.0208094343543053,"y":269.999877929688,"z":0.0167714580893517}},"070246":{"lock":false,"pos":{"x":53.2204895019531,"y":1.30017018318176,"z":64.8664398193359},"rot":{"x":0.020963404327631,"y":269.467224121094,"z":0.0165769569575787}},"088c27":{"lock":false,"pos":{"x":53.2046852111816,"y":1.29612815380096,"z":51.0772857666016},"rot":{"x":0.0209583602845669,"y":269.485229492188,"z":0.0165834855288267}},"0a4d22":{"lock":false,"pos":{"x":40.9634208679199,"y":1.2916773557663,"z":51.0597610473633},"rot":{"x":0.0208113174885511,"y":269.990875244141,"z":0.0167680215090513}},"0abaf8":{"lock":false,"pos":{"x":40.9603080749512,"y":1.29638135433197,"z":67.1338729858398},"rot":{"x":0.0208081174641848,"y":270.001770019531,"z":0.0167716667056084}},"0d29be":{"lock":false,"pos":{"x":53.228588104248,"y":1.30622494220734,"z":85.5412445068359},"rot":{"x":0.0209493730217218,"y":269.515899658203,"z":0.016594747081399}},"1753a8":{"lock":false,"pos":{"x":53.2277336120605,"y":1.30420529842377,"z":78.6426696777344},"rot":{"x":0.0208094753324986,"y":269.952514648438,"z":0.0167681593447924}},"176d57":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30109834671021,"z":83.2488479614258},"rot":{"x":0.0208084415644407,"y":270.000030517578,"z":0.0167710427194834}},"178794":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30353188514709,"z":76.3414459228516},"rot":{"x":0.0208091642707586,"y":269.999633789063,"z":0.0167708769440651}},"1c353d":{"lock":false,"pos":{"x":40.9601745605469,"y":1.29571235179901,"z":64.8486557006836},"rot":{"x":0.0208086092025042,"y":270,"z":0.0167712010443211}},"2239d4":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29981470108032,"z":83.2607192993164},"rot":{"x":0.0208086315542459,"y":270.000183105469,"z":0.016771387308836}},"244e5d":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30875563621521,"z":87.7903671264648},"rot":{"x":0.0208188407123089,"y":269.964630126953,"z":0.0167584121227264}},"27258f":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208089575171471,"y":269.999328613281,"z":0.0167708266526461}},"338973":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30083966255188,"z":67.1435165405273},"rot":{"x":0.0209632162004709,"y":269.468658447266,"z":0.0165775809437037}},"38217d":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30689823627472,"z":87.8414535522461},"rot":{"x":0.020808469504118,"y":270.000457763672,"z":0.0167712792754173}},"3b9c2c":{"lock":false,"pos":{"x":58.3838500976563,"y":1.30740904808044,"z":83.1903762817383},"rot":{"x":0.0208085179328918,"y":269.999450683594,"z":0.0167709048837423}},"3c5099":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29308223724365,"z":60.2607688903809},"rot":{"x":0.0208113305270672,"y":269.990539550781,"z":0.0167678687721491}},"3d6f47":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29779493808746,"z":76.360710144043},"rot":{"x":0.020808482542634,"y":270.000061035156,"z":0.0167711284011602}},"3f0c57":{"lock":false,"pos":{"x":40.9634284973145,"y":1.2916773557663,"z":51.0598754882813},"rot":{"x":0.0208078045397997,"y":270.000061035156,"z":0.0167713537812233}},"4ee663":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29840540885925,"z":74.0486907958984},"rot":{"x":0.0208086166530848,"y":270.000061035156,"z":0.0167710799723864}},"52f66c":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638564586639,"z":67.148681640625},"rot":{"x":0.0208085346966982,"y":270.000030517578,"z":0.0167713109403849}},"53d103":{"lock":false,"pos":{"x":40.9602546691895,"y":1.29503774642944,"z":62.5439567565918},"rot":{"x":0.020809430629015,"y":269.996398925781,"z":0.0167698804289103}},"560b32":{"lock":false,"pos":{"x":40.960205078125,"y":1.30311810970306,"z":90.1487045288086},"rot":{"x":0.0208083912730217,"y":270.000030517578,"z":0.0167710855603218}},"5e0769":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705882072449,"z":69.4486846923828},"rot":{"x":0.0208086781203747,"y":270.000061035156,"z":0.0167711824178696}},"65a64f":{"lock":false,"pos":{"x":53.2126159667969,"y":1.29544842243195,"z":48.7452774047852},"rot":{"x":0.0208083596080542,"y":270,"z":0.016771299764514}},"6743e2":{"lock":false,"pos":{"x":40.9634399414063,"y":1.29369390010834,"z":57.9487953186035},"rot":{"x":0.02080855704844,"y":270.000366210938,"z":0.0167711358517408}},"6d5337":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29881930351257,"z":60.2411842346191},"rot":{"x":0.0208085160702467,"y":270.000335693359,"z":0.0167713407427073}},"70406e":{"lock":false,"pos":{"x":53.2285766601563,"y":1.3075715303421,"z":90.141471862793},"rot":{"x":0.0208084937185049,"y":270.000366210938,"z":0.0167712923139334}},"73172c":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29914140701294,"z":80.9607162475586},"rot":{"x":0.0208085142076015,"y":269.999938964844,"z":0.0167712029069662}},"7833aa":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30622506141663,"z":85.5414810180664},"rot":{"x":0.0208083316683769,"y":270.000518798828,"z":0.0167712830007076}},"7973c0":{"lock":false,"pos":{"x":40.9602088928223,"y":1.29773211479187,"z":71.7486877441406},"rot":{"x":0.0208083782345057,"y":270.00048828125,"z":0.0167712792754173}},"7b6e14":{"lock":false,"pos":{"x":53.228630065918,"y":1.29680025577545,"z":53.3435668945313},"rot":{"x":0.0209661275148392,"y":269.458129882813,"z":0.0165736433118582}},"7d0ada":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29375553131104,"z":62.5607681274414},"rot":{"x":0.0208085514605045,"y":270.000091552734,"z":0.0167713183909655}},"7dfe08":{"lock":false,"pos":{"x":40.960205078125,"y":1.30244481563568,"z":87.8487014770508},"rot":{"x":0.0208085458725691,"y":270.000030517578,"z":0.016771174967289}},"8595fb":{"lock":false,"pos":{"x":37.4159736633301,"y":1.30183446407318,"z":90.1607284545898},"rot":{"x":0.020811365917325,"y":269.990325927734,"z":0.0167677998542786}},"889177":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30048787593842,"z":85.5607223510742},"rot":{"x":0.0208082757890224,"y":270.001068115234,"z":0.0167715046554804}},"922850":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302072525024,"z":55.6492195129395},"rot":{"x":0.0208175759762526,"y":269.969573974609,"z":0.0167601760476828}},"92890f":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29644846916199,"z":71.7607116699219},"rot":{"x":0.0208082608878613,"y":270.000457763672,"z":0.0167713221162558}},"94abd7":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30555176734924,"z":83.2414474487305},"rot":{"x":0.0208084564656019,"y":270.000274658203,"z":0.0167712215334177}},"9902a8":{"lock":false,"pos":{"x":37.4159812927246,"y":1.3011611700058,"z":87.860725402832},"rot":{"x":0.0208083335310221,"y":270.000457763672,"z":0.0167713835835457}},"9bfe76":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29510200023651,"z":67.1606903076172},"rot":{"x":0.020808007568121,"y":270.000061035156,"z":0.0167708769440651}},"a5c1cd":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30379140377045,"z":92.4488830566406},"rot":{"x":0.0208085775375366,"y":270.000122070313,"z":0.0167712010443211}},"a614de":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369390010834,"z":57.9485626220703},"rot":{"x":0.0208112467080355,"y":269.990417480469,"z":0.0167677085846663}},"adde8d":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30353200435638,"z":76.3412246704102},"rot":{"x":0.0208085048943758,"y":269.999389648438,"z":0.0167708713561296}},"af84e6":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30042505264282,"z":80.9486923217773},"rot":{"x":0.0208097454160452,"y":269.995544433594,"z":0.0167695973068476}},"b3debc":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29846823215485,"z":78.6607131958008},"rot":{"x":0.0208084732294083,"y":269.999938964844,"z":0.0167711656540632}},"b57f33":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30489706993103,"z":85.5527801513672},"rot":{"x":0.020809119567275,"y":270.000122070313,"z":0.0167717430740595}},"b73951":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.0208085812628269,"y":270,"z":0.0167713072150946}},"ba1c85":{"lock":false,"pos":{"x":58.3838539123535,"y":1.30808234214783,"z":85.4903793334961},"rot":{"x":0.0208167172968388,"y":269.971832275391,"z":0.0167609248310328}},"bc0fb2":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30422377586365,"z":83.2527770996094},"rot":{"x":0.0208092462271452,"y":270.000183105469,"z":0.0167717542499304}},"bc5a8d":{"lock":false,"pos":{"x":40.9601936340332,"y":1.2957124710083,"z":64.848876953125},"rot":{"x":0.0208088587969542,"y":270.000335693359,"z":0.0167714487761259}},"bf4815":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30218553543091,"z":71.7412185668945},"rot":{"x":0.0208087172359228,"y":270.000091552734,"z":0.0167712084949017}},"c03b59":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30355060100555,"z":80.9527740478516},"rot":{"x":0.0208095423877239,"y":270.000122070313,"z":0.0167718306183815}},"ca1b5c":{"lock":false,"pos":{"x":49.562873840332,"y":1.30557072162628,"z":87.8544158935547},"rot":{"x":0.0208121743053198,"y":269.986419677734,"z":0.0167660675942898}},"cc7761":{"lock":false,"pos":{"x":53.2305908203125,"y":1.29814672470093,"z":57.9409637451172},"rot":{"x":0.0208084788173437,"y":270.000274658203,"z":0.016771262511611}},"d1c417":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30042517185211,"z":80.9488067626953},"rot":{"x":0.0208072233945131,"y":269.999969482422,"z":0.0167714934796095}},"d287bc":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30177164077759,"z":85.5487060546875},"rot":{"x":0.020811203867197,"y":269.990661621094,"z":0.0167676508426666}},"d5bad4":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29100203514099,"z":48.7527389526367},"rot":{"x":0.0208084527403116,"y":270,"z":0.0167712904512882}},"d6c44a":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29907858371735,"z":76.3486862182617},"rot":{"x":0.0208112560212612,"y":269.990600585938,"z":0.0167678128927946}},"d83a35":{"lock":false,"pos":{"x":53.2285804748535,"y":1.30487847328186,"z":80.9414367675781},"rot":{"x":0.0208083875477314,"y":270.000335693359,"z":0.0167714040726423}},"d950d8":{"lock":false,"pos":{"x":37.4159660339355,"y":1.29510200023651,"z":67.1606750488281},"rot":{"x":0.0208083223551512,"y":270.000457763672,"z":0.0167713165283203}},"dbb0e0":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436600208282,"z":60.2487869262695},"rot":{"x":0.0208114795386791,"y":269.990356445313,"z":0.0167675986886024}},"dff559":{"lock":false,"pos":{"x":53.230598449707,"y":1.29814660549164,"z":57.9409141540527},"rot":{"x":0.0208087917417288,"y":270.000122070313,"z":0.0167707074433565}},"e13107":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29712176322937,"z":74.0607147216797},"rot":{"x":0.0208085887134075,"y":270.000457763672,"z":0.016771400347352}},"e4f8ba":{"lock":false,"pos":{"x":49.5785140991211,"y":1.30691921710968,"z":92.4415512084961},"rot":{"x":0.0208085868507624,"y":270,"z":0.0167712066322565}},"e5d521":{"lock":false,"pos":{"x":37.4159660339355,"y":1.29442870616913,"z":64.8606719970703},"rot":{"x":0.020808445289731,"y":270,"z":0.016771188005805}},"e69708":{"lock":false,"pos":{"x":40.960205078125,"y":1.30379128456116,"z":92.4486923217773},"rot":{"x":0.0208113808184862,"y":269.990142822266,"z":0.0167675688862801}},"e7f376":{"lock":false,"pos":{"x":58.3838577270508,"y":1.3094288110733,"z":90.0903930664063},"rot":{"x":0.0208188705146313,"y":269.96484375,"z":0.0167585127055645}},"e957df":{"lock":false,"pos":{"x":53.2285690307617,"y":1.3082447052002,"z":92.4413375854492},"rot":{"x":0.0208085794001818,"y":270.000030517578,"z":0.0167713258415461}},"eac7ac":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30177164077759,"z":85.5487518310547},"rot":{"x":0.0208083540201187,"y":269.999938964844,"z":0.0167701616883278}},"f475ca":{"lock":false,"pos":{"x":37.4159736633301,"y":1.2957751750946,"z":69.4607086181641},"rot":{"x":0.0208083521574736,"y":270,"z":0.0167712606489658}},"f6b017":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29949247837067,"z":62.5411834716797},"rot":{"x":0.0208083782345057,"y":270,"z":0.0167712010443211}},"f8e2fb":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30151224136353,"z":69.4412155151367},"rot":{"x":0.0208083707839251,"y":270.000183105469,"z":0.0167711246758699}},"fb48a9":{"lock":false,"pos":{"x":58.3838386535645,"y":1.31010210514069,"z":92.3903656005859},"rot":{"x":0.0208171103149652,"y":269.971313476563,"z":0.016760615631938}},"ff2776":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30420517921448,"z":78.641227722168},"rot":{"x":0.0208112876862288,"y":269.990325927734,"z":0.0167675763368607}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Dr. Milian Christopher 4ee663.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Dr. Milan Christopher 4ee663.yaml similarity index 96% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Dr. Milian Christopher 4ee663.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Dr. Milan Christopher 4ee663.yaml index 2b04ac96e..82b4ecf94 100644 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Dr. Milian Christopher 4ee663.yaml +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Dr. Milan Christopher 4ee663.yaml @@ -27,7 +27,7 @@ LuaScript: '' LuaScriptState: '' MeasureMovement: false Name: Card -Nickname: Dr. Milian Christopher +Nickname: Dr. Milan Christopher SidewaysCard: false Snap: true Sticky: true diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card The Truth Beckons ca1b5c.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card The Truth Beckons ca1b5c.yaml new file mode 100644 index 000000000..1a7c6f2e2 --- /dev/null +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card The Truth Beckons ca1b5c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232102 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ca1b5c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Truth Beckons +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 49.56 + posY: 1.31 + posZ: 87.85 + rotX: 0.02 + rotY: 269.99 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Truth from Fiction b57f33.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Truth from Fiction b57f33.yaml index dc77bd82d..eeffa0555 100644 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Truth from Fiction b57f33.yaml +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Truth from Fiction b57f33.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 49.56 - posY: 1.31 - posZ: 87.85 + posY: 1.3 + posZ: 85.55 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Unearth the Ancients bc0fb2.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Unearth the Ancients bc0fb2.yaml index 0789b7b5c..ca646d50f 100644 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Unearth the Ancients bc0fb2.yaml +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Unearth the Ancients bc0fb2.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.56 posY: 1.3 - posZ: 85.55 + posZ: 83.25 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Vantage Point c03b59.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Vantage Point c03b59.yaml index fe3790f7a..2e5d5b1f2 100644 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Vantage Point c03b59.yaml +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Vantage Point c03b59.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.56 posY: 1.3 - posZ: 83.25 + posZ: 80.95 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Working a Hunch 05660e.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Working a Hunch 05660e.yaml index 6880f5bf6..a67515953 100644 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Working a Hunch 05660e.yaml +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Card Working a Hunch 05660e.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.56 posY: 1.3 - posZ: 80.95 + posZ: 78.65 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.ttslua b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.ttslua new file mode 100644 index 000000000..b25806e6f --- /dev/null +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.ttslua @@ -0,0 +1,503 @@ +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.yaml new file mode 100644 index 000000000..430fb1cde --- /dev/null +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.yaml @@ -0,0 +1,122 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag Seeker d257cb/Card The Truth Beckons ca1b5c.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Shortcut 00ade1.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Occult Invocation 010509.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Extensive Research 013446.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card True Understanding 03bb19.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Hawk-Eye Folding Camera 05125c.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Working a Hunch 05660e.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Knowledge is Power 070246.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Practice Makes Perfect 088c27.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Forbidden Tome 0a4d22.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Burning the Midnight Oil 0d29be.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Charles Ross, Esq. 176d57.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Dream-Enhancing Serum 1c353d.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Magnifying Glass 2239d4.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Eureka! 244e5d.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Cryptographic Cipher 27258f.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card I''ve got a plan! 338973.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Barricade 38217d.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Plan of Action 3b9c2c.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Whitton Greene 3c5099.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Occult Lexicon 3d6f47.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Dr. Milan Christopher 4ee663.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Dream Diary 52f66c.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Eldritch Sophist 53d103.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Archaic Glyphs 560b32.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Dr. William T. Maleson 5e0769.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Preposterous Sketches 65a64f.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Mind over Matter 6d5337.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Astounding Revelation 70406e.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Medical Texts 73172c.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Dr. Elli Horowitz 7973c0.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Persuasion 7b6e14.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Tooth of Eztli 7d0ada.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Art Student 7dfe08.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Higher Education 8595fb.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Laboratory Assistant 889177.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Fieldwork 922850.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Research Librarian 92890f.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Connect the Dots 94abd7.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Hyperawareness 9902a8.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Feed the Mind a614de.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Deep Knowledge adde8d.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Cryptic Grimoire af84e6.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Mr. Rook b3debc.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Truth from Fiction b57f33.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Fingerprint Kit b73951.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Inquiring Mind ba1c85.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Unearth the Ancients bc0fb2.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Ghastly Revelation bf4815.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Vantage Point c03b59.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card No Stone Unturned cc7761.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Celaeno Fragments d287bc.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Grisly Totem d5bad4.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Disc of Itzamna d6c44a.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Crack the Case d83a35.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Shrewd Analysis d950d8.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Encyclopedia dbb0e0.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Old Book of Lore e13107.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Seeking Answers e4f8ba.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Strange Solution e5d521.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Arcane Enlightenment e69708.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Deduction e7f376.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Anatomical Diagrams e957df.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Scroll of Secrets f475ca.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Logical Reasoning f6b017.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Guidance f8e2fb.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Curiosity fb48a9.yaml' +- !include 'Custom_Model_Bag Seeker d257cb/Card Cryptic Writings ff2776.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516265983/F50A6212D30C442429ED22B8CC8FD24D4CB76A2A/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d257cb +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Seeker d257cb.ttslua' +LuaScriptState: '{"ml":{"00ade1":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.020808769389987,"y":269.999237060547,"z":0.0167711433023214}},"010509":{"lock":false,"pos":{"x":53.2284660339355,"y":1.29747271537781,"z":55.641185760498},"rot":{"x":0.0208113547414541,"y":269.990295410156,"z":0.0167675297707319}},"013446":{"lock":false,"pos":{"x":53.2285575866699,"y":1.302858710289,"z":74.0412216186523},"rot":{"x":0.0208112969994545,"y":269.99072265625,"z":0.0167677029967308}},"03bb19":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208170618861914,"y":269.971069335938,"z":0.0167606230825186}},"05125c":{"lock":false,"pos":{"x":37.4159965515137,"y":1.30250763893127,"z":92.4607315063477},"rot":{"x":0.0208084583282471,"y":269.999938964844,"z":0.0167710669338703}},"05660e":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30287730693817,"z":78.6527709960938},"rot":{"x":0.0208094343543053,"y":269.999877929688,"z":0.0167714580893517}},"070246":{"lock":false,"pos":{"x":53.2204895019531,"y":1.30017018318176,"z":64.8664398193359},"rot":{"x":0.020963404327631,"y":269.467224121094,"z":0.0165769569575787}},"088c27":{"lock":false,"pos":{"x":53.2046852111816,"y":1.29612815380096,"z":51.0772857666016},"rot":{"x":0.0209583602845669,"y":269.485229492188,"z":0.0165834855288267}},"0a4d22":{"lock":false,"pos":{"x":40.9634208679199,"y":1.2916773557663,"z":51.0597610473633},"rot":{"x":0.0208113174885511,"y":269.990875244141,"z":0.0167680215090513}},"0abaf8":{"lock":false,"pos":{"x":40.9603080749512,"y":1.29638135433197,"z":67.1338729858398},"rot":{"x":0.0208081174641848,"y":270.001770019531,"z":0.0167716667056084}},"0d29be":{"lock":false,"pos":{"x":53.228588104248,"y":1.30622494220734,"z":85.5412445068359},"rot":{"x":0.0209493730217218,"y":269.515899658203,"z":0.016594747081399}},"1753a8":{"lock":false,"pos":{"x":53.2277336120605,"y":1.30420529842377,"z":78.6426696777344},"rot":{"x":0.0208094753324986,"y":269.952514648438,"z":0.0167681593447924}},"176d57":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30109834671021,"z":83.2488479614258},"rot":{"x":0.0208084415644407,"y":270.000030517578,"z":0.0167710427194834}},"178794":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30353188514709,"z":76.3414459228516},"rot":{"x":0.0208091642707586,"y":269.999633789063,"z":0.0167708769440651}},"1c353d":{"lock":false,"pos":{"x":40.9601745605469,"y":1.29571235179901,"z":64.8486557006836},"rot":{"x":0.0208086092025042,"y":270,"z":0.0167712010443211}},"2239d4":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29981470108032,"z":83.2607192993164},"rot":{"x":0.0208086315542459,"y":270.000183105469,"z":0.016771387308836}},"244e5d":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30875563621521,"z":87.7903671264648},"rot":{"x":0.0208188407123089,"y":269.964630126953,"z":0.0167584121227264}},"27258f":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208089575171471,"y":269.999328613281,"z":0.0167708266526461}},"338973":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30083966255188,"z":67.1435165405273},"rot":{"x":0.0209632162004709,"y":269.468658447266,"z":0.0165775809437037}},"38217d":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30689823627472,"z":87.8414535522461},"rot":{"x":0.020808469504118,"y":270.000457763672,"z":0.0167712792754173}},"3b9c2c":{"lock":false,"pos":{"x":58.3838500976563,"y":1.30740904808044,"z":83.1903762817383},"rot":{"x":0.0208085179328918,"y":269.999450683594,"z":0.0167709048837423}},"3c5099":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29308223724365,"z":60.2607688903809},"rot":{"x":0.0208113305270672,"y":269.990539550781,"z":0.0167678687721491}},"3d6f47":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29779493808746,"z":76.360710144043},"rot":{"x":0.020808482542634,"y":270.000061035156,"z":0.0167711284011602}},"3f0c57":{"lock":false,"pos":{"x":40.9634284973145,"y":1.2916773557663,"z":51.0598754882813},"rot":{"x":0.0208078045397997,"y":270.000061035156,"z":0.0167713537812233}},"4ee663":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29840540885925,"z":74.0486907958984},"rot":{"x":0.0208086166530848,"y":270.000061035156,"z":0.0167710799723864}},"52f66c":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638564586639,"z":67.148681640625},"rot":{"x":0.0208085346966982,"y":270.000030517578,"z":0.0167713109403849}},"53d103":{"lock":false,"pos":{"x":40.9602546691895,"y":1.29503774642944,"z":62.5439567565918},"rot":{"x":0.020809430629015,"y":269.996398925781,"z":0.0167698804289103}},"560b32":{"lock":false,"pos":{"x":40.960205078125,"y":1.30311810970306,"z":90.1487045288086},"rot":{"x":0.0208083912730217,"y":270.000030517578,"z":0.0167710855603218}},"5e0769":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705882072449,"z":69.4486846923828},"rot":{"x":0.0208086781203747,"y":270.000061035156,"z":0.0167711824178696}},"65a64f":{"lock":false,"pos":{"x":53.2126159667969,"y":1.29544842243195,"z":48.7452774047852},"rot":{"x":0.0208083596080542,"y":270,"z":0.016771299764514}},"6743e2":{"lock":false,"pos":{"x":40.9634399414063,"y":1.29369390010834,"z":57.9487953186035},"rot":{"x":0.02080855704844,"y":270.000366210938,"z":0.0167711358517408}},"6d5337":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29881930351257,"z":60.2411842346191},"rot":{"x":0.0208085160702467,"y":270.000335693359,"z":0.0167713407427073}},"70406e":{"lock":false,"pos":{"x":53.2285766601563,"y":1.3075715303421,"z":90.141471862793},"rot":{"x":0.0208084937185049,"y":270.000366210938,"z":0.0167712923139334}},"73172c":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29914140701294,"z":80.9607162475586},"rot":{"x":0.0208085142076015,"y":269.999938964844,"z":0.0167712029069662}},"7833aa":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30622506141663,"z":85.5414810180664},"rot":{"x":0.0208083316683769,"y":270.000518798828,"z":0.0167712830007076}},"7973c0":{"lock":false,"pos":{"x":40.9602088928223,"y":1.29773211479187,"z":71.7486877441406},"rot":{"x":0.0208083782345057,"y":270.00048828125,"z":0.0167712792754173}},"7b6e14":{"lock":false,"pos":{"x":53.228630065918,"y":1.29680025577545,"z":53.3435668945313},"rot":{"x":0.0209661275148392,"y":269.458129882813,"z":0.0165736433118582}},"7d0ada":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29375553131104,"z":62.5607681274414},"rot":{"x":0.0208085514605045,"y":270.000091552734,"z":0.0167713183909655}},"7dfe08":{"lock":false,"pos":{"x":40.960205078125,"y":1.30244481563568,"z":87.8487014770508},"rot":{"x":0.0208085458725691,"y":270.000030517578,"z":0.016771174967289}},"8595fb":{"lock":false,"pos":{"x":37.4159736633301,"y":1.30183446407318,"z":90.1607284545898},"rot":{"x":0.020811365917325,"y":269.990325927734,"z":0.0167677998542786}},"889177":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30048787593842,"z":85.5607223510742},"rot":{"x":0.0208082757890224,"y":270.001068115234,"z":0.0167715046554804}},"922850":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302072525024,"z":55.6492195129395},"rot":{"x":0.0208175759762526,"y":269.969573974609,"z":0.0167601760476828}},"92890f":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29644846916199,"z":71.7607116699219},"rot":{"x":0.0208082608878613,"y":270.000457763672,"z":0.0167713221162558}},"94abd7":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30555176734924,"z":83.2414474487305},"rot":{"x":0.0208084564656019,"y":270.000274658203,"z":0.0167712215334177}},"9902a8":{"lock":false,"pos":{"x":37.4159812927246,"y":1.3011611700058,"z":87.860725402832},"rot":{"x":0.0208083335310221,"y":270.000457763672,"z":0.0167713835835457}},"9bfe76":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29510200023651,"z":67.1606903076172},"rot":{"x":0.020808007568121,"y":270.000061035156,"z":0.0167708769440651}},"a5c1cd":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30379140377045,"z":92.4488830566406},"rot":{"x":0.0208085775375366,"y":270.000122070313,"z":0.0167712010443211}},"a614de":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369390010834,"z":57.9485626220703},"rot":{"x":0.0208112467080355,"y":269.990417480469,"z":0.0167677085846663}},"adde8d":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30353200435638,"z":76.3412246704102},"rot":{"x":0.0208085048943758,"y":269.999389648438,"z":0.0167708713561296}},"af84e6":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30042505264282,"z":80.9486923217773},"rot":{"x":0.0208097454160452,"y":269.995544433594,"z":0.0167695973068476}},"b3debc":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29846823215485,"z":78.6607131958008},"rot":{"x":0.0208084732294083,"y":269.999938964844,"z":0.0167711656540632}},"b57f33":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30489706993103,"z":85.5527801513672},"rot":{"x":0.020809119567275,"y":270.000122070313,"z":0.0167717430740595}},"b73951":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.0208085812628269,"y":270,"z":0.0167713072150946}},"ba1c85":{"lock":false,"pos":{"x":58.3838539123535,"y":1.30808234214783,"z":85.4903793334961},"rot":{"x":0.0208167172968388,"y":269.971832275391,"z":0.0167609248310328}},"bc0fb2":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30422377586365,"z":83.2527770996094},"rot":{"x":0.0208092462271452,"y":270.000183105469,"z":0.0167717542499304}},"bc5a8d":{"lock":false,"pos":{"x":40.9601936340332,"y":1.2957124710083,"z":64.848876953125},"rot":{"x":0.0208088587969542,"y":270.000335693359,"z":0.0167714487761259}},"bf4815":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30218553543091,"z":71.7412185668945},"rot":{"x":0.0208087172359228,"y":270.000091552734,"z":0.0167712084949017}},"c03b59":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30355060100555,"z":80.9527740478516},"rot":{"x":0.0208095423877239,"y":270.000122070313,"z":0.0167718306183815}},"ca1b5c":{"lock":false,"pos":{"x":49.562873840332,"y":1.30557072162628,"z":87.8544158935547},"rot":{"x":0.0208121743053198,"y":269.986419677734,"z":0.0167660675942898}},"cc7761":{"lock":false,"pos":{"x":53.2305908203125,"y":1.29814672470093,"z":57.9409637451172},"rot":{"x":0.0208084788173437,"y":270.000274658203,"z":0.016771262511611}},"d1c417":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30042517185211,"z":80.9488067626953},"rot":{"x":0.0208072233945131,"y":269.999969482422,"z":0.0167714934796095}},"d287bc":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30177164077759,"z":85.5487060546875},"rot":{"x":0.020811203867197,"y":269.990661621094,"z":0.0167676508426666}},"d5bad4":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29100203514099,"z":48.7527389526367},"rot":{"x":0.0208084527403116,"y":270,"z":0.0167712904512882}},"d6c44a":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29907858371735,"z":76.3486862182617},"rot":{"x":0.0208112560212612,"y":269.990600585938,"z":0.0167678128927946}},"d83a35":{"lock":false,"pos":{"x":53.2285804748535,"y":1.30487847328186,"z":80.9414367675781},"rot":{"x":0.0208083875477314,"y":270.000335693359,"z":0.0167714040726423}},"d950d8":{"lock":false,"pos":{"x":37.4159660339355,"y":1.29510200023651,"z":67.1606750488281},"rot":{"x":0.0208083223551512,"y":270.000457763672,"z":0.0167713165283203}},"dbb0e0":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436600208282,"z":60.2487869262695},"rot":{"x":0.0208114795386791,"y":269.990356445313,"z":0.0167675986886024}},"dff559":{"lock":false,"pos":{"x":53.230598449707,"y":1.29814660549164,"z":57.9409141540527},"rot":{"x":0.0208087917417288,"y":270.000122070313,"z":0.0167707074433565}},"e13107":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29712176322937,"z":74.0607147216797},"rot":{"x":0.0208085887134075,"y":270.000457763672,"z":0.016771400347352}},"e4f8ba":{"lock":false,"pos":{"x":49.5785140991211,"y":1.30691921710968,"z":92.4415512084961},"rot":{"x":0.0208085868507624,"y":270,"z":0.0167712066322565}},"e5d521":{"lock":false,"pos":{"x":37.4159660339355,"y":1.29442870616913,"z":64.8606719970703},"rot":{"x":0.020808445289731,"y":270,"z":0.016771188005805}},"e69708":{"lock":false,"pos":{"x":40.960205078125,"y":1.30379128456116,"z":92.4486923217773},"rot":{"x":0.0208113808184862,"y":269.990142822266,"z":0.0167675688862801}},"e7f376":{"lock":false,"pos":{"x":58.3838577270508,"y":1.3094288110733,"z":90.0903930664063},"rot":{"x":0.0208188705146313,"y":269.96484375,"z":0.0167585127055645}},"e957df":{"lock":false,"pos":{"x":53.2285690307617,"y":1.3082447052002,"z":92.4413375854492},"rot":{"x":0.0208085794001818,"y":270.000030517578,"z":0.0167713258415461}},"eac7ac":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30177164077759,"z":85.5487518310547},"rot":{"x":0.0208083540201187,"y":269.999938964844,"z":0.0167701616883278}},"f475ca":{"lock":false,"pos":{"x":37.4159736633301,"y":1.2957751750946,"z":69.4607086181641},"rot":{"x":0.0208083521574736,"y":270,"z":0.0167712606489658}},"f6b017":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29949247837067,"z":62.5411834716797},"rot":{"x":0.0208083782345057,"y":270,"z":0.0167712010443211}},"f8e2fb":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30151224136353,"z":69.4412155151367},"rot":{"x":0.0208083707839251,"y":270.000183105469,"z":0.0167711246758699}},"fb48a9":{"lock":false,"pos":{"x":58.3838386535645,"y":1.31010210514069,"z":92.3903656005859},"rot":{"x":0.0208171103149652,"y":269.971313476563,"z":0.016760615631938}},"ff2776":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30420517921448,"z":78.641227722168},"rot":{"x":0.0208112876862288,"y":269.990325927734,"z":0.0167675763368607}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Seeker +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.58 + posY: 1.67 + posZ: 70.51 + rotX: 0.02 + rotY: 270.02 + rotZ: 0.02 + scaleX: 1.2 + scaleY: 1.2 + scaleZ: 1.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Anatomical Diagrams e957df.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Anatomical Diagrams e957df.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Anatomical Diagrams e957df.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Anatomical Diagrams e957df.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Arcane Enlightenment e69708.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Arcane Enlightenment e69708.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Arcane Enlightenment e69708.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Arcane Enlightenment e69708.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Archaic Glyphs 560b32.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Archaic Glyphs 560b32.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Archaic Glyphs 560b32.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Archaic Glyphs 560b32.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Art Student 7dfe08.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Art Student 7dfe08.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Art Student 7dfe08.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Art Student 7dfe08.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Astounding Revelation 70406e.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Astounding Revelation 70406e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Astounding Revelation 70406e.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Astounding Revelation 70406e.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Barricade 38217d.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Barricade 38217d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Barricade 38217d.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Barricade 38217d.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Burning the Midnight Oil 0d29be.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Burning the Midnight Oil 0d29be.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Burning the Midnight Oil 0d29be.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Burning the Midnight Oil 0d29be.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Celaeno Fragments d287bc.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Celaeno Fragments d287bc.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Celaeno Fragments d287bc.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Celaeno Fragments d287bc.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Charles Ross, Esq. 176d57.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Charles Ross, Esq. 176d57.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Charles Ross, Esq. 176d57.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Charles Ross, Esq. 176d57.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Connect the Dots 94abd7.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Connect the Dots 94abd7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Connect the Dots 94abd7.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Connect the Dots 94abd7.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Crack the Case d83a35.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Crack the Case d83a35.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Crack the Case d83a35.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Crack the Case d83a35.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Cryptic Grimoire af84e6.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Cryptic Grimoire af84e6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Cryptic Grimoire af84e6.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Cryptic Grimoire af84e6.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Cryptic Writings ff2776.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Cryptic Writings ff2776.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Cryptic Writings ff2776.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Cryptic Writings ff2776.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Cryptographic Cipher 27258f.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Cryptographic Cipher 27258f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Cryptographic Cipher 27258f.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Cryptographic Cipher 27258f.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Curiosity fb48a9.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Curiosity fb48a9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Curiosity fb48a9.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Curiosity fb48a9.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Deduction e7f376.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Deduction e7f376.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Deduction e7f376.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Deduction e7f376.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Deep Knowledge adde8d.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Deep Knowledge adde8d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Deep Knowledge adde8d.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Deep Knowledge adde8d.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Disc of Itzamna d6c44a.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Disc of Itzamna d6c44a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Disc of Itzamna d6c44a.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Disc of Itzamna d6c44a.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Dr. Elli Horowitz 7973c0.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Dr. Elli Horowitz 7973c0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Dr. Elli Horowitz 7973c0.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Dr. Elli Horowitz 7973c0.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Dr. Milian Christopher 4ee663.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Dr. Milan Christopher 4ee663.yaml similarity index 96% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Dr. Milian Christopher 4ee663.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Dr. Milan Christopher 4ee663.yaml index 6c3f7ece7..bb3de1f4c 100644 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Dr. Milian Christopher 4ee663.yaml +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Dr. Milan Christopher 4ee663.yaml @@ -27,7 +27,7 @@ LuaScript: '' LuaScriptState: '' MeasureMovement: false Name: Card -Nickname: Dr. Milian Christopher +Nickname: Dr. Milan Christopher SidewaysCard: false Snap: true Sticky: true diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Dr. William T. Maleson 5e0769.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Dr. William T. Maleson 5e0769.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Dr. William T. Maleson 5e0769.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Dr. William T. Maleson 5e0769.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Dream Diary 52f66c.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Dream Diary 52f66c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Dream Diary 52f66c.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Dream Diary 52f66c.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Dream-Enhancing Serum 1c353d.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Dream-Enhancing Serum 1c353d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Dream-Enhancing Serum 1c353d.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Dream-Enhancing Serum 1c353d.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Eldritch Sophist 53d103.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Eldritch Sophist 53d103.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Eldritch Sophist 53d103.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Eldritch Sophist 53d103.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Encyclopedia dbb0e0.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Encyclopedia dbb0e0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Encyclopedia dbb0e0.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Encyclopedia dbb0e0.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Eureka! 244e5d.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Eureka! 244e5d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Eureka! 244e5d.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Eureka! 244e5d.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Extensive Research 013446.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Extensive Research 013446.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Extensive Research 013446.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Extensive Research 013446.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Feed the Mind a614de.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Feed the Mind a614de.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Feed the Mind a614de.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Feed the Mind a614de.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Fieldwork 922850.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Fieldwork 922850.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Fieldwork 922850.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Fieldwork 922850.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Fingerprint Kit b73951.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Fingerprint Kit b73951.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Fingerprint Kit b73951.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Fingerprint Kit b73951.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Forbidden Tome 0a4d22.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Forbidden Tome 0a4d22.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Forbidden Tome 0a4d22.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Forbidden Tome 0a4d22.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Ghastly Revelation bf4815.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Ghastly Revelation bf4815.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Ghastly Revelation bf4815.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Ghastly Revelation bf4815.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Grisly Totem d5bad4.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Grisly Totem d5bad4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Grisly Totem d5bad4.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Grisly Totem d5bad4.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Guidance f8e2fb.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Guidance f8e2fb.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Guidance f8e2fb.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Guidance f8e2fb.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Hawk-Eye Folding Camera 05125c.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Hawk-Eye Folding Camera 05125c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Hawk-Eye Folding Camera 05125c.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Hawk-Eye Folding Camera 05125c.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Higher Education 8595fb.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Higher Education 8595fb.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Higher Education 8595fb.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Higher Education 8595fb.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Hyperawareness 9902a8.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Hyperawareness 9902a8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Hyperawareness 9902a8.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Hyperawareness 9902a8.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card I've got a plan! 338973.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card I've got a plan! 338973.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card I've got a plan! 338973.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card I've got a plan! 338973.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Inquiring Mind ba1c85.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Inquiring Mind ba1c85.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Inquiring Mind ba1c85.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Inquiring Mind ba1c85.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Knowledge is Power 070246.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Knowledge is Power 070246.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Knowledge is Power 070246.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Knowledge is Power 070246.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Laboratory Assistant 889177.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Laboratory Assistant 889177.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Laboratory Assistant 889177.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Laboratory Assistant 889177.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Logical Reasoning f6b017.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Logical Reasoning f6b017.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Logical Reasoning f6b017.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Logical Reasoning f6b017.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Magnifying Glass 2239d4.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Magnifying Glass 2239d4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Magnifying Glass 2239d4.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Magnifying Glass 2239d4.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Medical Texts 73172c.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Medical Texts 73172c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Medical Texts 73172c.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Medical Texts 73172c.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Mind over Matter 6d5337.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Mind over Matter 6d5337.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Mind over Matter 6d5337.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Mind over Matter 6d5337.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Mr. Rook b3debc.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Mr. Rook b3debc.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Mr. Rook b3debc.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Mr. Rook b3debc.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card No Stone Unturned cc7761.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card No Stone Unturned cc7761.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card No Stone Unturned cc7761.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card No Stone Unturned cc7761.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Occult Invocation 010509.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Occult Invocation 010509.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Occult Invocation 010509.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Occult Invocation 010509.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Occult Lexicon 3d6f47.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Occult Lexicon 3d6f47.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Occult Lexicon 3d6f47.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Occult Lexicon 3d6f47.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Old Book of Lore e13107.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Old Book of Lore e13107.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Old Book of Lore e13107.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Old Book of Lore e13107.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Persuasion 7b6e14.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Persuasion 7b6e14.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Persuasion 7b6e14.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Persuasion 7b6e14.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Plan of Action 3b9c2c.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Plan of Action 3b9c2c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Plan of Action 3b9c2c.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Plan of Action 3b9c2c.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Practice Makes Perfect 088c27.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Practice Makes Perfect 088c27.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Practice Makes Perfect 088c27.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Practice Makes Perfect 088c27.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Preposterous Sketches 65a64f.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Preposterous Sketches 65a64f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Preposterous Sketches 65a64f.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Preposterous Sketches 65a64f.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Research Librarian 92890f.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Research Librarian 92890f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Research Librarian 92890f.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Research Librarian 92890f.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Scroll of Secrets f475ca.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Scroll of Secrets f475ca.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Scroll of Secrets f475ca.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Scroll of Secrets f475ca.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Seeking Answers e4f8ba.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Seeking Answers e4f8ba.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Seeking Answers e4f8ba.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Seeking Answers e4f8ba.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Shortcut 00ade1.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Shortcut 00ade1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Shortcut 00ade1.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Shortcut 00ade1.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Shrewd Analysis d950d8.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Shrewd Analysis d950d8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Shrewd Analysis d950d8.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Shrewd Analysis d950d8.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Strange Solution e5d521.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Strange Solution e5d521.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Strange Solution e5d521.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Strange Solution e5d521.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card The Truth Beckons ca1b5c.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card The Truth Beckons ca1b5c.yaml new file mode 100644 index 000000000..2889a3acc --- /dev/null +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card The Truth Beckons ca1b5c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232102 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ca1b5c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Truth Beckons +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.58 + posY: 1.41 + posZ: 70.51 + rotX: 0.02 + rotY: 269.99 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Tooth of Eztli 7d0ada.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Tooth of Eztli 7d0ada.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Tooth of Eztli 7d0ada.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Tooth of Eztli 7d0ada.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card True Understanding 03bb19.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card True Understanding 03bb19.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card True Understanding 03bb19.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card True Understanding 03bb19.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Truth from Fiction b57f33.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Truth from Fiction b57f33.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Truth from Fiction b57f33.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Truth from Fiction b57f33.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Unearth the Ancients bc0fb2.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Unearth the Ancients bc0fb2.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Unearth the Ancients bc0fb2.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Unearth the Ancients bc0fb2.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Vantage Point c03b59.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Vantage Point c03b59.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Vantage Point c03b59.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Vantage Point c03b59.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Whitton Greene 3c5099.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Whitton Greene 3c5099.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Whitton Greene 3c5099.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Whitton Greene 3c5099.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Working a Hunch 05660e.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Working a Hunch 05660e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea/Card Working a Hunch 05660e.yaml rename to unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb/Card Working a Hunch 05660e.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea.ttslua b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea.ttslua deleted file mode 100644 index f999547e7..000000000 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea.ttslua +++ /dev/null @@ -1,503 +0,0 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea.yaml b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea.yaml deleted file mode 100644 index b9e67cca4..000000000 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker e328ea.yaml +++ /dev/null @@ -1,121 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 -ContainedObjects: -- !include 'Custom_Model_Bag Seeker e328ea/Card Eldritch Sophist 53d103.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Shortcut 00ade1.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Occult Invocation 010509.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Extensive Research 013446.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card True Understanding 03bb19.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Hawk-Eye Folding Camera 05125c.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Working a Hunch 05660e.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Knowledge is Power 070246.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Practice Makes Perfect 088c27.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Forbidden Tome 0a4d22.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Burning the Midnight Oil 0d29be.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Charles Ross, Esq. 176d57.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Dream-Enhancing Serum 1c353d.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Magnifying Glass 2239d4.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Eureka! 244e5d.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Cryptographic Cipher 27258f.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card I''ve got a plan! 338973.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Barricade 38217d.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Plan of Action 3b9c2c.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Whitton Greene 3c5099.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Occult Lexicon 3d6f47.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Dr. Milian Christopher 4ee663.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Dream Diary 52f66c.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Archaic Glyphs 560b32.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Dr. William T. Maleson 5e0769.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Preposterous Sketches 65a64f.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Mind over Matter 6d5337.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Astounding Revelation 70406e.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Medical Texts 73172c.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Dr. Elli Horowitz 7973c0.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Persuasion 7b6e14.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Tooth of Eztli 7d0ada.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Art Student 7dfe08.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Higher Education 8595fb.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Laboratory Assistant 889177.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Fieldwork 922850.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Research Librarian 92890f.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Connect the Dots 94abd7.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Hyperawareness 9902a8.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Feed the Mind a614de.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Deep Knowledge adde8d.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Cryptic Grimoire af84e6.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Mr. Rook b3debc.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Truth from Fiction b57f33.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Fingerprint Kit b73951.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Inquiring Mind ba1c85.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Unearth the Ancients bc0fb2.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Ghastly Revelation bf4815.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Vantage Point c03b59.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card No Stone Unturned cc7761.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Celaeno Fragments d287bc.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Grisly Totem d5bad4.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Disc of Itzamna d6c44a.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Crack the Case d83a35.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Shrewd Analysis d950d8.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Encyclopedia dbb0e0.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Old Book of Lore e13107.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Seeking Answers e4f8ba.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Strange Solution e5d521.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Arcane Enlightenment e69708.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Deduction e7f376.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Anatomical Diagrams e957df.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Scroll of Secrets f475ca.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Logical Reasoning f6b017.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Guidance f8e2fb.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Curiosity fb48a9.yaml' -- !include 'Custom_Model_Bag Seeker e328ea/Card Cryptic Writings ff2776.yaml' -CustomMesh: - CastShadows: true - ColliderURL: '' - Convex: true - CustomShader: - FresnelStrength: 0.0 - SpecularColor: - b: 1.0 - g: 1.0 - r: 1.0 - SpecularIntensity: 0.0 - SpecularSharpness: 2.0 - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516265983/F50A6212D30C442429ED22B8CC8FD24D4CB76A2A/ - MaterialIndex: 3 - MeshURL: https://pastebin.com/raw/ALrYhQGb - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: e328ea -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: !include 'Custom_Model_Bag Seeker e328ea.ttslua' -LuaScriptState: '{"ml":{"00ade1":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30624353885651,"z":90.1527557373047},"rot":{"x":0.0208089146763086,"y":269.999237060547,"z":0.0167710985988379}},"010509":{"lock":false,"pos":{"x":53.2284660339355,"y":1.2974728345871,"z":55.641185760498},"rot":{"x":0.0208114627748728,"y":269.990295410156,"z":0.0167677570134401}},"013446":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30285882949829,"z":74.0412216186523},"rot":{"x":0.0208111777901649,"y":269.99072265625,"z":0.0167678743600845}},"03bb19":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30673587322235,"z":80.8903579711914},"rot":{"x":0.0208170730620623,"y":269.971069335938,"z":0.0167604517191648}},"05125c":{"lock":false,"pos":{"x":37.4159965515137,"y":1.30250763893127,"z":92.4607315063477},"rot":{"x":0.0208078976720572,"y":269.999938964844,"z":0.0167709328234196}},"05660e":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30355060100555,"z":80.9527740478516},"rot":{"x":0.0208085905760527,"y":269.999938964844,"z":0.0167712699621916}},"070246":{"lock":false,"pos":{"x":53.2204895019531,"y":1.30017030239105,"z":64.8664398193359},"rot":{"x":0.0209635645151138,"y":269.467224121094,"z":0.0165769252926111}},"088c27":{"lock":false,"pos":{"x":53.2046852111816,"y":1.29612827301025,"z":51.0772857666016},"rot":{"x":0.0209585633128881,"y":269.485229492188,"z":0.0165835153311491}},"0a4d22":{"lock":false,"pos":{"x":40.9634208679199,"y":1.2916773557663,"z":51.0597610473633},"rot":{"x":0.0208115633577108,"y":269.990875244141,"z":0.0167674757540226}},"0abaf8":{"lock":false,"pos":{"x":40.9603080749512,"y":1.29638135433197,"z":67.1338729858398},"rot":{"x":0.0208081174641848,"y":270.001770019531,"z":0.0167716667056084}},"0d29be":{"lock":false,"pos":{"x":53.228588104248,"y":1.30622506141663,"z":85.5412445068359},"rot":{"x":0.020949499681592,"y":269.515899658203,"z":0.0165947545319796}},"1753a8":{"lock":false,"pos":{"x":53.2277336120605,"y":1.30420529842377,"z":78.6426696777344},"rot":{"x":0.0208094753324986,"y":269.952514648438,"z":0.0167681593447924}},"176d57":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30109846591949,"z":83.2488479614258},"rot":{"x":0.020808594301343,"y":270.000030517578,"z":0.0167710836976767}},"178794":{"lock":false,"pos":{"x":53.2285575866699,"y":1.30353188514709,"z":76.3414459228516},"rot":{"x":0.0208091642707586,"y":269.999633789063,"z":0.0167708769440651}},"1c353d":{"lock":false,"pos":{"x":40.9601745605469,"y":1.29571235179901,"z":64.8486557006836},"rot":{"x":0.0208086147904396,"y":270,"z":0.0167713183909655}},"2239d4":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29981470108032,"z":83.2607192993164},"rot":{"x":0.0208092052489519,"y":270.000183105469,"z":0.0167716555297375}},"244e5d":{"lock":false,"pos":{"x":58.3838310241699,"y":1.30875563621521,"z":87.7903671264648},"rot":{"x":0.0208189226686955,"y":269.964630126953,"z":0.0167582873255014}},"27258f":{"lock":false,"pos":{"x":40.9601936340332,"y":1.29975187778473,"z":78.648681640625},"rot":{"x":0.0208087135106325,"y":269.999328613281,"z":0.0167710948735476}},"338973":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30083978176117,"z":67.1435165405273},"rot":{"x":0.0209631063044071,"y":269.468658447266,"z":0.0165774803608656}},"38217d":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30689835548401,"z":87.8414535522461},"rot":{"x":0.0208083894103765,"y":270.000457763672,"z":0.0167712587863207}},"3b9c2c":{"lock":false,"pos":{"x":58.3838500976563,"y":1.30740916728973,"z":83.1903762817383},"rot":{"x":0.0208088159561157,"y":269.999450683594,"z":0.0167710911482573}},"3c5099":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29308223724365,"z":60.2607688903809},"rot":{"x":0.0208115875720978,"y":269.990539550781,"z":0.0167672373354435}},"3d6f47":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29779493808746,"z":76.360710144043},"rot":{"x":0.0208092927932739,"y":270.000061035156,"z":0.0167716797441244}},"3f0c57":{"lock":false,"pos":{"x":40.9634284973145,"y":1.2916773557663,"z":51.0598754882813},"rot":{"x":0.0208078045397997,"y":270.000061035156,"z":0.0167713537812233}},"4ee663":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29840540885925,"z":74.0486907958984},"rot":{"x":0.0208085309714079,"y":270.000061035156,"z":0.0167711935937405}},"52f66c":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29638564586639,"z":67.148681640625},"rot":{"x":0.0208084583282471,"y":270.000030517578,"z":0.0167713686823845}},"53d103":{"lock":false,"pos":{"x":40.9602546691895,"y":1.29503774642944,"z":62.5439567565918},"rot":{"x":0.0208096951246262,"y":269.996398925781,"z":0.0167700108140707}},"560b32":{"lock":false,"pos":{"x":40.960205078125,"y":1.30311810970306,"z":90.1487045288086},"rot":{"x":0.0208085309714079,"y":270.000030517578,"z":0.0167714171111584}},"5e0769":{"lock":false,"pos":{"x":40.9601974487305,"y":1.29705893993378,"z":69.4486846923828},"rot":{"x":0.0208084564656019,"y":270.000061035156,"z":0.0167710464447737}},"65a64f":{"lock":false,"pos":{"x":53.2126159667969,"y":1.29544854164124,"z":48.7452774047852},"rot":{"x":0.0208086259663105,"y":270,"z":0.0167712587863207}},"6743e2":{"lock":false,"pos":{"x":40.9634399414063,"y":1.29369390010834,"z":57.9487953186035},"rot":{"x":0.02080855704844,"y":270.000366210938,"z":0.0167711358517408}},"6d5337":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29881918430328,"z":60.2411842346191},"rot":{"x":0.0208086259663105,"y":270.000335693359,"z":0.0167714841663837}},"70406e":{"lock":false,"pos":{"x":53.2285766601563,"y":1.3075715303421,"z":90.141471862793},"rot":{"x":0.0208083391189575,"y":270.000366210938,"z":0.0167713202536106}},"73172c":{"lock":false,"pos":{"x":37.4159812927246,"y":1.29914140701294,"z":80.9607162475586},"rot":{"x":0.0208094585686922,"y":269.999938964844,"z":0.0167716164141893}},"7833aa":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30622506141663,"z":85.5414810180664},"rot":{"x":0.0208083316683769,"y":270.000518798828,"z":0.0167712830007076}},"7973c0":{"lock":false,"pos":{"x":40.9602088928223,"y":1.29773211479187,"z":71.7486877441406},"rot":{"x":0.0208083614706993,"y":270.00048828125,"z":0.0167712196707726}},"7b6e14":{"lock":false,"pos":{"x":53.228630065918,"y":1.29680037498474,"z":53.3435668945313},"rot":{"x":0.0209661237895489,"y":269.458129882813,"z":0.0165737457573414}},"7d0ada":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29375553131104,"z":62.5607681274414},"rot":{"x":0.0208084918558598,"y":270.000091552734,"z":0.0167706683278084}},"7dfe08":{"lock":false,"pos":{"x":40.960205078125,"y":1.30244493484497,"z":87.8487014770508},"rot":{"x":0.0208085477352142,"y":270.000030517578,"z":0.0167712103575468}},"8595fb":{"lock":false,"pos":{"x":37.4159736633301,"y":1.30183446407318,"z":90.1607284545898},"rot":{"x":0.0208120103925467,"y":269.990325927734,"z":0.0167681258171797}},"889177":{"lock":false,"pos":{"x":37.4159812927246,"y":1.30048787593842,"z":85.5607223510742},"rot":{"x":0.0208090450614691,"y":270.001068115234,"z":0.0167719591408968}},"922850":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29302072525024,"z":55.6492195129395},"rot":{"x":0.0208177138119936,"y":269.969573974609,"z":0.0167596247047186}},"92890f":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29644846916199,"z":71.7607116699219},"rot":{"x":0.0208092294633389,"y":270.000457763672,"z":0.0167714804410934}},"94abd7":{"lock":false,"pos":{"x":53.2285842895508,"y":1.30555188655853,"z":83.2414474487305},"rot":{"x":0.0208084508776665,"y":270.000274658203,"z":0.0167712271213531}},"9902a8":{"lock":false,"pos":{"x":37.4159812927246,"y":1.3011611700058,"z":87.860725402832},"rot":{"x":0.0208091977983713,"y":270.000457763672,"z":0.0167717430740595}},"9bfe76":{"lock":false,"pos":{"x":37.4159774780273,"y":1.29510200023651,"z":67.1606903076172},"rot":{"x":0.020808007568121,"y":270.000061035156,"z":0.0167708769440651}},"a5c1cd":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30379140377045,"z":92.4488830566406},"rot":{"x":0.0208085775375366,"y":270.000122070313,"z":0.0167712010443211}},"a614de":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29369378089905,"z":57.9485626220703},"rot":{"x":0.0208115540444851,"y":269.990417480469,"z":0.0167671982198954}},"adde8d":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30353200435638,"z":76.3412246704102},"rot":{"x":0.020808732137084,"y":269.999389648438,"z":0.0167711768299341}},"af84e6":{"lock":false,"pos":{"x":40.9602127075195,"y":1.30042517185211,"z":80.9486923217773},"rot":{"x":0.0208097752183676,"y":269.995544433594,"z":0.0167694855481386}},"b3debc":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29846823215485,"z":78.6607131958008},"rot":{"x":0.0208093021064997,"y":269.999938964844,"z":0.0167715214192867}},"b57f33":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30557036399841,"z":87.8527908325195},"rot":{"x":0.0208086408674717,"y":270.000183105469,"z":0.0167713351547718}},"b73951":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29234755039215,"z":53.3492164611816},"rot":{"x":0.0208087209612131,"y":270,"z":0.016770688816905}},"ba1c85":{"lock":false,"pos":{"x":58.3838539123535,"y":1.30808246135712,"z":85.4903793334961},"rot":{"x":0.0208169631659985,"y":269.971832275391,"z":0.0167610887438059}},"bc0fb2":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30489695072174,"z":85.5527801513672},"rot":{"x":0.0208084564656019,"y":270.000244140625,"z":0.0167711675167084}},"bc5a8d":{"lock":false,"pos":{"x":40.9601936340332,"y":1.2957124710083,"z":64.848876953125},"rot":{"x":0.0208088587969542,"y":270.000335693359,"z":0.0167714487761259}},"bf4815":{"lock":false,"pos":{"x":53.2285575866699,"y":1.3021856546402,"z":71.7412185668945},"rot":{"x":0.0208084601908922,"y":270.000091552734,"z":0.0167710334062576}},"c03b59":{"lock":false,"pos":{"x":49.5628433227539,"y":1.30422389507294,"z":83.2527770996094},"rot":{"x":0.0208083055913448,"y":270.000213623047,"z":0.0167712196707726}},"cc7761":{"lock":false,"pos":{"x":53.2305908203125,"y":1.29814684391022,"z":57.9409637451172},"rot":{"x":0.0208086352795362,"y":270.000274658203,"z":0.016771113499999}},"d1c417":{"lock":false,"pos":{"x":40.9602165222168,"y":1.30042517185211,"z":80.9488067626953},"rot":{"x":0.0208072233945131,"y":269.999969482422,"z":0.0167714934796095}},"d287bc":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30177164077759,"z":85.5487060546875},"rot":{"x":0.0208111815154552,"y":269.990661621094,"z":0.0167677607387304}},"d5bad4":{"lock":false,"pos":{"x":40.9634208679199,"y":1.29100203514099,"z":48.7527389526367},"rot":{"x":0.0208087358623743,"y":270,"z":0.0167706683278084}},"d6c44a":{"lock":false,"pos":{"x":40.9602012634277,"y":1.29907870292664,"z":76.3486862182617},"rot":{"x":0.0208112820982933,"y":269.990600585938,"z":0.0167677719146013}},"d83a35":{"lock":false,"pos":{"x":53.2285804748535,"y":1.30487847328186,"z":80.9414367675781},"rot":{"x":0.0208084881305695,"y":270.000335693359,"z":0.0167712420225143}},"d950d8":{"lock":false,"pos":{"x":37.4159660339355,"y":1.29510200023651,"z":67.1606750488281},"rot":{"x":0.020809156820178,"y":270.000457763672,"z":0.0167718138545752}},"dbb0e0":{"lock":false,"pos":{"x":40.9603157043457,"y":1.29436600208282,"z":60.2487869262695},"rot":{"x":0.0208114571869373,"y":269.990356445313,"z":0.0167671535164118}},"dff559":{"lock":false,"pos":{"x":53.230598449707,"y":1.29814660549164,"z":57.9409141540527},"rot":{"x":0.0208087917417288,"y":270.000122070313,"z":0.0167707074433565}},"e13107":{"lock":false,"pos":{"x":37.4159736633301,"y":1.29712176322937,"z":74.0607147216797},"rot":{"x":0.0208091102540493,"y":270.000457763672,"z":0.0167717114090919}},"e4f8ba":{"lock":false,"pos":{"x":49.5785140991211,"y":1.30691921710968,"z":92.4415512084961},"rot":{"x":0.0208086799830198,"y":270,"z":0.0167711228132248}},"e5d521":{"lock":false,"pos":{"x":37.4159660339355,"y":1.29442870616913,"z":64.8606719970703},"rot":{"x":0.0208094995468855,"y":270,"z":0.0167716350406408}},"e69708":{"lock":false,"pos":{"x":40.960205078125,"y":1.30379140377045,"z":92.4486923217773},"rot":{"x":0.020811403170228,"y":269.990142822266,"z":0.0167674291878939}},"e7f376":{"lock":false,"pos":{"x":58.3838577270508,"y":1.30942893028259,"z":90.0903930664063},"rot":{"x":0.0208188742399216,"y":269.96484375,"z":0.0167582537978888}},"e957df":{"lock":false,"pos":{"x":53.2285690307617,"y":1.3082447052002,"z":92.4413375854492},"rot":{"x":0.0208085123449564,"y":270.000030517578,"z":0.0167710185050964}},"eac7ac":{"lock":false,"pos":{"x":40.9602203369141,"y":1.30177164077759,"z":85.5487518310547},"rot":{"x":0.0208083540201187,"y":269.999938964844,"z":0.0167701616883278}},"f475ca":{"lock":false,"pos":{"x":37.4159736633301,"y":1.2957751750946,"z":69.4607086181641},"rot":{"x":0.0208094362169504,"y":270,"z":0.0167716238647699}},"f6b017":{"lock":false,"pos":{"x":53.2285537719727,"y":1.29949259757996,"z":62.5411834716797},"rot":{"x":0.0208085123449564,"y":270,"z":0.0167711041867733}},"f8e2fb":{"lock":false,"pos":{"x":53.2285537719727,"y":1.30151236057281,"z":69.4412155151367},"rot":{"x":0.0208085831254721,"y":270.000183105469,"z":0.0167711284011602}},"fb48a9":{"lock":false,"pos":{"x":58.3838386535645,"y":1.31010210514069,"z":92.3903656005859},"rot":{"x":0.0208168085664511,"y":269.971313476563,"z":0.0167605876922607}},"ff2776":{"lock":false,"pos":{"x":53.2285614013672,"y":1.30420529842377,"z":78.641227722168},"rot":{"x":0.0208113752305508,"y":269.990325927734,"z":0.0167676098644733}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Seeker -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 66.58 - posY: 1.66 - posZ: 70.51 - rotX: 0.02 - rotY: 270.03 - rotZ: 0.02 - scaleX: 1.2 - scaleY: 1.2 - scaleZ: 1.2 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb.ttslua b/unpacked/Custom_Model_Bag Seeker 5ec2fb.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb.ttslua +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb.yaml index 0859aa622..c2f3cb65f 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb.yaml @@ -4,9 +4,8 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16.yaml' -- !include 'Custom_Model_Bag Seeker 5ec2fb/Card Blasphemous Covenant (2) 86d109.yaml' -- !include 'Custom_Model_Bag Seeker 5ec2fb/Card Stirring Up Trouble (1) e99f0d.yaml' +- !include 'Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.yaml' +- !include 'Custom_Model_Bag Seeker 5ec2fb/Card Gaze of Ouraxsh (2) b7c316.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Higher Education (3) 0d3413.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Surprising Find (1) 0d3d1a.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Old Book of Lore (3) 0d88ac.yaml' @@ -39,6 +38,7 @@ ContainedObjects: - !include 'Custom_Model_Bag Seeker 5ec2fb/Deck Ancient Stone (4) 7b5a65.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Magnifying Glass (1) 8343e5.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Whitton Greene (2) 854c79.yaml' +- !include 'Custom_Model_Bag Seeker 5ec2fb/Card Blasphemous Covenant (2) 86d109.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Cryptic Writings (2) 870bdc.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Ancient Stone (1) 8b1863.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Scientific Theory (1) 8cdfc7.yaml' @@ -62,6 +62,7 @@ ContainedObjects: - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Extensive Research (1) e07aab.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Hyperawareness (2) e4ceae.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Esoteric Atlas (1) e50ca0.yaml' +- !include 'Custom_Model_Bag Seeker 5ec2fb/Card Stirring Up Trouble (1) e99f0d.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Forewarned (1) f22453.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Library Docent (1) fab3a9.yaml' - !include 'Custom_Model_Bag Seeker 5ec2fb/Card Truth from Fiction (2) fd3cda.yaml' @@ -93,7 +94,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: true LuaScript: !include 'Custom_Model_Bag Seeker 5ec2fb.ttslua' -LuaScriptState: '{"ml":{"037da2":{"lock":false,"pos":{"x":7.0765,"y":1.3194,"z":-77.26},"rot":{"x":0.0208,"y":270.0044,"z":0.0168}},"0d3413":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208135452121496,"y":269.984130859375,"z":0.0167649015784264}},"0d3d1a":{"lock":false,"pos":{"x":58.0996589660645,"y":1.31018245220184,"z":-47.4709777832031},"rot":{"x":0.0208096764981747,"y":269.99560546875,"z":0.0167697537690401}},"0d88ac":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.020813662558794,"y":269.984130859375,"z":0.0167651195079088}},"117137":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29699695110321,"z":-70.4198684692383},"rot":{"x":0.0208062455058098,"y":270.01171875,"z":0.0167758595198393}},"15a1bb":{"lock":false,"pos":{"x":52.944206237793,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208074115216732,"y":270.002258300781,"z":0.0167705472558737}},"1a1b58":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499566555023,"z":-72.7083969116211},"rot":{"x":0.0208062380552292,"y":270.01123046875,"z":0.0167753864079714}},"2172e2":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565048217773,"z":-75.0199966430664},"rot":{"x":0.0208058170974255,"y":270.01123046875,"z":0.016775343567133}},"22c4b1":{"lock":false,"pos":{"x":40.2742691040039,"y":1.3133761882782,"z":-88.8093566894531},"rot":{"x":0.0208147652447224,"y":269.984893798828,"z":0.0167664028704166}},"26d70e":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208047293126583,"y":270.015655517578,"z":0.0167774185538292}},"300569":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.0208061747252941,"y":270.005340576172,"z":0.0167729835957289}},"344e90":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208056177943945,"y":270.011260986328,"z":0.0167746227234602}},"3469e0":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30024600028992,"z":-75.0203399658203},"rot":{"x":0.020807784050703,"y":270.002197265625,"z":0.0167698990553617}},"367e5c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.31868195533752,"z":-49.7084617614746},"rot":{"x":0.0208057407289743,"y":270.011169433594,"z":0.0167744066566229}},"384258":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208135508000851,"y":269.983917236328,"z":0.0167649332433939}},"3c0d81":{"lock":false,"pos":{"x":10.6138734817505,"y":1.31733238697052,"z":-88.7451629638672},"rot":{"x":0.0208089593797922,"y":269.999938964844,"z":0.0167716406285763}},"404410":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30159246921539,"z":-70.4202117919922},"rot":{"x":0.0208075251430273,"y":270.002349853516,"z":0.016770638525486}},"423ea2":{"lock":false,"pos":{"x":52.944206237793,"y":1.29957270622253,"z":-77.3202438354492},"rot":{"x":0.020808532834053,"y":270,"z":0.016769191250205}},"488fab":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170965194702,"z":-54.3199996948242},"rot":{"x":0.0208086092025042,"y":269.999694824219,"z":0.0167709644883871}},"4a29bd":{"lock":false,"pos":{"x":36.6243362426758,"y":1.32090437412262,"z":-75.0084228515625},"rot":{"x":0.0208107065409422,"y":269.999481201172,"z":0.016771649941802}},"53eaa9":{"lock":false,"pos":{"x":7.07654333114624,"y":1.32277584075928,"z":-65.7601165771484},"rot":{"x":0.0208094976842403,"y":269.999755859375,"z":0.0167715046554804}},"552689":{"lock":false,"pos":{"x":58.099666595459,"y":1.30816280841827,"z":-54.3709716796875},"rot":{"x":0.0208169873803854,"y":269.970977783203,"z":0.0167606212198734}},"562c05":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363131523132,"z":-81.9201202392578},"rot":{"x":0.0208061765879393,"y":270.011352539063,"z":0.0167755149304867}},"5bdc77":{"lock":false,"pos":{"x":7.07654094696045,"y":1.32210242748261,"z":-68.0601196289063},"rot":{"x":0.020809318870306,"y":269.999877929688,"z":0.0167716238647699}},"5d4212":{"lock":false,"pos":{"x":40.2899627685547,"y":1.29295742511749,"z":-84.2198867797852},"rot":{"x":0.0208051223307848,"y":270.011291503906,"z":0.0167752541601658}},"5f8011":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.0208057668060064,"y":270.011474609375,"z":0.0167762991040945}},"6465d8":{"lock":false,"pos":{"x":40.2741088867188,"y":1.31270098686218,"z":-91.1157989501953},"rot":{"x":0.0208196602761745,"y":269.968811035156,"z":0.0167605970054865}},"659f2d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.020813575014472,"y":269.984313964844,"z":0.016765259206295}},"683123":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208087358623743,"y":269.99951171875,"z":0.0167709458619356}},"6e4d54":{"lock":false,"pos":{"x":52.9442253112793,"y":1.3063051700592,"z":-54.3203315734863},"rot":{"x":0.0208052564412355,"y":270.011291503906,"z":0.0167751219123602}},"6f6976":{"lock":false,"pos":{"x":52.9441184997559,"y":1.29755294322968,"z":-84.2202377319336},"rot":{"x":0.0208085421472788,"y":270.000122070313,"z":0.016769165173173}},"6fab5a":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29701554775238,"z":-65.8083038330078},"rot":{"x":0.0208097118884325,"y":269.999664306641,"z":0.0167714897543192}},"73255e":{"lock":false,"pos":{"x":36.6243476867676,"y":1.31935524940491,"z":-47.4084320068359},"rot":{"x":0.0208136457949877,"y":269.984313964844,"z":0.0167664084583521}},"7337c1":{"lock":false,"pos":{"x":36.6243324279785,"y":1.296342253685,"z":-68.1083145141602},"rot":{"x":0.0208085253834724,"y":269.999725341797,"z":0.0167711153626442}},"791d5f":{"lock":false,"pos":{"x":52.9462432861328,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.0208083353936672,"y":270.000305175781,"z":0.0167693682014942}},"7b5a65":{"lock":false,"pos":{"x":36.6243362426758,"y":1.31811010837555,"z":-68.1082992553711},"rot":{"x":0.0208076350390911,"y":269.999572753906,"z":0.0167704727500677}},"8343e5":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036318302155,"z":-58.9200057983398},"rot":{"x":0.0208086185157299,"y":269.999542236328,"z":0.0167709663510323}},"854c79":{"lock":false,"pos":{"x":40.2900886535645,"y":1.29228413105011,"z":-86.5199127197266},"rot":{"x":0.0208059661090374,"y":270.01123046875,"z":0.0167757142335176}},"86d109":{"lock":false,"pos":{"x":40.2900543212891,"y":1.2976701259613,"z":-68.1198577880859},"rot":{"x":0.0208084471523762,"y":269.998718261719,"z":0.0167706422507763}},"870bdc":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495870113373,"z":-58.9203491210938},"rot":{"x":0.0208055749535561,"y":270.011169433594,"z":0.0167747605592012}},"8b1863":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372941493988,"z":-47.4200057983398},"rot":{"x":0.0208084397017956,"y":269.999847412109,"z":0.016770888119936}},"8c4d07":{"lock":false,"pos":{"x":52.944206237793,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208080857992172,"y":270.002349853516,"z":0.0167721528559923}},"8cdfc7":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901671409607,"z":-63.5200119018555},"rot":{"x":0.020808594301343,"y":269.999420166016,"z":0.0167709793895483}},"90e0af":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208087228238583,"y":269.999603271484,"z":0.016771050170064}},"96b5ed":{"lock":false,"pos":{"x":58.099666595459,"y":1.30883598327637,"z":-52.0709648132324},"rot":{"x":0.0208051018416882,"y":270.011260986328,"z":0.0167749132961035}},"96ba38":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.6082916259766},"rot":{"x":0.0208080112934113,"y":270.005249023438,"z":0.0167735610157251}},"96ec75":{"lock":false,"pos":{"x":7.07653141021729,"y":1.32075607776642,"z":-72.6601257324219},"rot":{"x":0.020809406414628,"y":269.999755859375,"z":0.0167715381830931}},"97ed44":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208086092025042,"y":269.999694824219,"z":0.0167712606489658}},"9b1c5b":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30361223220825,"z":-63.5203552246094},"rot":{"x":0.020805174484849,"y":270.011199951172,"z":0.0167740415781736}},"a641de":{"lock":false,"pos":{"x":52.9282684326172,"y":1.2955287694931,"z":-91.1161422729492},"rot":{"x":0.0208085980266333,"y":270.000122070313,"z":0.0167691260576248}},"a781f4":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495882034302,"z":-58.9203491210938},"rot":{"x":0.0208078641444445,"y":270.002197265625,"z":0.0167722031474113}},"add7c9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208085626363754,"y":269.999786376953,"z":0.0167709924280643}},"afb8cf":{"lock":false,"pos":{"x":40.6758728027344,"y":1.32536602020264,"z":-52.0128517150879},"rot":{"x":0.0208085291087627,"y":270.000427246094,"z":0.0167702343314886}},"b4121c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29566895961761,"z":-70.4083099365234},"rot":{"x":0.0208063498139381,"y":270.01123046875,"z":0.0167755018919706}},"b63277":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768872261047,"z":-63.5084495544434},"rot":{"x":0.0208085030317307,"y":269.999694824219,"z":0.0167699977755547}},"b722cd":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208131112158298,"y":269.984252929688,"z":0.016765184700489}},"b92e9b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29566895961761,"z":-70.408317565918},"rot":{"x":0.020808594301343,"y":269.999633789063,"z":0.0167710985988379}},"b98ff6":{"lock":false,"pos":{"x":52.9442443847656,"y":1.29687976837158,"z":-86.5202560424805},"rot":{"x":0.0208053644746542,"y":270.009521484375,"z":0.0167733896523714}},"bc498d":{"lock":false,"pos":{"x":40.2900581359863,"y":1.29834342002869,"z":-65.8198547363281},"rot":{"x":0.0208087749779224,"y":269.999450683594,"z":0.0167711395770311}},"bc868c":{"lock":false,"pos":{"x":7.07651281356812,"y":1.32008278369904,"z":-74.9601593017578},"rot":{"x":0.0208091288805008,"y":269.999481201172,"z":0.0167714580893517}},"bdbca5":{"lock":false,"pos":{"x":52.9284248352051,"y":1.29620397090912,"z":-88.809700012207},"rot":{"x":0.0208044350147247,"y":270.013305664063,"z":0.0167760346084833}},"be04d4":{"lock":false,"pos":{"x":40.2900390625,"y":1.29632365703583,"z":-72.7199935913086},"rot":{"x":0.0208050403743982,"y":270.011474609375,"z":0.0167753025889397}},"c1365d":{"lock":false,"pos":{"x":52.944206237793,"y":1.30226576328278,"z":-68.1202087402344},"rot":{"x":0.0208051148802042,"y":270.01123046875,"z":0.0167738441377878}},"c4e958":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208078399300575,"y":270.002197265625,"z":0.0167719554156065}},"c8716d":{"lock":false,"pos":{"x":7.07653570175171,"y":1.3214293718338,"z":-70.3601226806641},"rot":{"x":0.0208090115338564,"y":269.999664306641,"z":0.0167711675167084}},"cffeb0":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.0208135731518269,"y":269.984008789063,"z":0.0167648307979107}},"d391c7":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208081752061844,"y":270.000061035156,"z":0.0167700406163931}},"d5605f":{"lock":false,"pos":{"x":40.6758728027344,"y":1.32603931427002,"z":-49.7128486633301},"rot":{"x":0.0208086594939232,"y":269.999816894531,"z":0.0167700685560703}},"d86b0d":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632353782654,"z":-72.7199859619141},"rot":{"x":0.0208059288561344,"y":270.011627197266,"z":0.0167759340256453}},"dadcc3":{"lock":false,"pos":{"x":52.9442138671875,"y":1.3063051700592,"z":-54.3203430175781},"rot":{"x":0.0208133850246668,"y":269.984008789063,"z":0.0167653672397137}},"ddaded":{"lock":false,"pos":{"x":19.3437099456787,"y":1.29451763629913,"z":-56.5678901672363},"rot":{"x":0.0208087582141161,"y":269.999481201172,"z":0.016770189628005}},"dde850":{"lock":false,"pos":{"x":7.07655096054077,"y":1.32816159725189,"z":-47.3604888916016},"rot":{"x":0.0208085924386978,"y":270.000396728516,"z":0.0167710743844509}},"e0721f":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30950927734375,"z":-49.7709655761719},"rot":{"x":0.0208086743950844,"y":269.999755859375,"z":0.0167709551751614}},"e07aab":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208041667938232,"y":270.014984130859,"z":0.0167763959616423}},"e4ceae":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208061467856169,"y":270.011444091797,"z":0.0167754273861647}},"e50ca0":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208086743950844,"y":269.999755859375,"z":0.0167708694934845}},"e87c2d":{"lock":false,"pos":{"x":7.07654714584351,"y":1.3274884223938,"z":-49.6604766845703},"rot":{"x":0.020808594301343,"y":270.00048828125,"z":0.0167711768299341}},"e99f0d":{"lock":false,"pos":{"x":52.9442176818848,"y":1.30563187599182,"z":-56.6203422546387},"rot":{"x":0.0208089593797922,"y":269.998962402344,"z":0.0167701579630375}},"eaafcf":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29364931583405,"z":-77.3083343505859},"rot":{"x":0.0208131372928619,"y":269.984069824219,"z":0.0167653374373913}},"ebf4c0":{"lock":false,"pos":{"x":7.07653713226318,"y":1.32344889640808,"z":-63.4604873657227},"rot":{"x":0.0208090376108885,"y":269.999877929688,"z":0.0167712233960629}},"ef2ecd":{"lock":false,"pos":{"x":10.6296834945679,"y":1.31801056861877,"z":-86.4480361938477},"rot":{"x":0.020808607339859,"y":269.999816894531,"z":0.0167710799723864}},"f22453":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30697846412659,"z":-52.0203399658203},"rot":{"x":0.0208084303885698,"y":269.999755859375,"z":0.0167709495872259}},"f75ae4":{"lock":false,"pos":{"x":7.07651996612549,"y":1.31940948963165,"z":-77.2600555419922},"rot":{"x":0.0208091493695974,"y":269.999969482422,"z":0.0167716313153505}},"f86ed0":{"lock":false,"pos":{"x":7.07654428482056,"y":1.32681512832642,"z":-51.9604797363281},"rot":{"x":0.020808408036828,"y":270.000427246094,"z":0.0167713183909655}},"f99e05":{"lock":false,"pos":{"x":44.2130165100098,"y":1.31039607524872,"z":-91.0974273681641},"rot":{"x":0.0208132099360228,"y":269.984924316406,"z":0.0167646240442991}},"fab3a9":{"lock":false,"pos":{"x":40.2900657653809,"y":1.30103635787964,"z":-56.6199951171875},"rot":{"x":0.0208053700625896,"y":270.01123046875,"z":0.0167752765119076}},"fbd97e":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30563187599182,"z":-56.6203460693359},"rot":{"x":0.0208078734576702,"y":270.002197265625,"z":0.0167717821896076}},"fc5406":{"lock":false,"pos":{"x":10.6137104034424,"y":1.3166606426239,"z":-91.0400085449219},"rot":{"x":0.0208087395876646,"y":269.999816894531,"z":0.0167708862572908}},"fc790a":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30883586406708,"z":-52.0709686279297},"rot":{"x":0.0208129156380892,"y":269.984436035156,"z":0.016765596345067}},"fd1c20":{"lock":false,"pos":{"x":40.6758651733398,"y":1.32132661342621,"z":-65.8127288818359},"rot":{"x":0.0208073426038027,"y":270.004455566406,"z":0.0167714562267065}},"fd3cda":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208078119903803,"y":270.002380371094,"z":0.01677006483078}},"ff2be9":{"lock":false,"pos":{"x":40.6758651733398,"y":1.32681381702423,"z":-63.5128746032715},"rot":{"x":0.0208086092025042,"y":269.999969482422,"z":0.0167697928845882}}}}' +LuaScriptState: '{"ml":{"037da2":{"lock":false,"pos":{"x":7.0765,"y":1.3194,"z":-77.26},"rot":{"x":0.0208,"y":270.0044,"z":0.0168}},"0d3413":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208131484687328,"y":269.984130859375,"z":0.0167654547840357}},"0d3d1a":{"lock":false,"pos":{"x":58.0996589660645,"y":1.31018245220184,"z":-47.4709777832031},"rot":{"x":0.0208098702132702,"y":269.99560546875,"z":0.0167695544660091}},"0d88ac":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208131372928619,"y":269.984130859375,"z":0.0167654566466808}},"117137":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29699695110321,"z":-70.4198684692383},"rot":{"x":0.0208051409572363,"y":270.01171875,"z":0.0167752224951983}},"15a1bb":{"lock":false,"pos":{"x":52.944206237793,"y":1.30226576328278,"z":-68.1202087402344},"rot":{"x":0.0208075903356075,"y":270.002319335938,"z":0.0167708676308393}},"1a1b58":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083969116211},"rot":{"x":0.0208054501563311,"y":270.01123046875,"z":0.0167750548571348}},"2172e2":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565036296844,"z":-75.0199966430664},"rot":{"x":0.0208052974194288,"y":270.01123046875,"z":0.0167750157415867}},"22c4b1":{"lock":false,"pos":{"x":40.2742691040039,"y":1.3133761882782,"z":-88.8093566894531},"rot":{"x":0.0208131019026041,"y":269.984893798828,"z":0.016765333712101}},"26d70e":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208039935678244,"y":270.015655517578,"z":0.0167770534753799}},"300569":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.020807184278965,"y":270.005340576172,"z":0.0167731363326311}},"344e90":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30361223220825,"z":-63.5203514099121},"rot":{"x":0.0208059120923281,"y":270.01123046875,"z":0.0167752020061016}},"3469e0":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202438354492},"rot":{"x":0.0208072103559971,"y":270.002227783203,"z":0.0167718399316072}},"367e5c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.31868195533752,"z":-49.7084617614746},"rot":{"x":0.0208055451512337,"y":270.011169433594,"z":0.0167749207466841}},"384258":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208130851387978,"y":269.983917236328,"z":0.0167654231190681}},"3c0d81":{"lock":false,"pos":{"x":10.6138734817505,"y":1.31733238697052,"z":-88.7451629638672},"rot":{"x":0.0208089593797922,"y":269.999938964844,"z":0.0167716406285763}},"404410":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208074897527695,"y":270.002410888672,"z":0.0167710110545158}},"423ea2":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208082851022482,"y":270.000061035156,"z":0.0167701542377472}},"488fab":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208085421472788,"y":269.999694824219,"z":0.0167710371315479}},"4a29bd":{"lock":false,"pos":{"x":36.6243362426758,"y":1.32090437412262,"z":-75.0084228515625},"rot":{"x":0.0208090264350176,"y":269.999481201172,"z":0.0167706795036793}},"53eaa9":{"lock":false,"pos":{"x":7.07654333114624,"y":1.32277584075928,"z":-65.7601165771484},"rot":{"x":0.0208094976842403,"y":269.999755859375,"z":0.0167715046554804}},"552689":{"lock":false,"pos":{"x":58.099666595459,"y":1.30816268920898,"z":-54.3709716796875},"rot":{"x":0.0208170842379332,"y":269.970977783203,"z":0.0167604200541973}},"562c05":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363131523132,"z":-81.9201202392578},"rot":{"x":0.0208051558583975,"y":270.011352539063,"z":0.0167752057313919}},"5bdc77":{"lock":false,"pos":{"x":7.07654094696045,"y":1.32210242748261,"z":-68.0601196289063},"rot":{"x":0.020809318870306,"y":269.999877929688,"z":0.0167716238647699}},"5d4212":{"lock":false,"pos":{"x":40.2899627685547,"y":1.29295742511749,"z":-84.2198867797852},"rot":{"x":0.0208051223307848,"y":270.011291503906,"z":0.0167752541601658}},"5f8011":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.0208053532987833,"y":270.011474609375,"z":0.016775343567133}},"6465d8":{"lock":false,"pos":{"x":40.2741088867188,"y":1.31270098686218,"z":-91.1157989501953},"rot":{"x":0.0208177529275417,"y":269.968811035156,"z":0.0167596582323313}},"659f2d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.020813312381506,"y":269.984313964844,"z":0.0167654268443584}},"683123":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208086892962456,"y":269.99951171875,"z":0.016771188005805}},"6e4d54":{"lock":false,"pos":{"x":52.9442253112793,"y":1.3063051700592,"z":-54.3203315734863},"rot":{"x":0.0208052173256874,"y":270.011291503906,"z":0.0167752150446177}},"6f6976":{"lock":false,"pos":{"x":52.9442481994629,"y":1.29687976837158,"z":-86.5202560424805},"rot":{"x":0.0208085048943758,"y":270.000183105469,"z":0.0167691092938185}},"6fab5a":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29701554775238,"z":-65.8083038330078},"rot":{"x":0.0208086911588907,"y":269.999664306641,"z":0.0167710911482573}},"73255e":{"lock":false,"pos":{"x":36.6243476867676,"y":1.31935524940491,"z":-47.4084320068359},"rot":{"x":0.0208136457949877,"y":269.984313964844,"z":0.0167664084583521}},"7337c1":{"lock":false,"pos":{"x":36.6243324279785,"y":1.296342253685,"z":-68.1083145141602},"rot":{"x":0.0208085253834724,"y":269.999725341797,"z":0.0167711153626442}},"791d5f":{"lock":false,"pos":{"x":52.9441146850586,"y":1.29755306243896,"z":-84.2202377319336},"rot":{"x":0.0208081174641848,"y":270.000366210938,"z":0.0167699996381998}},"7b5a65":{"lock":false,"pos":{"x":36.6243362426758,"y":1.31811010837555,"z":-68.1082992553711},"rot":{"x":0.0208089593797922,"y":269.999572753906,"z":0.0167709328234196}},"8343e5":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208086632192135,"y":269.999542236328,"z":0.0167709793895483}},"854c79":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208052471280098,"y":270.01123046875,"z":0.0167751107364893}},"86d109":{"lock":false,"pos":{"x":40.2900543212891,"y":1.2976701259613,"z":-68.1198577880859},"rot":{"x":0.0208089128136635,"y":269.998718261719,"z":0.0167706441134214}},"870bdc":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495870113373,"z":-58.9203491210938},"rot":{"x":0.0208054501563311,"y":270.011169433594,"z":0.01677530631423}},"8b1863":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208085775375366,"y":269.999847412109,"z":0.0167709905654192}},"8c4d07":{"lock":false,"pos":{"x":52.944206237793,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208080857992172,"y":270.002349853516,"z":0.0167721528559923}},"8cdfc7":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.0208087265491486,"y":269.999420166016,"z":0.0167710389941931}},"90e0af":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208087228238583,"y":269.999603271484,"z":0.016771050170064}},"96b5ed":{"lock":false,"pos":{"x":58.099666595459,"y":1.30883598327637,"z":-52.0709648132324},"rot":{"x":0.0208053812384605,"y":270.011260986328,"z":0.0167752522975206}},"96ba38":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.6082916259766},"rot":{"x":0.0208069104701281,"y":270.005249023438,"z":0.0167730543762445}},"96ec75":{"lock":false,"pos":{"x":7.07653141021729,"y":1.32075607776642,"z":-72.6601257324219},"rot":{"x":0.020809406414628,"y":269.999755859375,"z":0.0167715381830931}},"97ed44":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208085551857948,"y":269.999694824219,"z":0.0167710836976767}},"9b1c5b":{"lock":false,"pos":{"x":52.944206237793,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208045355975628,"y":270.011260986328,"z":0.0167749188840389}},"a641de":{"lock":false,"pos":{"x":49.2785034179688,"y":1.30699694156647,"z":-47.4087791442871},"rot":{"x":0.0208086203783751,"y":270.000091552734,"z":0.0167719777673483}},"a781f4":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495882034302,"z":-58.9203491210938},"rot":{"x":0.0208078641444445,"y":270.002197265625,"z":0.0167722031474113}},"add7c9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208084508776665,"y":269.999786376953,"z":0.0167711265385151}},"afb8cf":{"lock":false,"pos":{"x":40.6758728027344,"y":1.32536602020264,"z":-52.0128517150879},"rot":{"x":0.0208085291087627,"y":270.000427246094,"z":0.0167702343314886}},"b4121c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29566895961761,"z":-70.4083099365234},"rot":{"x":0.0208052825182676,"y":270.01123046875,"z":0.0167750306427479}},"b63277":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768872261047,"z":-63.5084495544434},"rot":{"x":0.020808519795537,"y":269.999694824219,"z":0.0167711153626442}},"b722cd":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208131149411201,"y":269.984252929688,"z":0.0167656894773245}},"b7c316":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208083391189575,"y":269.999938964844,"z":0.0167708527296782}},"b92e9b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29566895961761,"z":-70.408317565918},"rot":{"x":0.020808594301343,"y":269.999633789063,"z":0.0167710985988379}},"b98ff6":{"lock":false,"pos":{"x":52.9284286499023,"y":1.29620385169983,"z":-88.809700012207},"rot":{"x":0.0208056010305882,"y":270.009582519531,"z":0.0167727544903755}},"bc498d":{"lock":false,"pos":{"x":40.2900581359863,"y":1.29834342002869,"z":-65.8198547363281},"rot":{"x":0.0208087619394064,"y":269.999450683594,"z":0.0167710799723864}},"bc868c":{"lock":false,"pos":{"x":7.07651281356812,"y":1.32008278369904,"z":-74.9601593017578},"rot":{"x":0.0208091288805008,"y":269.999481201172,"z":0.0167714580893517}},"bdbca5":{"lock":false,"pos":{"x":52.9282646179199,"y":1.2955287694931,"z":-91.1161422729492},"rot":{"x":0.0208041183650494,"y":270.013427734375,"z":0.0167748238891363}},"be04d4":{"lock":false,"pos":{"x":40.2900390625,"y":1.29632365703583,"z":-72.7199935913086},"rot":{"x":0.0208050403743982,"y":270.011474609375,"z":0.0167753025889397}},"c1365d":{"lock":false,"pos":{"x":52.944206237793,"y":1.30159246921539,"z":-70.4202117919922},"rot":{"x":0.0208051279187202,"y":270.011291503906,"z":0.0167732611298561}},"c4e958":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208078399300575,"y":270.002197265625,"z":0.0167719554156065}},"c8716d":{"lock":false,"pos":{"x":7.07653570175171,"y":1.3214293718338,"z":-70.3601226806641},"rot":{"x":0.0208090115338564,"y":269.999664306641,"z":0.0167711675167084}},"cffeb0":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.0208134613931179,"y":269.984008789063,"z":0.0167653076350689}},"d391c7":{"lock":false,"pos":{"x":52.9462432861328,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.020808445289731,"y":270.000122070313,"z":0.0167692247778177}},"d5605f":{"lock":false,"pos":{"x":40.6758728027344,"y":1.32603931427002,"z":-49.7128486633301},"rot":{"x":0.0208086594939232,"y":269.999816894531,"z":0.0167700685560703}},"d86b0d":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632365703583,"z":-72.7199859619141},"rot":{"x":0.0208050478249788,"y":270.011596679688,"z":0.0167753864079714}},"dadcc3":{"lock":false,"pos":{"x":52.9442138671875,"y":1.3063051700592,"z":-54.3203430175781},"rot":{"x":0.0208133850246668,"y":269.984008789063,"z":0.0167653672397137}},"ddaded":{"lock":false,"pos":{"x":19.3437099456787,"y":1.29451763629913,"z":-56.5678901672363},"rot":{"x":0.0208087582141161,"y":269.999481201172,"z":0.016770189628005}},"dde850":{"lock":false,"pos":{"x":7.07655096054077,"y":1.32816159725189,"z":-47.3604888916016},"rot":{"x":0.0208085924386978,"y":270.000396728516,"z":0.0167710743844509}},"e0721f":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30950915813446,"z":-49.7709655761719},"rot":{"x":0.0208085887134075,"y":269.999755859375,"z":0.0167710725218058}},"e07aab":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208041630685329,"y":270.014984130859,"z":0.0167767554521561}},"e4ceae":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208050720393658,"y":270.011444091797,"z":0.0167752411216497}},"e50ca0":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208085589110851,"y":269.999755859375,"z":0.0167709719389677}},"e87c2d":{"lock":false,"pos":{"x":7.07654714584351,"y":1.3274884223938,"z":-49.6604766845703},"rot":{"x":0.020808594301343,"y":270.00048828125,"z":0.0167711768299341}},"e99f0d":{"lock":false,"pos":{"x":52.9442176818848,"y":1.30563187599182,"z":-56.6203422546387},"rot":{"x":0.0208088699728251,"y":269.998962402344,"z":0.0167707670480013}},"eaafcf":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29364931583405,"z":-77.3083343505859},"rot":{"x":0.0208131372928619,"y":269.984069824219,"z":0.0167653374373913}},"ebf4c0":{"lock":false,"pos":{"x":7.07653713226318,"y":1.32344889640808,"z":-63.4604873657227},"rot":{"x":0.0208090376108885,"y":269.999877929688,"z":0.0167712233960629}},"ef2ecd":{"lock":false,"pos":{"x":10.6296834945679,"y":1.31801056861877,"z":-86.4480361938477},"rot":{"x":0.020808607339859,"y":269.999816894531,"z":0.0167710799723864}},"f22453":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30697846412659,"z":-52.0203399658203},"rot":{"x":0.0208085775375366,"y":269.999755859375,"z":0.0167712084949017}},"f75ae4":{"lock":false,"pos":{"x":7.07651996612549,"y":1.31940948963165,"z":-77.2600555419922},"rot":{"x":0.0208091493695974,"y":269.999969482422,"z":0.0167716313153505}},"f86ed0":{"lock":false,"pos":{"x":7.07654428482056,"y":1.32681512832642,"z":-51.9604797363281},"rot":{"x":0.020808408036828,"y":270.000427246094,"z":0.0167713183909655}},"f99e05":{"lock":false,"pos":{"x":44.2130165100098,"y":1.31039607524872,"z":-91.0974273681641},"rot":{"x":0.0208132099360228,"y":269.984924316406,"z":0.0167646240442991}},"fab3a9":{"lock":false,"pos":{"x":40.2900657653809,"y":1.30103635787964,"z":-56.6199951171875},"rot":{"x":0.0208051521331072,"y":270.01123046875,"z":0.0167752224951983}},"fbd97e":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30563187599182,"z":-56.6203460693359},"rot":{"x":0.0208078734576702,"y":270.002197265625,"z":0.0167717821896076}},"fc5406":{"lock":false,"pos":{"x":10.6137104034424,"y":1.3166606426239,"z":-91.0400085449219},"rot":{"x":0.0208087395876646,"y":269.999816894531,"z":0.0167708862572908}},"fc790a":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30883586406708,"z":-52.0709686279297},"rot":{"x":0.0208129156380892,"y":269.984436035156,"z":0.016765596345067}},"fd1c20":{"lock":false,"pos":{"x":40.6758651733398,"y":1.32132661342621,"z":-65.8127288818359},"rot":{"x":0.0208073426038027,"y":270.004455566406,"z":0.0167714562267065}},"fd3cda":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30024600028992,"z":-75.0203399658203},"rot":{"x":0.0208072382956743,"y":270.00244140625,"z":0.0167719274759293}},"ff2be9":{"lock":false,"pos":{"x":40.6758651733398,"y":1.32681381702423,"z":-63.5128746032715},"rot":{"x":0.0208086092025042,"y":269.999969482422,"z":0.0167697928845882}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Barricade (3) 3469e0.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Barricade (3) 3469e0.yaml index ed1484499..80c0aec86 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Barricade (3) 3469e0.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Barricade (3) 3469e0.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -75.02 + posZ: -77.32 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Cryptic Research (4) 791d5f.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Cryptic Research (4) 791d5f.yaml index 74e2516e2..551e5668d 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Cryptic Research (4) 791d5f.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Cryptic Research (4) 791d5f.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.95 + posX: 52.94 posY: 1.3 - posZ: -81.92 + posZ: -84.22 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Deciphered Reality (5) b98ff6.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Deciphered Reality (5) b98ff6.yaml index 08c2a8fcd..39c0e5e44 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Deciphered Reality (5) b98ff6.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Deciphered Reality (5) b98ff6.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.94 + posX: 52.93 posY: 1.3 - posZ: -86.52 + posZ: -88.81 rotX: 0.02 rotY: 270.01 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Eidetic Memory (3) 423ea2.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Eidetic Memory (3) 423ea2.yaml index f4f0614a7..1069bdd75 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Eidetic Memory (3) 423ea2.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Eidetic Memory (3) 423ea2.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -77.32 + posZ: -79.62 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Expose Weakness (3) d391c7.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Expose Weakness (3) d391c7.yaml index 687a44445..2022d2941 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Expose Weakness (3) d391c7.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Expose Weakness (3) d391c7.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.94 + posX: 52.95 posY: 1.3 - posZ: -79.62 + posZ: -81.92 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Gaze of Ouraxsh (2) b7c316.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Gaze of Ouraxsh (2) b7c316.yaml new file mode 100644 index 000000000..16e415f32 --- /dev/null +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Gaze of Ouraxsh (2) b7c316.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232103 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b7c316 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Gaze of Ouraxsh (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 52.94 + posY: 1.3 + posZ: -61.22 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Glimpse the Unthinkable (5) bdbca5.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Glimpse the Unthinkable (5) bdbca5.yaml index 723e3ec3b..13fdb0509 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Glimpse the Unthinkable (5) bdbca5.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Glimpse the Unthinkable (5) bdbca5.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.93 posY: 1.3 - posZ: -88.81 + posZ: -91.12 rotX: 0.02 rotY: 270.01 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card I've got a plan! (2) 344e90.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card I've got a plan! (2) 344e90.yaml index 93e2f9fcb..697d58c39 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card I've got a plan! (2) 344e90.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card I've got a plan! (2) 344e90.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -61.22 + posZ: -63.52 rotX: 0.02 rotY: 270.01 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Logical Reasoning (4) 6f6976.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Logical Reasoning (4) 6f6976.yaml index fb6db1079..45d59bda6 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Logical Reasoning (4) 6f6976.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Logical Reasoning (4) 6f6976.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -84.22 + posZ: -86.52 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Mind Over Matter (2) 9b1c5b.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Mind Over Matter (2) 9b1c5b.yaml index 4d04c6534..258d3dba2 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Mind Over Matter (2) 9b1c5b.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Mind Over Matter (2) 9b1c5b.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -63.52 + posZ: -65.82 rotX: 0.02 rotY: 270.01 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card No Stone Unturned (5) a641de.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card No Stone Unturned (5) a641de.yaml index dae16eb26..92415e96f 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card No Stone Unturned (5) a641de.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card No Stone Unturned (5) a641de.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.93 - posY: 1.3 - posZ: -91.12 + posX: 49.28 + posY: 1.31 + posZ: -47.41 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Preposterous Sketches (2) 15a1bb.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Preposterous Sketches (2) 15a1bb.yaml index 7eb37e792..6383bdf7d 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Preposterous Sketches (2) 15a1bb.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Preposterous Sketches (2) 15a1bb.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -65.82 + posZ: -68.12 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Seeking Answers (2) c1365d.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Seeking Answers (2) c1365d.yaml index e78187aa2..f729274a3 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Seeking Answers (2) c1365d.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Seeking Answers (2) c1365d.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -68.12 + posZ: -70.42 rotX: 0.02 rotY: 270.01 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Shortcut (2) 404410.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Shortcut (2) 404410.yaml index 7967cc8f7..5aeabe2cd 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Shortcut (2) 404410.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Shortcut (2) 404410.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -70.42 + posZ: -72.72 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Truth from Fiction (2) fd3cda.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Truth from Fiction (2) fd3cda.yaml index e635f7d85..99862324b 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Truth from Fiction (2) fd3cda.yaml +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Card Truth from Fiction (2) fd3cda.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -72.72 + posZ: -75.02 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.ttslua b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.ttslua new file mode 100644 index 000000000..b25806e6f --- /dev/null +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.ttslua @@ -0,0 +1,503 @@ +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.yaml new file mode 100644 index 000000000..5dfd71eb9 --- /dev/null +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.yaml @@ -0,0 +1,115 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag Seeker b2264c/Card Gaze of Ouraxsh (2) b7c316.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Higher Education (3) 0d3413.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Surprising Find (1) 0d3d1a.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Old Book of Lore (3) 0d88ac.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Disc of Itzamna (2) 117137.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Preposterous Sketches (2) 15a1bb.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Miskatonic Archaeology Funding (4) + 1a1b58.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Esoteric Atlas (2) 2172e2.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Deck Archaic Glyphs (3) 22c4b1.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Quick Study (2) 26d70e.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Pnakotic Manuscripts (5) 300569.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card I''ve got a plan! (2) 344e90.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Barricade (3) 3469e0.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Deck Forbidden Tome (3) 367e5c.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Studious (3) 384258.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Shortcut (2) 404410.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Eidetic Memory (3) 423ea2.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card In the Know (1) 488fab.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Deck Strange Solution (4) 4a29bd.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card The Eye of Truth (5) 552689.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Otherworldly Compass (2) 562c05.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Otherworld Codex (2) 5f8011.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Deck Dream Diary (3) 6465d8.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Feed the Mind (3) 659f2d.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Pathfinder (1) 683123.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Glimpse the Unthinkable (1) 6e4d54.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Logical Reasoning (4) 6f6976.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Arcane Insight (4) 6fab5a.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Cryptic Research (4) 791d5f.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Deck Ancient Stone (4) 7b5a65.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Magnifying Glass (1) 8343e5.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Whitton Greene (2) 854c79.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Blasphemous Covenant (2) 86d109.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Cryptic Writings (2) 870bdc.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Ancient Stone (1) 8b1863.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Scientific Theory (1) 8cdfc7.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Perception (2) 96b5ed.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card The Necronomicon (5) 96ba38.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Expose Weakness (1) 97ed44.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Mind Over Matter (2) 9b1c5b.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card No Stone Unturned (5) a641de.yaml' +- !include "Custom_Model_Bag Seeker b2264c/Card Death \u2022 XIII (1) add7c9.yaml" +- !include 'Custom_Model_Bag Seeker b2264c/Card Farsight (4) b4121c.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Abigail Foreman (4) b63277.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Grisly Totem (3) b722cd.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Deciphered Reality (5) b98ff6.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Segment of Onyx (1) bc498d.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Glimpse the Unthinkable (5) bdbca5.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Seeking Answers (2) c1365d.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Scroll of Secrets (3) cffeb0.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Expose Weakness (3) d391c7.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Encyclopedia (2) d86b0d.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Deduction (2) e0721f.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Extensive Research (1) e07aab.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Hyperawareness (2) e4ceae.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Esoteric Atlas (1) e50ca0.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Stirring Up Trouble (1) e99f0d.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Forewarned (1) f22453.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Library Docent (1) fab3a9.yaml' +- !include 'Custom_Model_Bag Seeker b2264c/Card Truth from Fiction (2) fd3cda.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516265983/F50A6212D30C442429ED22B8CC8FD24D4CB76A2A/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b2264c +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Seeker b2264c.ttslua' +LuaScriptState: '{"ml":{"037da2":{"lock":false,"pos":{"x":7.0765,"y":1.3194,"z":-77.26},"rot":{"x":0.0208,"y":270.0044,"z":0.0168}},"0d3413":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208131484687328,"y":269.984130859375,"z":0.0167654547840357}},"0d3d1a":{"lock":false,"pos":{"x":58.0996589660645,"y":1.31018245220184,"z":-47.4709777832031},"rot":{"x":0.0208098702132702,"y":269.99560546875,"z":0.0167695544660091}},"0d88ac":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.0208131372928619,"y":269.984130859375,"z":0.0167654566466808}},"117137":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29699695110321,"z":-70.4198684692383},"rot":{"x":0.0208051409572363,"y":270.01171875,"z":0.0167752224951983}},"15a1bb":{"lock":false,"pos":{"x":52.944206237793,"y":1.30226576328278,"z":-68.1202087402344},"rot":{"x":0.0208075903356075,"y":270.002319335938,"z":0.0167708676308393}},"1a1b58":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499578475952,"z":-72.7083969116211},"rot":{"x":0.0208054501563311,"y":270.01123046875,"z":0.0167750548571348}},"2172e2":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565036296844,"z":-75.0199966430664},"rot":{"x":0.0208052974194288,"y":270.01123046875,"z":0.0167750157415867}},"22c4b1":{"lock":false,"pos":{"x":40.2742691040039,"y":1.3133761882782,"z":-88.8093566894531},"rot":{"x":0.0208131019026041,"y":269.984893798828,"z":0.016765333712101}},"26d70e":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208039935678244,"y":270.015655517578,"z":0.0167770534753799}},"300569":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.020807184278965,"y":270.005340576172,"z":0.0167731363326311}},"344e90":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30361223220825,"z":-63.5203514099121},"rot":{"x":0.0208059120923281,"y":270.01123046875,"z":0.0167752020061016}},"3469e0":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202438354492},"rot":{"x":0.0208072103559971,"y":270.002227783203,"z":0.0167718399316072}},"367e5c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.31868195533752,"z":-49.7084617614746},"rot":{"x":0.0208055451512337,"y":270.011169433594,"z":0.0167749207466841}},"384258":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208130851387978,"y":269.983917236328,"z":0.0167654231190681}},"3c0d81":{"lock":false,"pos":{"x":10.6138734817505,"y":1.31733238697052,"z":-88.7451629638672},"rot":{"x":0.0208089593797922,"y":269.999938964844,"z":0.0167716406285763}},"404410":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208074897527695,"y":270.002410888672,"z":0.0167710110545158}},"423ea2":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208082851022482,"y":270.000061035156,"z":0.0167701542377472}},"488fab":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208085421472788,"y":269.999694824219,"z":0.0167710371315479}},"4a29bd":{"lock":false,"pos":{"x":36.6243362426758,"y":1.32090437412262,"z":-75.0084228515625},"rot":{"x":0.0208090264350176,"y":269.999481201172,"z":0.0167706795036793}},"53eaa9":{"lock":false,"pos":{"x":7.07654333114624,"y":1.32277584075928,"z":-65.7601165771484},"rot":{"x":0.0208094976842403,"y":269.999755859375,"z":0.0167715046554804}},"552689":{"lock":false,"pos":{"x":58.099666595459,"y":1.30816268920898,"z":-54.3709716796875},"rot":{"x":0.0208170842379332,"y":269.970977783203,"z":0.0167604200541973}},"562c05":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363131523132,"z":-81.9201202392578},"rot":{"x":0.0208051558583975,"y":270.011352539063,"z":0.0167752057313919}},"5bdc77":{"lock":false,"pos":{"x":7.07654094696045,"y":1.32210242748261,"z":-68.0601196289063},"rot":{"x":0.020809318870306,"y":269.999877929688,"z":0.0167716238647699}},"5d4212":{"lock":false,"pos":{"x":40.2899627685547,"y":1.29295742511749,"z":-84.2198867797852},"rot":{"x":0.0208051223307848,"y":270.011291503906,"z":0.0167752541601658}},"5f8011":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.0208053532987833,"y":270.011474609375,"z":0.016775343567133}},"6465d8":{"lock":false,"pos":{"x":40.2741088867188,"y":1.31270098686218,"z":-91.1157989501953},"rot":{"x":0.0208177529275417,"y":269.968811035156,"z":0.0167596582323313}},"659f2d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.020813312381506,"y":269.984313964844,"z":0.0167654268443584}},"683123":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208086892962456,"y":269.99951171875,"z":0.016771188005805}},"6e4d54":{"lock":false,"pos":{"x":52.9442253112793,"y":1.3063051700592,"z":-54.3203315734863},"rot":{"x":0.0208052173256874,"y":270.011291503906,"z":0.0167752150446177}},"6f6976":{"lock":false,"pos":{"x":52.9442481994629,"y":1.29687976837158,"z":-86.5202560424805},"rot":{"x":0.0208085048943758,"y":270.000183105469,"z":0.0167691092938185}},"6fab5a":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29701554775238,"z":-65.8083038330078},"rot":{"x":0.0208086911588907,"y":269.999664306641,"z":0.0167710911482573}},"73255e":{"lock":false,"pos":{"x":36.6243476867676,"y":1.31935524940491,"z":-47.4084320068359},"rot":{"x":0.0208136457949877,"y":269.984313964844,"z":0.0167664084583521}},"7337c1":{"lock":false,"pos":{"x":36.6243324279785,"y":1.296342253685,"z":-68.1083145141602},"rot":{"x":0.0208085253834724,"y":269.999725341797,"z":0.0167711153626442}},"791d5f":{"lock":false,"pos":{"x":52.9441146850586,"y":1.29755306243896,"z":-84.2202377319336},"rot":{"x":0.0208081174641848,"y":270.000366210938,"z":0.0167699996381998}},"7b5a65":{"lock":false,"pos":{"x":36.6243362426758,"y":1.31811010837555,"z":-68.1082992553711},"rot":{"x":0.0208089593797922,"y":269.999572753906,"z":0.0167709328234196}},"8343e5":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208086632192135,"y":269.999542236328,"z":0.0167709793895483}},"854c79":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208052471280098,"y":270.01123046875,"z":0.0167751107364893}},"86d109":{"lock":false,"pos":{"x":40.2900543212891,"y":1.2976701259613,"z":-68.1198577880859},"rot":{"x":0.0208089128136635,"y":269.998718261719,"z":0.0167706441134214}},"870bdc":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495870113373,"z":-58.9203491210938},"rot":{"x":0.0208054501563311,"y":270.011169433594,"z":0.01677530631423}},"8b1863":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208085775375366,"y":269.999847412109,"z":0.0167709905654192}},"8c4d07":{"lock":false,"pos":{"x":52.944206237793,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208080857992172,"y":270.002349853516,"z":0.0167721528559923}},"8cdfc7":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.0208087265491486,"y":269.999420166016,"z":0.0167710389941931}},"90e0af":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208087228238583,"y":269.999603271484,"z":0.016771050170064}},"96b5ed":{"lock":false,"pos":{"x":58.099666595459,"y":1.30883598327637,"z":-52.0709648132324},"rot":{"x":0.0208053812384605,"y":270.011260986328,"z":0.0167752522975206}},"96ba38":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.6082916259766},"rot":{"x":0.0208069104701281,"y":270.005249023438,"z":0.0167730543762445}},"96ec75":{"lock":false,"pos":{"x":7.07653141021729,"y":1.32075607776642,"z":-72.6601257324219},"rot":{"x":0.020809406414628,"y":269.999755859375,"z":0.0167715381830931}},"97ed44":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208085551857948,"y":269.999694824219,"z":0.0167710836976767}},"9b1c5b":{"lock":false,"pos":{"x":52.944206237793,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208045355975628,"y":270.011260986328,"z":0.0167749188840389}},"a641de":{"lock":false,"pos":{"x":49.2785034179688,"y":1.30699694156647,"z":-47.4087791442871},"rot":{"x":0.0208086203783751,"y":270.000091552734,"z":0.0167719777673483}},"a781f4":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495882034302,"z":-58.9203491210938},"rot":{"x":0.0208078641444445,"y":270.002197265625,"z":0.0167722031474113}},"add7c9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208084508776665,"y":269.999786376953,"z":0.0167711265385151}},"afb8cf":{"lock":false,"pos":{"x":40.6758728027344,"y":1.32536602020264,"z":-52.0128517150879},"rot":{"x":0.0208085291087627,"y":270.000427246094,"z":0.0167702343314886}},"b4121c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29566895961761,"z":-70.4083099365234},"rot":{"x":0.0208052825182676,"y":270.01123046875,"z":0.0167750306427479}},"b63277":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768872261047,"z":-63.5084495544434},"rot":{"x":0.020808519795537,"y":269.999694824219,"z":0.0167711153626442}},"b722cd":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208131149411201,"y":269.984252929688,"z":0.0167656894773245}},"b7c316":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208083391189575,"y":269.999938964844,"z":0.0167708527296782}},"b92e9b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29566895961761,"z":-70.408317565918},"rot":{"x":0.020808594301343,"y":269.999633789063,"z":0.0167710985988379}},"b98ff6":{"lock":false,"pos":{"x":52.9284286499023,"y":1.29620385169983,"z":-88.809700012207},"rot":{"x":0.0208056010305882,"y":270.009582519531,"z":0.0167727544903755}},"bc498d":{"lock":false,"pos":{"x":40.2900581359863,"y":1.29834342002869,"z":-65.8198547363281},"rot":{"x":0.0208087619394064,"y":269.999450683594,"z":0.0167710799723864}},"bc868c":{"lock":false,"pos":{"x":7.07651281356812,"y":1.32008278369904,"z":-74.9601593017578},"rot":{"x":0.0208091288805008,"y":269.999481201172,"z":0.0167714580893517}},"bdbca5":{"lock":false,"pos":{"x":52.9282646179199,"y":1.2955287694931,"z":-91.1161422729492},"rot":{"x":0.0208041183650494,"y":270.013427734375,"z":0.0167748238891363}},"be04d4":{"lock":false,"pos":{"x":40.2900390625,"y":1.29632365703583,"z":-72.7199935913086},"rot":{"x":0.0208050403743982,"y":270.011474609375,"z":0.0167753025889397}},"c1365d":{"lock":false,"pos":{"x":52.944206237793,"y":1.30159246921539,"z":-70.4202117919922},"rot":{"x":0.0208051279187202,"y":270.011291503906,"z":0.0167732611298561}},"c4e958":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208078399300575,"y":270.002197265625,"z":0.0167719554156065}},"c8716d":{"lock":false,"pos":{"x":7.07653570175171,"y":1.3214293718338,"z":-70.3601226806641},"rot":{"x":0.0208090115338564,"y":269.999664306641,"z":0.0167711675167084}},"cffeb0":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.0208134613931179,"y":269.984008789063,"z":0.0167653076350689}},"d391c7":{"lock":false,"pos":{"x":52.9462432861328,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.020808445289731,"y":270.000122070313,"z":0.0167692247778177}},"d5605f":{"lock":false,"pos":{"x":40.6758728027344,"y":1.32603931427002,"z":-49.7128486633301},"rot":{"x":0.0208086594939232,"y":269.999816894531,"z":0.0167700685560703}},"d86b0d":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632365703583,"z":-72.7199859619141},"rot":{"x":0.0208050478249788,"y":270.011596679688,"z":0.0167753864079714}},"dadcc3":{"lock":false,"pos":{"x":52.9442138671875,"y":1.3063051700592,"z":-54.3203430175781},"rot":{"x":0.0208133850246668,"y":269.984008789063,"z":0.0167653672397137}},"ddaded":{"lock":false,"pos":{"x":19.3437099456787,"y":1.29451763629913,"z":-56.5678901672363},"rot":{"x":0.0208087582141161,"y":269.999481201172,"z":0.016770189628005}},"dde850":{"lock":false,"pos":{"x":7.07655096054077,"y":1.32816159725189,"z":-47.3604888916016},"rot":{"x":0.0208085924386978,"y":270.000396728516,"z":0.0167710743844509}},"e0721f":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30950915813446,"z":-49.7709655761719},"rot":{"x":0.0208085887134075,"y":269.999755859375,"z":0.0167710725218058}},"e07aab":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208041630685329,"y":270.014984130859,"z":0.0167767554521561}},"e4ceae":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208050720393658,"y":270.011444091797,"z":0.0167752411216497}},"e50ca0":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208085589110851,"y":269.999755859375,"z":0.0167709719389677}},"e87c2d":{"lock":false,"pos":{"x":7.07654714584351,"y":1.3274884223938,"z":-49.6604766845703},"rot":{"x":0.020808594301343,"y":270.00048828125,"z":0.0167711768299341}},"e99f0d":{"lock":false,"pos":{"x":52.9442176818848,"y":1.30563187599182,"z":-56.6203422546387},"rot":{"x":0.0208088699728251,"y":269.998962402344,"z":0.0167707670480013}},"eaafcf":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29364931583405,"z":-77.3083343505859},"rot":{"x":0.0208131372928619,"y":269.984069824219,"z":0.0167653374373913}},"ebf4c0":{"lock":false,"pos":{"x":7.07653713226318,"y":1.32344889640808,"z":-63.4604873657227},"rot":{"x":0.0208090376108885,"y":269.999877929688,"z":0.0167712233960629}},"ef2ecd":{"lock":false,"pos":{"x":10.6296834945679,"y":1.31801056861877,"z":-86.4480361938477},"rot":{"x":0.020808607339859,"y":269.999816894531,"z":0.0167710799723864}},"f22453":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30697846412659,"z":-52.0203399658203},"rot":{"x":0.0208085775375366,"y":269.999755859375,"z":0.0167712084949017}},"f75ae4":{"lock":false,"pos":{"x":7.07651996612549,"y":1.31940948963165,"z":-77.2600555419922},"rot":{"x":0.0208091493695974,"y":269.999969482422,"z":0.0167716313153505}},"f86ed0":{"lock":false,"pos":{"x":7.07654428482056,"y":1.32681512832642,"z":-51.9604797363281},"rot":{"x":0.020808408036828,"y":270.000427246094,"z":0.0167713183909655}},"f99e05":{"lock":false,"pos":{"x":44.2130165100098,"y":1.31039607524872,"z":-91.0974273681641},"rot":{"x":0.0208132099360228,"y":269.984924316406,"z":0.0167646240442991}},"fab3a9":{"lock":false,"pos":{"x":40.2900657653809,"y":1.30103635787964,"z":-56.6199951171875},"rot":{"x":0.0208051521331072,"y":270.01123046875,"z":0.0167752224951983}},"fbd97e":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30563187599182,"z":-56.6203460693359},"rot":{"x":0.0208078734576702,"y":270.002197265625,"z":0.0167717821896076}},"fc5406":{"lock":false,"pos":{"x":10.6137104034424,"y":1.3166606426239,"z":-91.0400085449219},"rot":{"x":0.0208087395876646,"y":269.999816894531,"z":0.0167708862572908}},"fc790a":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30883586406708,"z":-52.0709686279297},"rot":{"x":0.0208129156380892,"y":269.984436035156,"z":0.016765596345067}},"fd1c20":{"lock":false,"pos":{"x":40.6758651733398,"y":1.32132661342621,"z":-65.8127288818359},"rot":{"x":0.0208073426038027,"y":270.004455566406,"z":0.0167714562267065}},"fd3cda":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30024600028992,"z":-75.0203399658203},"rot":{"x":0.0208072382956743,"y":270.00244140625,"z":0.0167719274759293}},"ff2be9":{"lock":false,"pos":{"x":40.6758651733398,"y":1.32681381702423,"z":-63.5128746032715},"rot":{"x":0.0208086092025042,"y":269.999969482422,"z":0.0167697928845882}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Seeker +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.3 + posY: 1.67 + posZ: -69.36 + rotX: 0.02 + rotY: 270.02 + rotZ: 0.02 + scaleX: 1.2 + scaleY: 1.2 + scaleZ: 1.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Abigail Foreman (4) b63277.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Abigail Foreman (4) b63277.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Abigail Foreman (4) b63277.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Abigail Foreman (4) b63277.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Ancient Stone (1) 8b1863.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Ancient Stone (1) 8b1863.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Ancient Stone (1) 8b1863.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Ancient Stone (1) 8b1863.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Arcane Insight (4) 6fab5a.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Arcane Insight (4) 6fab5a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Arcane Insight (4) 6fab5a.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Arcane Insight (4) 6fab5a.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Barricade (3) 3469e0.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Barricade (3) 3469e0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Barricade (3) 3469e0.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Barricade (3) 3469e0.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Blasphemous Covenant (2) 86d109.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Blasphemous Covenant (2) 86d109.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Blasphemous Covenant (2) 86d109.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Blasphemous Covenant (2) 86d109.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Cryptic Research (4) 791d5f.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Cryptic Research (4) 791d5f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Cryptic Research (4) 791d5f.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Cryptic Research (4) 791d5f.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Cryptic Writings (2) 870bdc.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Cryptic Writings (2) 870bdc.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Cryptic Writings (2) 870bdc.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Cryptic Writings (2) 870bdc.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Death • XIII (1) add7c9.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Death • XIII (1) add7c9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Death • XIII (1) add7c9.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Death • XIII (1) add7c9.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Deciphered Reality (5) b98ff6.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Deciphered Reality (5) b98ff6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Deciphered Reality (5) b98ff6.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Deciphered Reality (5) b98ff6.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Deduction (2) e0721f.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Deduction (2) e0721f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Deduction (2) e0721f.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Deduction (2) e0721f.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Disc of Itzamna (2) 117137.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Disc of Itzamna (2) 117137.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Disc of Itzamna (2) 117137.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Disc of Itzamna (2) 117137.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Eidetic Memory (3) 423ea2.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Eidetic Memory (3) 423ea2.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Eidetic Memory (3) 423ea2.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Eidetic Memory (3) 423ea2.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Encyclopedia (2) d86b0d.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Encyclopedia (2) d86b0d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Encyclopedia (2) d86b0d.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Encyclopedia (2) d86b0d.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Esoteric Atlas (1) e50ca0.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Esoteric Atlas (1) e50ca0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Esoteric Atlas (1) e50ca0.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Esoteric Atlas (1) e50ca0.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Esoteric Atlas (2) 2172e2.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Esoteric Atlas (2) 2172e2.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Esoteric Atlas (2) 2172e2.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Esoteric Atlas (2) 2172e2.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Expose Weakness (1) 97ed44.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Expose Weakness (1) 97ed44.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Expose Weakness (1) 97ed44.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Expose Weakness (1) 97ed44.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Expose Weakness (3) d391c7.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Expose Weakness (3) d391c7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Expose Weakness (3) d391c7.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Expose Weakness (3) d391c7.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Extensive Research (1) e07aab.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Extensive Research (1) e07aab.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Extensive Research (1) e07aab.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Extensive Research (1) e07aab.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Farsight (4) b4121c.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Farsight (4) b4121c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Farsight (4) b4121c.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Farsight (4) b4121c.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Feed the Mind (3) 659f2d.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Feed the Mind (3) 659f2d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Feed the Mind (3) 659f2d.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Feed the Mind (3) 659f2d.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Forewarned (1) f22453.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Forewarned (1) f22453.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Forewarned (1) f22453.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Forewarned (1) f22453.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Gaze of Ouraxsh (2) b7c316.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Gaze of Ouraxsh (2) b7c316.yaml new file mode 100644 index 000000000..f0a719388 --- /dev/null +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Gaze of Ouraxsh (2) b7c316.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232103 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b7c316 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Gaze of Ouraxsh (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.3 + posY: 1.41 + posZ: -69.36 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Glimpse the Unthinkable (1) 6e4d54.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Glimpse the Unthinkable (1) 6e4d54.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Glimpse the Unthinkable (1) 6e4d54.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Glimpse the Unthinkable (1) 6e4d54.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Glimpse the Unthinkable (5) bdbca5.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Glimpse the Unthinkable (5) bdbca5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Glimpse the Unthinkable (5) bdbca5.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Glimpse the Unthinkable (5) bdbca5.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Grisly Totem (3) b722cd.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Grisly Totem (3) b722cd.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Grisly Totem (3) b722cd.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Grisly Totem (3) b722cd.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Higher Education (3) 0d3413.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Higher Education (3) 0d3413.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Higher Education (3) 0d3413.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Higher Education (3) 0d3413.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Hyperawareness (2) e4ceae.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Hyperawareness (2) e4ceae.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Hyperawareness (2) e4ceae.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Hyperawareness (2) e4ceae.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card I've got a plan! (2) 344e90.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card I've got a plan! (2) 344e90.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card I've got a plan! (2) 344e90.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card I've got a plan! (2) 344e90.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card In the Know (1) 488fab.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card In the Know (1) 488fab.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card In the Know (1) 488fab.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card In the Know (1) 488fab.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Library Docent (1) fab3a9.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Library Docent (1) fab3a9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Library Docent (1) fab3a9.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Library Docent (1) fab3a9.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Logical Reasoning (4) 6f6976.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Logical Reasoning (4) 6f6976.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Logical Reasoning (4) 6f6976.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Logical Reasoning (4) 6f6976.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Magnifying Glass (1) 8343e5.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Magnifying Glass (1) 8343e5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Magnifying Glass (1) 8343e5.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Magnifying Glass (1) 8343e5.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Mind Over Matter (2) 9b1c5b.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Mind Over Matter (2) 9b1c5b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Mind Over Matter (2) 9b1c5b.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Mind Over Matter (2) 9b1c5b.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card No Stone Unturned (5) a641de.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card No Stone Unturned (5) a641de.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card No Stone Unturned (5) a641de.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card No Stone Unturned (5) a641de.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Old Book of Lore (3) 0d88ac.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Old Book of Lore (3) 0d88ac.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Old Book of Lore (3) 0d88ac.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Old Book of Lore (3) 0d88ac.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Otherworld Codex (2) 5f8011.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Otherworld Codex (2) 5f8011.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Otherworld Codex (2) 5f8011.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Otherworld Codex (2) 5f8011.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Otherworldly Compass (2) 562c05.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Otherworldly Compass (2) 562c05.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Otherworldly Compass (2) 562c05.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Otherworldly Compass (2) 562c05.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Pathfinder (1) 683123.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Pathfinder (1) 683123.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Pathfinder (1) 683123.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Pathfinder (1) 683123.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Perception (2) 96b5ed.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Perception (2) 96b5ed.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Perception (2) 96b5ed.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Perception (2) 96b5ed.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Pnakotic Manuscripts (5) 300569.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Pnakotic Manuscripts (5) 300569.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Pnakotic Manuscripts (5) 300569.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Pnakotic Manuscripts (5) 300569.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Preposterous Sketches (2) 15a1bb.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Preposterous Sketches (2) 15a1bb.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Preposterous Sketches (2) 15a1bb.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Preposterous Sketches (2) 15a1bb.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Quick Study (2) 26d70e.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Quick Study (2) 26d70e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Quick Study (2) 26d70e.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Quick Study (2) 26d70e.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Scientific Theory (1) 8cdfc7.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Scientific Theory (1) 8cdfc7.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Scientific Theory (1) 8cdfc7.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Scientific Theory (1) 8cdfc7.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Scroll of Secrets (3) cffeb0.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Scroll of Secrets (3) cffeb0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Scroll of Secrets (3) cffeb0.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Scroll of Secrets (3) cffeb0.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Seeking Answers (2) c1365d.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Seeking Answers (2) c1365d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Seeking Answers (2) c1365d.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Seeking Answers (2) c1365d.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Segment of Onyx (1) bc498d.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Segment of Onyx (1) bc498d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Segment of Onyx (1) bc498d.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Segment of Onyx (1) bc498d.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Shortcut (2) 404410.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Shortcut (2) 404410.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Shortcut (2) 404410.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Shortcut (2) 404410.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Stirring Up Trouble (1) e99f0d.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Stirring Up Trouble (1) e99f0d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Stirring Up Trouble (1) e99f0d.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Stirring Up Trouble (1) e99f0d.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Studious (3) 384258.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Studious (3) 384258.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Studious (3) 384258.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Studious (3) 384258.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Surprising Find (1) 0d3d1a.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Surprising Find (1) 0d3d1a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Surprising Find (1) 0d3d1a.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Surprising Find (1) 0d3d1a.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card The Eye of Truth (5) 552689.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card The Eye of Truth (5) 552689.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card The Eye of Truth (5) 552689.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card The Eye of Truth (5) 552689.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card The Necronomicon (5) 96ba38.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card The Necronomicon (5) 96ba38.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card The Necronomicon (5) 96ba38.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card The Necronomicon (5) 96ba38.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Truth from Fiction (2) fd3cda.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Truth from Fiction (2) fd3cda.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Truth from Fiction (2) fd3cda.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Truth from Fiction (2) fd3cda.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Whitton Greene (2) 854c79.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Whitton Greene (2) 854c79.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Card Whitton Greene (2) 854c79.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Card Whitton Greene (2) 854c79.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Deck Ancient Stone (4) 7b5a65.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Deck Ancient Stone (4) 7b5a65.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Deck Ancient Stone (4) 7b5a65.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Deck Ancient Stone (4) 7b5a65.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Deck Archaic Glyphs (3) 22c4b1.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Deck Archaic Glyphs (3) 22c4b1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Deck Archaic Glyphs (3) 22c4b1.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Deck Archaic Glyphs (3) 22c4b1.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Deck Dream Diary (3) 6465d8.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Deck Dream Diary (3) 6465d8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Deck Dream Diary (3) 6465d8.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Deck Dream Diary (3) 6465d8.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Deck Forbidden Tome (3) 367e5c.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Deck Forbidden Tome (3) 367e5c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Deck Forbidden Tome (3) 367e5c.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Deck Forbidden Tome (3) 367e5c.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Deck Strange Solution (4) 4a29bd.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Deck Strange Solution (4) 4a29bd.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16/Deck Strange Solution (4) 4a29bd.yaml rename to unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c/Deck Strange Solution (4) 4a29bd.yaml diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16.ttslua b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16.ttslua deleted file mode 100644 index f999547e7..000000000 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16.ttslua +++ /dev/null @@ -1,503 +0,0 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16.yaml b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16.yaml deleted file mode 100644 index 60fdbbfef..000000000 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker d99b16.yaml +++ /dev/null @@ -1,114 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 -ContainedObjects: -- !include 'Custom_Model_Bag Seeker d99b16/Card Blasphemous Covenant (2) 86d109.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Stirring Up Trouble (1) e99f0d.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Higher Education (3) 0d3413.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Surprising Find (1) 0d3d1a.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Old Book of Lore (3) 0d88ac.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Disc of Itzamna (2) 117137.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Preposterous Sketches (2) 15a1bb.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Miskatonic Archaeology Funding (4) - 1a1b58.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Esoteric Atlas (2) 2172e2.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Deck Archaic Glyphs (3) 22c4b1.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Quick Study (2) 26d70e.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Pnakotic Manuscripts (5) 300569.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card I''ve got a plan! (2) 344e90.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Barricade (3) 3469e0.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Deck Forbidden Tome (3) 367e5c.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Studious (3) 384258.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Shortcut (2) 404410.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Eidetic Memory (3) 423ea2.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card In the Know (1) 488fab.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Deck Strange Solution (4) 4a29bd.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card The Eye of Truth (5) 552689.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Otherworldly Compass (2) 562c05.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Otherworld Codex (2) 5f8011.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Deck Dream Diary (3) 6465d8.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Feed the Mind (3) 659f2d.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Pathfinder (1) 683123.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Glimpse the Unthinkable (1) 6e4d54.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Logical Reasoning (4) 6f6976.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Arcane Insight (4) 6fab5a.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Cryptic Research (4) 791d5f.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Deck Ancient Stone (4) 7b5a65.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Magnifying Glass (1) 8343e5.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Whitton Greene (2) 854c79.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Cryptic Writings (2) 870bdc.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Ancient Stone (1) 8b1863.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Scientific Theory (1) 8cdfc7.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Perception (2) 96b5ed.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card The Necronomicon (5) 96ba38.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Expose Weakness (1) 97ed44.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Mind Over Matter (2) 9b1c5b.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card No Stone Unturned (5) a641de.yaml' -- !include "Custom_Model_Bag Seeker d99b16/Card Death \u2022 XIII (1) add7c9.yaml" -- !include 'Custom_Model_Bag Seeker d99b16/Card Farsight (4) b4121c.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Abigail Foreman (4) b63277.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Grisly Totem (3) b722cd.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Deciphered Reality (5) b98ff6.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Segment of Onyx (1) bc498d.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Glimpse the Unthinkable (5) bdbca5.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Seeking Answers (2) c1365d.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Scroll of Secrets (3) cffeb0.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Expose Weakness (3) d391c7.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Encyclopedia (2) d86b0d.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Deduction (2) e0721f.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Extensive Research (1) e07aab.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Hyperawareness (2) e4ceae.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Esoteric Atlas (1) e50ca0.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Forewarned (1) f22453.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Library Docent (1) fab3a9.yaml' -- !include 'Custom_Model_Bag Seeker d99b16/Card Truth from Fiction (2) fd3cda.yaml' -CustomMesh: - CastShadows: true - ColliderURL: '' - Convex: true - CustomShader: - FresnelStrength: 0.0 - SpecularColor: - b: 1.0 - g: 1.0 - r: 1.0 - SpecularIntensity: 0.0 - SpecularSharpness: 2.0 - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722516265983/F50A6212D30C442429ED22B8CC8FD24D4CB76A2A/ - MaterialIndex: 3 - MeshURL: https://pastebin.com/raw/ALrYhQGb - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: d99b16 -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: !include 'Custom_Model_Bag Seeker d99b16.ttslua' -LuaScriptState: '{"ml":{"037da2":{"lock":false,"pos":{"x":7.0765,"y":1.3194,"z":-77.26},"rot":{"x":0.0208,"y":270.0044,"z":0.0168}},"0d3413":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30038166046143,"z":-54.3084373474121},"rot":{"x":0.0208135452121496,"y":269.984130859375,"z":0.0167649015784264}},"0d3d1a":{"lock":false,"pos":{"x":58.0996589660645,"y":1.31018245220184,"z":-47.4709777832031},"rot":{"x":0.0208096764981747,"y":269.99560546875,"z":0.0167697537690401}},"0d88ac":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29970848560333,"z":-56.6084403991699},"rot":{"x":0.020813662558794,"y":269.984130859375,"z":0.0167651195079088}},"117137":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29699695110321,"z":-70.4198684692383},"rot":{"x":0.0208062455058098,"y":270.01171875,"z":0.0167758595198393}},"15a1bb":{"lock":false,"pos":{"x":52.944206237793,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208074115216732,"y":270.002258300781,"z":0.0167705472558737}},"1a1b58":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29499566555023,"z":-72.7083969116211},"rot":{"x":0.0208062380552292,"y":270.01123046875,"z":0.0167753864079714}},"2172e2":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565048217773,"z":-75.0199966430664},"rot":{"x":0.0208058170974255,"y":270.01123046875,"z":0.016775343567133}},"22c4b1":{"lock":false,"pos":{"x":40.2742691040039,"y":1.3133761882782,"z":-88.8093566894531},"rot":{"x":0.0208147652447224,"y":269.984893798828,"z":0.0167664028704166}},"26d70e":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208047293126583,"y":270.015655517578,"z":0.0167774185538292}},"300569":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29364931583405,"z":-77.3083267211914},"rot":{"x":0.0208061747252941,"y":270.005340576172,"z":0.0167729835957289}},"344e90":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208056177943945,"y":270.011260986328,"z":0.0167746227234602}},"3469e0":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30024600028992,"z":-75.0203399658203},"rot":{"x":0.020807784050703,"y":270.002197265625,"z":0.0167698990553617}},"367e5c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.31868195533752,"z":-49.7084617614746},"rot":{"x":0.0208057407289743,"y":270.011169433594,"z":0.0167744066566229}},"384258":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29836189746857,"z":-61.2084465026855},"rot":{"x":0.0208135508000851,"y":269.983917236328,"z":0.0167649332433939}},"3c0d81":{"lock":false,"pos":{"x":10.6138734817505,"y":1.31733238697052,"z":-88.7451629638672},"rot":{"x":0.0208089593797922,"y":269.999938964844,"z":0.0167716406285763}},"404410":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30159246921539,"z":-70.4202117919922},"rot":{"x":0.0208075251430273,"y":270.002349853516,"z":0.016770638525486}},"423ea2":{"lock":false,"pos":{"x":52.944206237793,"y":1.29957270622253,"z":-77.3202438354492},"rot":{"x":0.020808532834053,"y":270,"z":0.016769191250205}},"488fab":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170965194702,"z":-54.3199996948242},"rot":{"x":0.0208086092025042,"y":269.999694824219,"z":0.0167709644883871}},"4a29bd":{"lock":false,"pos":{"x":36.6243362426758,"y":1.32090437412262,"z":-75.0084228515625},"rot":{"x":0.0208107065409422,"y":269.999481201172,"z":0.016771649941802}},"53eaa9":{"lock":false,"pos":{"x":7.07654333114624,"y":1.32277584075928,"z":-65.7601165771484},"rot":{"x":0.0208094976842403,"y":269.999755859375,"z":0.0167715046554804}},"552689":{"lock":false,"pos":{"x":58.099666595459,"y":1.30816280841827,"z":-54.3709716796875},"rot":{"x":0.0208169873803854,"y":269.970977783203,"z":0.0167606212198734}},"562c05":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363131523132,"z":-81.9201202392578},"rot":{"x":0.0208061765879393,"y":270.011352539063,"z":0.0167755149304867}},"5bdc77":{"lock":false,"pos":{"x":7.07654094696045,"y":1.32210242748261,"z":-68.0601196289063},"rot":{"x":0.020809318870306,"y":269.999877929688,"z":0.0167716238647699}},"5d4212":{"lock":false,"pos":{"x":40.2899627685547,"y":1.29295742511749,"z":-84.2198867797852},"rot":{"x":0.0208051223307848,"y":270.011291503906,"z":0.0167752541601658}},"5f8011":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.0208057668060064,"y":270.011474609375,"z":0.0167762991040945}},"6465d8":{"lock":false,"pos":{"x":40.2741088867188,"y":1.31270098686218,"z":-91.1157989501953},"rot":{"x":0.0208196602761745,"y":269.968811035156,"z":0.0167605970054865}},"659f2d":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30240142345428,"z":-47.4084358215332},"rot":{"x":0.020813575014472,"y":269.984313964844,"z":0.016765259206295}},"683123":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208087358623743,"y":269.99951171875,"z":0.0167709458619356}},"6e4d54":{"lock":false,"pos":{"x":52.9442253112793,"y":1.3063051700592,"z":-54.3203315734863},"rot":{"x":0.0208052564412355,"y":270.011291503906,"z":0.0167751219123602}},"6f6976":{"lock":false,"pos":{"x":52.9441184997559,"y":1.29755294322968,"z":-84.2202377319336},"rot":{"x":0.0208085421472788,"y":270.000122070313,"z":0.016769165173173}},"6fab5a":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29701554775238,"z":-65.8083038330078},"rot":{"x":0.0208097118884325,"y":269.999664306641,"z":0.0167714897543192}},"73255e":{"lock":false,"pos":{"x":36.6243476867676,"y":1.31935524940491,"z":-47.4084320068359},"rot":{"x":0.0208136457949877,"y":269.984313964844,"z":0.0167664084583521}},"7337c1":{"lock":false,"pos":{"x":36.6243324279785,"y":1.296342253685,"z":-68.1083145141602},"rot":{"x":0.0208085253834724,"y":269.999725341797,"z":0.0167711153626442}},"791d5f":{"lock":false,"pos":{"x":52.9462432861328,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.0208083353936672,"y":270.000305175781,"z":0.0167693682014942}},"7b5a65":{"lock":false,"pos":{"x":36.6243362426758,"y":1.31811010837555,"z":-68.1082992553711},"rot":{"x":0.0208076350390911,"y":269.999572753906,"z":0.0167704727500677}},"8343e5":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036318302155,"z":-58.9200057983398},"rot":{"x":0.0208086185157299,"y":269.999542236328,"z":0.0167709663510323}},"854c79":{"lock":false,"pos":{"x":40.2900886535645,"y":1.29228413105011,"z":-86.5199127197266},"rot":{"x":0.0208059661090374,"y":270.01123046875,"z":0.0167757142335176}},"86d109":{"lock":false,"pos":{"x":40.2900543212891,"y":1.2976701259613,"z":-68.1198577880859},"rot":{"x":0.0208084471523762,"y":269.998718261719,"z":0.0167706422507763}},"870bdc":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495870113373,"z":-58.9203491210938},"rot":{"x":0.0208055749535561,"y":270.011169433594,"z":0.0167747605592012}},"8b1863":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372941493988,"z":-47.4200057983398},"rot":{"x":0.0208084397017956,"y":269.999847412109,"z":0.016770888119936}},"8c4d07":{"lock":false,"pos":{"x":52.944206237793,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208080857992172,"y":270.002349853516,"z":0.0167721528559923}},"8cdfc7":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901671409607,"z":-63.5200119018555},"rot":{"x":0.020808594301343,"y":269.999420166016,"z":0.0167709793895483}},"90e0af":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208087228238583,"y":269.999603271484,"z":0.016771050170064}},"96b5ed":{"lock":false,"pos":{"x":58.099666595459,"y":1.30883598327637,"z":-52.0709648132324},"rot":{"x":0.0208051018416882,"y":270.011260986328,"z":0.0167749132961035}},"96ba38":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29297602176666,"z":-79.6082916259766},"rot":{"x":0.0208080112934113,"y":270.005249023438,"z":0.0167735610157251}},"96ec75":{"lock":false,"pos":{"x":7.07653141021729,"y":1.32075607776642,"z":-72.6601257324219},"rot":{"x":0.020809406414628,"y":269.999755859375,"z":0.0167715381830931}},"97ed44":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208086092025042,"y":269.999694824219,"z":0.0167712606489658}},"9b1c5b":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30361223220825,"z":-63.5203552246094},"rot":{"x":0.020805174484849,"y":270.011199951172,"z":0.0167740415781736}},"a641de":{"lock":false,"pos":{"x":52.9282684326172,"y":1.2955287694931,"z":-91.1161422729492},"rot":{"x":0.0208085980266333,"y":270.000122070313,"z":0.0167691260576248}},"a781f4":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495882034302,"z":-58.9203491210938},"rot":{"x":0.0208078641444445,"y":270.002197265625,"z":0.0167722031474113}},"add7c9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208085626363754,"y":269.999786376953,"z":0.0167709924280643}},"afb8cf":{"lock":false,"pos":{"x":40.6758728027344,"y":1.32536602020264,"z":-52.0128517150879},"rot":{"x":0.0208085291087627,"y":270.000427246094,"z":0.0167702343314886}},"b4121c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29566895961761,"z":-70.4083099365234},"rot":{"x":0.0208063498139381,"y":270.01123046875,"z":0.0167755018919706}},"b63277":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29768872261047,"z":-63.5084495544434},"rot":{"x":0.0208085030317307,"y":269.999694824219,"z":0.0167699977755547}},"b722cd":{"lock":false,"pos":{"x":36.6243362426758,"y":1.30105495452881,"z":-52.0084266662598},"rot":{"x":0.0208131112158298,"y":269.984252929688,"z":0.016765184700489}},"b92e9b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29566895961761,"z":-70.408317565918},"rot":{"x":0.020808594301343,"y":269.999633789063,"z":0.0167710985988379}},"b98ff6":{"lock":false,"pos":{"x":52.9442443847656,"y":1.29687976837158,"z":-86.5202560424805},"rot":{"x":0.0208053644746542,"y":270.009521484375,"z":0.0167733896523714}},"bc498d":{"lock":false,"pos":{"x":40.2900581359863,"y":1.29834342002869,"z":-65.8198547363281},"rot":{"x":0.0208087749779224,"y":269.999450683594,"z":0.0167711395770311}},"bc868c":{"lock":false,"pos":{"x":7.07651281356812,"y":1.32008278369904,"z":-74.9601593017578},"rot":{"x":0.0208091288805008,"y":269.999481201172,"z":0.0167714580893517}},"bdbca5":{"lock":false,"pos":{"x":52.9284248352051,"y":1.29620397090912,"z":-88.809700012207},"rot":{"x":0.0208044350147247,"y":270.013305664063,"z":0.0167760346084833}},"be04d4":{"lock":false,"pos":{"x":40.2900390625,"y":1.29632365703583,"z":-72.7199935913086},"rot":{"x":0.0208050403743982,"y":270.011474609375,"z":0.0167753025889397}},"c1365d":{"lock":false,"pos":{"x":52.944206237793,"y":1.30226576328278,"z":-68.1202087402344},"rot":{"x":0.0208051148802042,"y":270.01123046875,"z":0.0167738441377878}},"c4e958":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208078399300575,"y":270.002197265625,"z":0.0167719554156065}},"c8716d":{"lock":false,"pos":{"x":7.07653570175171,"y":1.3214293718338,"z":-70.3601226806641},"rot":{"x":0.0208090115338564,"y":269.999664306641,"z":0.0167711675167084}},"cffeb0":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29903519153595,"z":-58.9084434509277},"rot":{"x":0.0208135731518269,"y":269.984008789063,"z":0.0167648307979107}},"d391c7":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208081752061844,"y":270.000061035156,"z":0.0167700406163931}},"d5605f":{"lock":false,"pos":{"x":40.6758728027344,"y":1.32603931427002,"z":-49.7128486633301},"rot":{"x":0.0208086594939232,"y":269.999816894531,"z":0.0167700685560703}},"d86b0d":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29632353782654,"z":-72.7199859619141},"rot":{"x":0.0208059288561344,"y":270.011627197266,"z":0.0167759340256453}},"dadcc3":{"lock":false,"pos":{"x":52.9442138671875,"y":1.3063051700592,"z":-54.3203430175781},"rot":{"x":0.0208133850246668,"y":269.984008789063,"z":0.0167653672397137}},"ddaded":{"lock":false,"pos":{"x":19.3437099456787,"y":1.29451763629913,"z":-56.5678901672363},"rot":{"x":0.0208087582141161,"y":269.999481201172,"z":0.016770189628005}},"dde850":{"lock":false,"pos":{"x":7.07655096054077,"y":1.32816159725189,"z":-47.3604888916016},"rot":{"x":0.0208085924386978,"y":270.000396728516,"z":0.0167710743844509}},"e0721f":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30950927734375,"z":-49.7709655761719},"rot":{"x":0.0208086743950844,"y":269.999755859375,"z":0.0167709551751614}},"e07aab":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208041667938232,"y":270.014984130859,"z":0.0167763959616423}},"e4ceae":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208061467856169,"y":270.011444091797,"z":0.0167754273861647}},"e50ca0":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208086743950844,"y":269.999755859375,"z":0.0167708694934845}},"e87c2d":{"lock":false,"pos":{"x":7.07654714584351,"y":1.3274884223938,"z":-49.6604766845703},"rot":{"x":0.020808594301343,"y":270.00048828125,"z":0.0167711768299341}},"e99f0d":{"lock":false,"pos":{"x":52.9442176818848,"y":1.30563187599182,"z":-56.6203422546387},"rot":{"x":0.0208089593797922,"y":269.998962402344,"z":0.0167701579630375}},"eaafcf":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29364931583405,"z":-77.3083343505859},"rot":{"x":0.0208131372928619,"y":269.984069824219,"z":0.0167653374373913}},"ebf4c0":{"lock":false,"pos":{"x":7.07653713226318,"y":1.32344889640808,"z":-63.4604873657227},"rot":{"x":0.0208090376108885,"y":269.999877929688,"z":0.0167712233960629}},"ef2ecd":{"lock":false,"pos":{"x":10.6296834945679,"y":1.31801056861877,"z":-86.4480361938477},"rot":{"x":0.020808607339859,"y":269.999816894531,"z":0.0167710799723864}},"f22453":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30697846412659,"z":-52.0203399658203},"rot":{"x":0.0208084303885698,"y":269.999755859375,"z":0.0167709495872259}},"f75ae4":{"lock":false,"pos":{"x":7.07651996612549,"y":1.31940948963165,"z":-77.2600555419922},"rot":{"x":0.0208091493695974,"y":269.999969482422,"z":0.0167716313153505}},"f86ed0":{"lock":false,"pos":{"x":7.07654428482056,"y":1.32681512832642,"z":-51.9604797363281},"rot":{"x":0.020808408036828,"y":270.000427246094,"z":0.0167713183909655}},"f99e05":{"lock":false,"pos":{"x":44.2130165100098,"y":1.31039607524872,"z":-91.0974273681641},"rot":{"x":0.0208132099360228,"y":269.984924316406,"z":0.0167646240442991}},"fab3a9":{"lock":false,"pos":{"x":40.2900657653809,"y":1.30103635787964,"z":-56.6199951171875},"rot":{"x":0.0208053700625896,"y":270.01123046875,"z":0.0167752765119076}},"fbd97e":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30563187599182,"z":-56.6203460693359},"rot":{"x":0.0208078734576702,"y":270.002197265625,"z":0.0167717821896076}},"fc5406":{"lock":false,"pos":{"x":10.6137104034424,"y":1.3166606426239,"z":-91.0400085449219},"rot":{"x":0.0208087395876646,"y":269.999816894531,"z":0.0167708862572908}},"fc790a":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30883586406708,"z":-52.0709686279297},"rot":{"x":0.0208129156380892,"y":269.984436035156,"z":0.016765596345067}},"fd1c20":{"lock":false,"pos":{"x":40.6758651733398,"y":1.32132661342621,"z":-65.8127288818359},"rot":{"x":0.0208073426038027,"y":270.004455566406,"z":0.0167714562267065}},"fd3cda":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208078119903803,"y":270.002380371094,"z":0.01677006483078}},"ff2be9":{"lock":false,"pos":{"x":40.6758651733398,"y":1.32681381702423,"z":-63.5128746032715},"rot":{"x":0.0208086092025042,"y":269.999969482422,"z":0.0167697928845882}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Seeker -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 66.3 - posY: 1.66 - posZ: -69.36 - rotX: 0.02 - rotY: 270.02 - rotZ: 0.02 - scaleX: 1.2 - scaleY: 1.2 - scaleZ: 1.2 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Starter Deck Investigators 35fb9c.ttslua b/unpacked/Custom_Model_Bag Starter Deck Investigators 35fb9c.ttslua index 1fb1508eb..39c42d572 100644 --- a/unpacked/Custom_Model_Bag Starter Deck Investigators 35fb9c.ttslua +++ b/unpacked/Custom_Model_Bag Starter Deck Investigators 35fb9c.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor +12 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=800, width=800, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor +12 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=800, width=800, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Survivor 9c814b.ttslua b/unpacked/Custom_Model_Bag Survivor 9c814b.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Survivor 9c814b.ttslua +++ b/unpacked/Custom_Model_Bag Survivor 9c814b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Survivor 9c814b/Custom_Model_Bag Survivor 3c40d9.ttslua b/unpacked/Custom_Model_Bag Survivor 9c814b/Custom_Model_Bag Survivor 3c40d9.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Survivor 9c814b/Custom_Model_Bag Survivor 3c40d9.ttslua +++ b/unpacked/Custom_Model_Bag Survivor 9c814b/Custom_Model_Bag Survivor 3c40d9.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Survivor c02830.ttslua b/unpacked/Custom_Model_Bag Survivor c02830.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830.ttslua +++ b/unpacked/Custom_Model_Bag Survivor c02830.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Survivor c02830.yaml b/unpacked/Custom_Model_Bag Survivor c02830.yaml index 74a1b77a0..1beeb2291 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830.yaml @@ -4,8 +4,9 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1.yaml' -- !include 'Custom_Model_Bag Survivor c02830/Card Ancient Covenant (2) 840ba5.yaml' +- !include 'Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.yaml' +- !include 'Custom_Model_Bag Survivor c02830/Card Third Time''s a Charm (2) 45956a.yaml' +- !include 'Custom_Model_Bag Survivor c02830/Card Butterfly Effect (1) 22fc6c.yaml' - !include 'Custom_Model_Bag Survivor c02830/Card Lucky! (2) 002455.yaml' - !include 'Custom_Model_Bag Survivor c02830/Card Rabbit''s Foot (3) 00c4cc.yaml' - !include 'Custom_Model_Bag Survivor c02830/Card Lucky! (3) 04d33d.yaml' @@ -40,6 +41,7 @@ ContainedObjects: - !include 'Custom_Model_Bag Survivor c02830/Card A Test of Will (2) 71a760.yaml' - !include 'Custom_Model_Bag Survivor c02830/Card Lure (1) 76b07c.yaml' - !include 'Custom_Model_Bag Survivor c02830/Card Brute Force (1) 7fe153.yaml' +- !include 'Custom_Model_Bag Survivor c02830/Card Ancient Covenant (2) 840ba5.yaml' - !include 'Custom_Model_Bag Survivor c02830/Card Tennessee Sour Mash (3) 8cdf20.yaml' - !include 'Custom_Model_Bag Survivor c02830/Card Flare (1) 910b12.yaml' - !include 'Custom_Model_Bag Survivor c02830/Card Oops! (2) 9869ee.yaml' @@ -98,7 +100,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: true LuaScript: !include 'Custom_Model_Bag Survivor c02830.ttslua' -LuaScriptState: '{"ml":{"002455":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30024600028992,"z":-75.0203552246094},"rot":{"x":0.0208087377250195,"y":269.998962402344,"z":0.0167707335203886}},"00c4cc":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29768872261047,"z":-63.5084533691406},"rot":{"x":0.0208098404109478,"y":269.997497558594,"z":0.016770463436842}},"04d33d":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30699706077576,"z":-47.4087867736816},"rot":{"x":0.0208086892962456,"y":270.000030517578,"z":0.0167711563408375}},"08b398":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208114981651306,"y":269.98974609375,"z":0.0167670976370573}},"0b9f53":{"lock":false,"pos":{"x":58.0996475219727,"y":1.30614304542542,"z":-61.2709846496582},"rot":{"x":0.0208085458725691,"y":269.999694824219,"z":0.0167710296809673}},"0c433b":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202239990234},"rot":{"x":0.0208086371421814,"y":270.000030517578,"z":0.016771262511611}},"13ae70":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208115708082914,"y":269.989868164063,"z":0.0167673621326685}},"16fea1":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208087936043739,"y":269.999603271484,"z":0.0167708788067102}},"1c3b8f":{"lock":false,"pos":{"x":58.0996627807617,"y":1.30748951435089,"z":-56.6709785461426},"rot":{"x":0.020807359367609,"y":270.004180908203,"z":0.0167726185172796}},"1c8915":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30038166046143,"z":-54.3084411621094},"rot":{"x":0.0208095237612724,"y":269.99755859375,"z":0.0167698338627815}},"234fae":{"lock":false,"pos":{"x":52.9462356567383,"y":1.2982269525528,"z":-81.9204711914063},"rot":{"x":0.0208088215440512,"y":269.998840332031,"z":0.0167707167565823}},"2a37f3":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208114571869373,"y":269.989624023438,"z":0.0167673993855715}},"2d9585":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208088401705027,"y":269.999206542969,"z":0.0167708750814199}},"2ebdf1":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29903519153595,"z":-58.908447265625},"rot":{"x":0.0208094660192728,"y":269.99755859375,"z":0.0167699158191681}},"35bbe8":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29767024517059,"z":-68.1198654174805},"rot":{"x":0.0208115205168724,"y":269.989562988281,"z":0.0167673267424107}},"36bc5b":{"lock":false,"pos":{"x":52.9282608032227,"y":1.2955287694931,"z":-91.1161575317383},"rot":{"x":0.0208084732294083,"y":269.999633789063,"z":0.0167712103575468}},"382580":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29499578475952,"z":-72.7083969116211},"rot":{"x":0.0208095014095306,"y":269.999969482422,"z":0.0167717542499304}},"38374c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208087284117937,"y":269.999542236328,"z":0.0167710017412901}},"3ab577":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202239990234},"rot":{"x":0.0208093635737896,"y":269.999176025391,"z":0.016770888119936}},"3bbc0b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29432249069214,"z":-75.0084228515625},"rot":{"x":0.0208091791719198,"y":269.999938964844,"z":0.0167716573923826}},"48db58":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30603182315826,"z":-58.9203453063965},"rot":{"x":0.0208088085055351,"y":269.999847412109,"z":0.016771923750639}},"4a5655":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30105495452881,"z":-52.008430480957},"rot":{"x":0.0208092387765646,"y":269.997589111328,"z":0.0167698096483946}},"4d9a97":{"lock":false,"pos":{"x":58.0999031066895,"y":1.30883610248566,"z":-52.0709953308105},"rot":{"x":0.0208061747252941,"y":270.007598876953,"z":0.016773933544755}},"5010c5":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30159258842468,"z":-70.4202270507813},"rot":{"x":0.0208089761435986,"y":269.999145507813,"z":0.0167708490043879}},"50acc5":{"lock":false,"pos":{"x":52.9442405700684,"y":1.29687988758087,"z":-86.5202713012695},"rot":{"x":0.02080855704844,"y":269.999603271484,"z":0.0167709235101938}},"53d6d9":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30681622028351,"z":-58.9709815979004},"rot":{"x":0.0208087116479874,"y":270.000030517578,"z":0.0167711973190308}},"584914":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.020808594301343,"y":270.002471923828,"z":0.016772435978055}},"59f3e4":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208088699728251,"y":269.99951171875,"z":0.0167704820632935}},"5a1991":{"lock":false,"pos":{"x":52.9441108703613,"y":1.29755306243896,"z":-84.2202453613281},"rot":{"x":0.0208085756748915,"y":269.999542236328,"z":0.0167709924280643}},"5a2b49":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208086054772139,"y":270.000030517578,"z":0.0167711935937405}},"5b1550":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208084508776665,"y":270.000030517578,"z":0.0167710985988379}},"5d45c1":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30091917514801,"z":-72.720344543457},"rot":{"x":0.0208091028034687,"y":269.999084472656,"z":0.0167713742703199}},"61d1e5":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293893814087,"z":-65.8202209472656},"rot":{"x":0.0208087377250195,"y":269.999328613281,"z":0.0167709514498711}},"630d65":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372941493988,"z":-47.4200057983398},"rot":{"x":0.0208113826811314,"y":269.990051269531,"z":0.0167675483971834}},"673d14":{"lock":false,"pos":{"x":36.624340057373,"y":1.2956690788269,"z":-70.4083023071289},"rot":{"x":0.0208085179328918,"y":269.999603271484,"z":0.0167693328112364}},"6842aa":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208088755607605,"y":269.999450683594,"z":0.0167711451649666}},"6a04c3":{"lock":false,"pos":{"x":49.2784957885742,"y":1.30565059185028,"z":-52.0087699890137},"rot":{"x":0.0208085309714079,"y":269.999603271484,"z":0.0167712643742561}},"6a8a9f":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30632376670837,"z":-49.708812713623},"rot":{"x":0.0208087284117937,"y":269.999603271484,"z":0.0167709682136774}},"719a45":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29364931583405,"z":-77.3083343505859},"rot":{"x":0.0208092629909515,"y":269.999938964844,"z":0.0167714338749647}},"71a760":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428552627563,"z":-61.2203559875488},"rot":{"x":0.0208085887134075,"y":270.000030517578,"z":0.0167711041867733}},"76b07c":{"lock":false,"pos":{"x":52.944221496582,"y":1.30563199520111,"z":-56.6203422546387},"rot":{"x":0.0208089537918568,"y":269.999206542969,"z":0.016771087422967}},"7fe153":{"lock":false,"pos":{"x":58.0992050170898,"y":1.3101909160614,"z":-47.4415969848633},"rot":{"x":0.0208058785647154,"y":270.0087890625,"z":0.0167742799967527}},"812c4f":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30699694156647,"z":-47.4087867736816},"rot":{"x":0.0208085775375366,"y":269.999603271484,"z":0.0167708434164524}},"840ba5":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208075344562531,"y":270.002410888672,"z":0.0167711600661278}},"8cdf20":{"lock":false,"pos":{"x":36.6243324279785,"y":1.296342253685,"z":-68.1083068847656},"rot":{"x":0.0208101067692041,"y":269.997406005859,"z":0.0167707335203886}},"910b12":{"lock":false,"pos":{"x":52.9442367553711,"y":1.30630528926849,"z":-54.3201904296875},"rot":{"x":0.0208089295774698,"y":269.998748779297,"z":0.0167708694934845}},"9869ee":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208089202642441,"y":269.998901367188,"z":0.0167705956846476}},"9d09f0":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170965194702,"z":-54.3199996948242},"rot":{"x":0.0208116974681616,"y":269.989898681641,"z":0.0167674422264099}},"9dcdd3":{"lock":false,"pos":{"x":52.9284210205078,"y":1.29620397090912,"z":-88.8097152709961},"rot":{"x":0.0208088122308254,"y":269.999633789063,"z":0.0167708937078714}},"9e4e11":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765175819397,"z":-49.7203407287598},"rot":{"x":0.0208089649677277,"y":269.999176025391,"z":0.0167708229273558}},"9f9e58":{"lock":false,"pos":{"x":40.2900543212891,"y":1.29699695110321,"z":-70.4198837280273},"rot":{"x":0.0208116229623556,"y":269.989562988281,"z":0.0167674217373133}},"a06013":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430401325226,"z":-79.6199035644531},"rot":{"x":0.0208080913871527,"y":270.002746582031,"z":0.0167726464569569}},"a177db":{"lock":false,"pos":{"x":36.6243476867676,"y":1.29499578475952,"z":-72.708381652832},"rot":{"x":0.0208084397017956,"y":269.999450683594,"z":0.0167704783380032}},"a1c47b":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036318302155,"z":-58.9200057983398},"rot":{"x":0.0208115000277758,"y":269.989807128906,"z":0.0167676471173763}},"a4e44a":{"lock":false,"pos":{"x":40.2900352478027,"y":1.29632365703583,"z":-72.7199935913086},"rot":{"x":0.0208078436553478,"y":270.0029296875,"z":0.0167722515761852}},"a5fc16":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208084397017956,"y":270.002807617188,"z":0.0167725309729576}},"ac7db0":{"lock":false,"pos":{"x":49.278678894043,"y":1.30497074127197,"z":-54.3310775756836},"rot":{"x":0.0208088811486959,"y":269.999603271484,"z":0.0167709235101938}},"ad0934":{"lock":false,"pos":{"x":52.9441986083984,"y":1.29957282543182,"z":-77.3202590942383},"rot":{"x":0.0208087749779224,"y":269.998901367188,"z":0.0167706478387117}},"ad6d9d":{"lock":false,"pos":{"x":52.944206237793,"y":1.3069783449173,"z":-52.0203437805176},"rot":{"x":0.0208086390048265,"y":269.999206542969,"z":0.0167708676308393}},"b09d6f":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208085756748915,"y":270.002624511719,"z":0.0167724676430225}},"b337ac":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.0208115763962269,"y":269.989685058594,"z":0.016767306253314}},"b633d0":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30361223220825,"z":-63.5203590393066},"rot":{"x":0.0208089519292116,"y":269.999328613281,"z":0.0167708806693554}},"b8f774":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29566895961761,"z":-70.4083099365234},"rot":{"x":0.0208102352917194,"y":269.997406005859,"z":0.0167706869542599}},"bce471":{"lock":false,"pos":{"x":58.0996742248535,"y":1.30816268920898,"z":-54.3709678649902},"rot":{"x":0.020808732137084,"y":269.999694824219,"z":0.0167711079120636}},"bf6a7b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208091959357262,"y":269.99755859375,"z":0.0167701914906502}},"c490a4":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208091475069523,"y":269.99755859375,"z":0.0167699493467808}},"c6c157":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29701554775238,"z":-65.8083038330078},"rot":{"x":0.0208098944276571,"y":269.997497558594,"z":0.0167707651853561}},"cda2e6":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093313217163,"z":-91.1157989501953},"rot":{"x":0.0208086892962456,"y":270.002349853516,"z":0.0167723298072815}},"ce1a7d":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29836189746857,"z":-61.2084503173828},"rot":{"x":0.0208095051348209,"y":269.99755859375,"z":0.016769902780652}},"d88560":{"lock":false,"pos":{"x":36.6243324279785,"y":1.3017281293869,"z":-49.7084655761719},"rot":{"x":0.0208086892962456,"y":270,"z":0.0167710967361927}},"dd0b79":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3023829460144,"z":-52.0199966430664},"rot":{"x":0.020811403170228,"y":269.989929199219,"z":0.0167674422264099}},"e64769":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363143444061,"z":-81.9201202392578},"rot":{"x":0.020808570086956,"y":270.002807617188,"z":0.0167725831270218}},"ea2337":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208093393594027,"y":270.000732421875,"z":0.0167717821896076}},"ea8324":{"lock":false,"pos":{"x":58.0999031066895,"y":1.30950927734375,"z":-49.77099609375},"rot":{"x":0.0208029132336378,"y":270.018493652344,"z":0.0167780052870512}},"ecc3b9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208113957196474,"y":269.989990234375,"z":0.0167671646922827}},"f69d7d":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29970848560333,"z":-56.6084442138672},"rot":{"x":0.0208094641566277,"y":269.99755859375,"z":0.0167699847370386}},"f8a977":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29632377624512,"z":-72.719970703125},"rot":{"x":0.0208085272461176,"y":270.000061035156,"z":0.0167713537812233}},"f8e50b":{"lock":false,"pos":{"x":44.2288818359375,"y":1.29546678066254,"z":-84.2006301879883},"rot":{"x":0.0208089891821146,"y":269.999816894531,"z":0.0167717114090919}},"fd393b":{"lock":false,"pos":{"x":52.9441909790039,"y":1.30091917514801,"z":-72.720344543457},"rot":{"x":0.0208085179328918,"y":270.000030517578,"z":0.0167713351547718}}}}' +LuaScriptState: '{"ml":{"002455":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202438354492},"rot":{"x":0.0208082124590874,"y":269.9990234375,"z":0.0167706627398729}},"00c4cc":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29768872261047,"z":-63.5084533691406},"rot":{"x":0.0208092592656612,"y":269.997497558594,"z":0.0167702659964561}},"04d33d":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30565047264099,"z":-52.0087776184082},"rot":{"x":0.0208087060600519,"y":270,"z":0.0167708285152912}},"08b398":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208114981651306,"y":269.98974609375,"z":0.0167670976370573}},"0b9f53":{"lock":false,"pos":{"x":58.0996475219727,"y":1.30614292621613,"z":-61.2709846496582},"rot":{"x":0.020808769389987,"y":269.999694824219,"z":0.0167711768299341}},"0c433b":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30159246921539,"z":-70.4202117919922},"rot":{"x":0.0208082273602486,"y":270.000091552734,"z":0.0167697127908468}},"13ae70":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208113119006157,"y":269.989868164063,"z":0.0167675241827965}},"16fea1":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208087936043739,"y":269.999603271484,"z":0.0167708788067102}},"1c3b8f":{"lock":false,"pos":{"x":58.0996627807617,"y":1.3074893951416,"z":-56.6709785461426},"rot":{"x":0.0208073779940605,"y":270.004180908203,"z":0.0167727936059237}},"1c8915":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30038166046143,"z":-54.3084411621094},"rot":{"x":0.0208091828972101,"y":269.99755859375,"z":0.0167703665792942}},"22fc6c":{"lock":false,"pos":{"x":52.944206237793,"y":1.3069783449173,"z":-52.0203475952148},"rot":{"x":0.0208088215440512,"y":269.999816894531,"z":0.0167719312012196}},"234fae":{"lock":false,"pos":{"x":52.9441146850586,"y":1.29755306243896,"z":-84.2202377319336},"rot":{"x":0.020808856934309,"y":269.998901367188,"z":0.0167707614600658}},"2a37f3":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.02081149071455,"y":269.989624023438,"z":0.0167672820389271}},"2d9585":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208086147904396,"y":269.999206542969,"z":0.0167709589004517}},"2ebdf1":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29903519153595,"z":-58.908447265625},"rot":{"x":0.0208093542605639,"y":269.99755859375,"z":0.0167703721672297}},"35bbe8":{"lock":false,"pos":{"x":40.2900466918945,"y":1.2976701259613,"z":-68.1198654174805},"rot":{"x":0.0208117887377739,"y":269.989562988281,"z":0.0167673155665398}},"36bc5b":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30632376670837,"z":-49.708812713623},"rot":{"x":0.0208087302744389,"y":269.999572753906,"z":0.0167705770581961}},"382580":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29499578475952,"z":-72.7083969116211},"rot":{"x":0.020808594301343,"y":269.999969482422,"z":0.0167711898684502}},"38374c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208087284117937,"y":269.999542236328,"z":0.0167710017412901}},"3ab577":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202239990234},"rot":{"x":0.0208093635737896,"y":269.999176025391,"z":0.016770888119936}},"3bbc0b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29432249069214,"z":-75.0084228515625},"rot":{"x":0.0208084862679243,"y":269.999938964844,"z":0.0167711600661278}},"45956a":{"lock":false,"pos":{"x":52.9441909790039,"y":1.29688251018524,"z":-86.511100769043},"rot":{"x":0.0208107065409422,"y":269.991607666016,"z":0.0167677439749241}},"48db58":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30603182315826,"z":-58.9203453063965},"rot":{"x":0.0208088085055351,"y":269.999847412109,"z":0.016771923750639}},"4a5655":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30105495452881,"z":-52.008430480957},"rot":{"x":0.0208092723041773,"y":269.997589111328,"z":0.0167703740298748}},"4d9a97":{"lock":false,"pos":{"x":58.0999031066895,"y":1.30883598327637,"z":-52.0709953308105},"rot":{"x":0.0208062250167131,"y":270.007598876953,"z":0.0167739596217871}},"5010c5":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208080783486366,"y":269.999206542969,"z":0.0167705751955509}},"50acc5":{"lock":false,"pos":{"x":52.9282608032227,"y":1.2955287694931,"z":-91.1161499023438},"rot":{"x":0.0208095107227564,"y":269.999603271484,"z":0.0167714096605778}},"53d6d9":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30681622028351,"z":-58.9709815979004},"rot":{"x":0.0208084899932146,"y":270.000030517578,"z":0.016771238297224}},"584914":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.0208080094307661,"y":270.002471923828,"z":0.0167720280587673}},"59f3e4":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208088699728251,"y":269.99951171875,"z":0.0167704820632935}},"5a1991":{"lock":false,"pos":{"x":52.9284210205078,"y":1.29620385169983,"z":-88.8097076416016},"rot":{"x":0.0208093617111444,"y":269.999542236328,"z":0.0167715195566416}},"5a2b49":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208084098994732,"y":270.000030517578,"z":0.0167712420225143}},"5b1550":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208085682243109,"y":270.000030517578,"z":0.0167711526155472}},"5d45c1":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30091917514801,"z":-72.720344543457},"rot":{"x":0.0208091028034687,"y":269.999084472656,"z":0.0167713742703199}},"61d1e5":{"lock":false,"pos":{"x":52.944206237793,"y":1.30226576328278,"z":-68.1202087402344},"rot":{"x":0.0208079684525728,"y":269.999359130859,"z":0.0167706459760666}},"630d65":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208113435655832,"y":269.990051269531,"z":0.0167675837874413}},"673d14":{"lock":false,"pos":{"x":36.624340057373,"y":1.2956690788269,"z":-70.4083023071289},"rot":{"x":0.0208085179328918,"y":269.999603271484,"z":0.0167693328112364}},"6842aa":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208090711385012,"y":269.999450683594,"z":0.0167706124484539}},"6a04c3":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30430400371552,"z":-56.6087913513184},"rot":{"x":0.0208087712526321,"y":269.999542236328,"z":0.0167706292122602}},"6a8a9f":{"lock":false,"pos":{"x":49.2784881591797,"y":1.3049772977829,"z":-54.3087882995605},"rot":{"x":0.0208089388906956,"y":269.999542236328,"z":0.0167707987129688}},"719a45":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29364931583405,"z":-77.3083343505859},"rot":{"x":0.0208084955811501,"y":269.999938964844,"z":0.0167710166424513}},"71a760":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30361223220825,"z":-63.5203552246094},"rot":{"x":0.0208085142076015,"y":270.000061035156,"z":0.0167700350284576}},"76b07c":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495870113373,"z":-58.9203491210938},"rot":{"x":0.0208092946559191,"y":269.999206542969,"z":0.0167703088372946}},"7fe153":{"lock":false,"pos":{"x":58.0992050170898,"y":1.31019079685211,"z":-47.4415969848633},"rot":{"x":0.0208058450371027,"y":270.0087890625,"z":0.0167744904756546}},"812c4f":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30699694156647,"z":-47.4087867736816},"rot":{"x":0.0208085775375366,"y":269.999603271484,"z":0.0167708434164524}},"840ba5":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208077691495419,"y":270.002410888672,"z":0.0167719721794128}},"8cdf20":{"lock":false,"pos":{"x":36.6243324279785,"y":1.296342253685,"z":-68.1083068847656},"rot":{"x":0.0208093766123056,"y":269.997406005859,"z":0.0167702957987785}},"910b12":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30563187599182,"z":-56.6203460693359},"rot":{"x":0.0208091922104359,"y":269.998718261719,"z":0.016770213842392}},"9869ee":{"lock":false,"pos":{"x":52.9462394714355,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.0208083167672157,"y":269.998962402344,"z":0.0167704615741968}},"9d09f0":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208116844296455,"y":269.989898681641,"z":0.0167674943804741}},"9dcdd3":{"lock":false,"pos":{"x":49.2784996032715,"y":1.30699694156647,"z":-47.4087791442871},"rot":{"x":0.0208087489008904,"y":269.999694824219,"z":0.0167717505246401}},"9e4e11":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208087507635355,"y":269.999176025391,"z":0.0167706254869699}},"9f9e58":{"lock":false,"pos":{"x":40.2900543212891,"y":1.29699695110321,"z":-70.4198837280273},"rot":{"x":0.0208116210997105,"y":269.989562988281,"z":0.0167675018310547}},"a06013":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.0208077616989613,"y":270.002746582031,"z":0.0167723596096039}},"a177db":{"lock":false,"pos":{"x":36.6243476867676,"y":1.29499578475952,"z":-72.708381652832},"rot":{"x":0.0208084397017956,"y":269.999450683594,"z":0.0167704783380032}},"a1c47b":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208115391433239,"y":269.989807128906,"z":0.0167676489800215}},"a4e44a":{"lock":false,"pos":{"x":40.2900352478027,"y":1.29632365703583,"z":-72.7199935913086},"rot":{"x":0.0208078436553478,"y":270.0029296875,"z":0.0167722515761852}},"a5fc16":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208078101277351,"y":270.002807617188,"z":0.016772173345089}},"ac7db0":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30363070964813,"z":-58.9087944030762},"rot":{"x":0.020808894187212,"y":269.999542236328,"z":0.0167707465589046}},"ad0934":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208081528544426,"y":269.998962402344,"z":0.0167704001069069}},"ad6d9d":{"lock":false,"pos":{"x":52.9442138671875,"y":1.3063051700592,"z":-54.3203430175781},"rot":{"x":0.0208091493695974,"y":269.999206542969,"z":0.0167703796178102}},"b09d6f":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.020807858556509,"y":270.002624511719,"z":0.0167722813785076}},"b337ac":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.0208114441484213,"y":269.989685058594,"z":0.0167674217373133}},"b633d0":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208086743950844,"y":269.999389648438,"z":0.0167689081281424}},"b8f774":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29566895961761,"z":-70.4083099365234},"rot":{"x":0.0208093896508217,"y":269.997406005859,"z":0.0167703647166491}},"bce471":{"lock":false,"pos":{"x":58.0996742248535,"y":1.30816268920898,"z":-54.3709678649902},"rot":{"x":0.0208085533231497,"y":269.999694824219,"z":0.0167711433023214}},"bf6a7b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208093002438545,"y":269.99755859375,"z":0.0167702157050371}},"c490a4":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208091475069523,"y":269.99755859375,"z":0.0167699493467808}},"c6c157":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29701554775238,"z":-65.8083038330078},"rot":{"x":0.0208092089742422,"y":269.997497558594,"z":0.0167703088372946}},"cda2e6":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093313217163,"z":-91.1157989501953},"rot":{"x":0.0208077486604452,"y":270.002349853516,"z":0.0167721193283796}},"ce1a7d":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29836189746857,"z":-61.2084503173828},"rot":{"x":0.0208094324916601,"y":269.99755859375,"z":0.016770277172327}},"d88560":{"lock":false,"pos":{"x":36.6243324279785,"y":1.3017281293869,"z":-49.7084655761719},"rot":{"x":0.0208084192126989,"y":270,"z":0.0167710538953543}},"dd0b79":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208115000277758,"y":269.989929199219,"z":0.0167675297707319}},"e64769":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363143444061,"z":-81.9201202392578},"rot":{"x":0.0208078771829605,"y":270.002807617188,"z":0.0167722050100565}},"ea2337":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208082906901836,"y":270.000732421875,"z":0.0167713817209005}},"ea8324":{"lock":false,"pos":{"x":58.0999031066895,"y":1.30950927734375,"z":-49.77099609375},"rot":{"x":0.020803265273571,"y":270.018493652344,"z":0.016778027638793}},"ecc3b9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208113957196474,"y":269.989990234375,"z":0.0167671646922827}},"f69d7d":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29970848560333,"z":-56.6084442138672},"rot":{"x":0.0208093095570803,"y":269.99755859375,"z":0.0167704410851002}},"f8a977":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29632365703583,"z":-72.719970703125},"rot":{"x":0.0208085738122463,"y":270.000061035156,"z":0.0167713612318039}},"f8e50b":{"lock":false,"pos":{"x":44.2288818359375,"y":1.29546678066254,"z":-84.2006301879883},"rot":{"x":0.0208089891821146,"y":269.999816894531,"z":0.0167717114090919}},"fd393b":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30024600028992,"z":-75.0203399658203},"rot":{"x":0.0208081156015396,"y":270.000061035156,"z":0.016769764944911}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card A Chance Encounter (2) 6842aa.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card A Chance Encounter (2) 6842aa.yaml index dc5555f8a..3d957463c 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card A Chance Encounter (2) 6842aa.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card A Chance Encounter (2) 6842aa.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -58.92 + posZ: -61.22 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card A Test of Will (2) 71a760.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card A Test of Will (2) 71a760.yaml index d71b580b6..18dd67153 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card A Test of Will (2) 71a760.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card A Test of Will (2) 71a760.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -61.22 + posZ: -63.52 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Against All Odds (2) b633d0.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Against All Odds (2) b633d0.yaml index 566b0590f..f13405b8a 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Against All Odds (2) b633d0.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Against All Odds (2) b633d0.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -63.52 + posZ: -65.82 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Alter Fate (3) 5a1991.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Alter Fate (3) 5a1991.yaml index 828c318e0..631491117 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Alter Fate (3) 5a1991.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Alter Fate (3) 5a1991.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.94 + posX: 52.93 posY: 1.3 - posZ: -84.22 + posZ: -88.81 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Bait and Switch (3) 50acc5.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Bait and Switch (3) 50acc5.yaml index c76e35e7f..3e807159e 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Bait and Switch (3) 50acc5.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Bait and Switch (3) 50acc5.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.94 + posX: 52.93 posY: 1.3 - posZ: -86.52 + posZ: -91.12 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Butterfly Effect (1) 22fc6c.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Butterfly Effect (1) 22fc6c.yaml new file mode 100644 index 000000000..39d45dadc --- /dev/null +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Butterfly Effect (1) 22fc6c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232108 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 22fc6c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Butterfly Effect (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 52.94 + posY: 1.31 + posZ: -52.02 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Close Call (2) 61d1e5.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Close Call (2) 61d1e5.yaml index aee6dad5f..5854cfd4e 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Close Call (2) 61d1e5.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Close Call (2) 61d1e5.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -65.82 + posZ: -68.12 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Devil's Luck (1) ad6d9d.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Devil's Luck (1) ad6d9d.yaml index 545ccaf04..237603d1a 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Devil's Luck (1) ad6d9d.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Devil's Luck (1) ad6d9d.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.31 - posZ: -52.02 + posZ: -54.32 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Dumb Luck (2) 0c433b.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Dumb Luck (2) 0c433b.yaml index 356d25878..55739ba08 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Dumb Luck (2) 0c433b.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Dumb Luck (2) 0c433b.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -68.12 + posZ: -70.42 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Eucatastrophe (3) 9dcdd3.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Eucatastrophe (3) 9dcdd3.yaml index 34140ee95..05967f2c2 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Eucatastrophe (3) 9dcdd3.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Eucatastrophe (3) 9dcdd3.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.93 - posY: 1.3 - posZ: -88.81 + posX: 49.28 + posY: 1.31 + posZ: -47.41 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Flare (1) 910b12.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Flare (1) 910b12.yaml index 13a4826ff..17a939c60 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Flare (1) 910b12.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Flare (1) 910b12.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.31 - posZ: -54.32 + posZ: -56.62 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Fortune or Fate (2) 5010c5.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Fortune or Fate (2) 5010c5.yaml index da5a76e66..f5a119ea9 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Fortune or Fate (2) 5010c5.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Fortune or Fate (2) 5010c5.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -70.42 + posZ: -72.72 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Infighting (3) 36bc5b.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Infighting (3) 36bc5b.yaml index 8383c0a77..fd3e95f73 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Infighting (3) 36bc5b.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Infighting (3) 36bc5b.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.93 - posY: 1.3 - posZ: -91.12 + posX: 49.28 + posY: 1.31 + posZ: -49.71 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Look what I found! (2) fd393b.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Look what I found! (2) fd393b.yaml index 599b07cbe..71a690416 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Look what I found! (2) fd393b.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Look what I found! (2) fd393b.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -72.72 + posZ: -75.02 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Lucky! (2) 002455.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Lucky! (2) 002455.yaml index 16bdfb1f9..8bd315487 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Lucky! (2) 002455.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Lucky! (2) 002455.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -75.02 + posZ: -77.32 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Lucky! (3) 04d33d.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Lucky! (3) 04d33d.yaml index 1e27df07c..56338ac12 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Lucky! (3) 04d33d.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Lucky! (3) 04d33d.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.28 posY: 1.31 - posZ: -47.41 + posZ: -52.01 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Lure (1) 76b07c.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Lure (1) 76b07c.yaml index 9a408f284..5721a1d71 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Lure (1) 76b07c.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Lure (1) 76b07c.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 52.94 - posY: 1.31 - posZ: -56.62 + posY: 1.3 + posZ: -58.92 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Lure (2) ad0934.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Lure (2) ad0934.yaml index 5a6d0c672..a78637999 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Lure (2) ad0934.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Lure (2) ad0934.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 52.94 posY: 1.3 - posZ: -77.32 + posZ: -79.62 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Nothing Left to Lose (3) 6a8a9f.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Nothing Left to Lose (3) 6a8a9f.yaml index f94fcb7ef..e2aa4751e 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Nothing Left to Lose (3) 6a8a9f.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Nothing Left to Lose (3) 6a8a9f.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 49.28 - posY: 1.31 - posZ: -49.71 + posY: 1.3 + posZ: -54.31 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Oops! (2) 9869ee.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Oops! (2) 9869ee.yaml index 136be8bae..0a4262a30 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Oops! (2) 9869ee.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Oops! (2) 9869ee.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.94 + posX: 52.95 posY: 1.3 - posZ: -79.62 + posZ: -81.92 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Snare Trap (2) 234fae.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Snare Trap (2) 234fae.yaml index 03c3dab92..341a0cb8f 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Snare Trap (2) 234fae.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Snare Trap (2) 234fae.yaml @@ -33,9 +33,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 52.95 + posX: 52.94 posY: 1.3 - posZ: -81.92 + posZ: -84.22 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Third Time's a Charm (2) 45956a.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Third Time's a Charm (2) 45956a.yaml new file mode 100644 index 000000000..9a5e4f326 --- /dev/null +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Third Time's a Charm (2) 45956a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232109 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 45956a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Third Time's a Charm (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 52.94 + posY: 1.3 + posZ: -86.51 + rotX: 0.02 + rotY: 269.99 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card True Survivor (3) 6a04c3.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card True Survivor (3) 6a04c3.yaml index c63b08bb9..d90b350f8 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card True Survivor (3) 6a04c3.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card True Survivor (3) 6a04c3.yaml @@ -34,8 +34,8 @@ Sticky: true Tooltip: true Transform: posX: 49.28 - posY: 1.31 - posZ: -52.01 + posY: 1.3 + posZ: -56.61 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Card Will to Survive (3) ac7db0.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Card Will to Survive (3) ac7db0.yaml index 38a032dd9..3d57781af 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Card Will to Survive (3) ac7db0.yaml +++ b/unpacked/Custom_Model_Bag Survivor c02830/Card Will to Survive (3) ac7db0.yaml @@ -35,7 +35,7 @@ Tooltip: true Transform: posX: 49.28 posY: 1.3 - posZ: -54.33 + posZ: -58.91 rotX: 0.02 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.ttslua b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.ttslua new file mode 100644 index 000000000..b25806e6f --- /dev/null +++ b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.ttslua @@ -0,0 +1,503 @@ +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.yaml new file mode 100644 index 000000000..cef3ca204 --- /dev/null +++ b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.yaml @@ -0,0 +1,121 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Third Time''s a Charm (2) 45956a.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Butterfly Effect (1) 22fc6c.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Lucky! (2) 002455.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Rabbit''s Foot (3) 00c4cc.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Lucky! (3) 04d33d.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Rise to the Occasion (3) 0b9f53.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Dumb Luck (2) 0c433b.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Guiding Spirit (1) 13ae70.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Survival Instinct (2) 1c3b8f.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Nightmare Bauble (3) 1c8915.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Snare Trap (2) 234fae.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Plucky (1) 2a37f3.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card A Test of Will (1) 2d9585.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card On Your Own (3) 2ebdf1.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Try and Try Again (1) 35bbe8.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Infighting (3) 36bc5b.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Chainsaw (4) 382580.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Quick Learner (4) 3bbc0b.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Grisly Totem (3) 4a5655.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Sharp Vision (1) 4d9a97.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Fortune or Fate (2) 5010c5.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Bait and Switch (3) 50acc5.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Unexpected Courage (2) 53d6d9.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Peter Sylvestre (2) 584914.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Alter Fate (3) 5a1991.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Cherished Keepsake (1) 5a2b49.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Leather Coat (1) 5b1550.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Close Call (2) 61d1e5.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Aquinnah (1) 630d65.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card A Chance Encounter (2) 6842aa.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card True Survivor (3) 6a04c3.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Nothing Left to Lose (3) 6a8a9f.yaml' +- !include "Custom_Model_Bag Survivor 6e9c37/Card D\xE9j\xE0 Vu (5) 719a45.yaml" +- !include 'Custom_Model_Bag Survivor 6e9c37/Card A Test of Will (2) 71a760.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Lure (1) 76b07c.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Brute Force (1) 7fe153.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Ancient Covenant (2) 840ba5.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Tennessee Sour Mash (3) 8cdf20.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Flare (1) 910b12.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Oops! (2) 9869ee.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Five of Pentacles (1) 9d09f0.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Eucatastrophe (3) 9dcdd3.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Alter Fate (1) 9e4e11.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Yaotl (1) 9f9e58.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Dig Deep (2) a06013.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Jessica Hyde (1) a1c47b.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Cornered (2) a5fc16.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Will to Survive (3) ac7db0.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Lure (2) ad0934.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Devil''s Luck (1) ad6d9d.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Lantern (2) b09d6f.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Miss Doyle (1) b337ac.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Against All Odds (2) b633d0.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Try and Try Again (3) b8f774.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Stroke of Luck (2) bce471.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Aquinnah (3) bf6a7b.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Scrapper (3) c6c157.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Scavenging (2) cda2e6.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card On Your Own (3) ce1a7d.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Granny Orne (3) d88560.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Fire Extinguisher (1) dd0b79.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Gravedigger''s Shovel (2) e64769.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Newspaper (2) ea2337.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Expeditious Retreat (1) ea8324.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Old Hunting Rifle (3) f69d7d.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card .18 Derringer (2) f8a977.yaml' +- !include 'Custom_Model_Bag Survivor 6e9c37/Card Look what I found! (2) fd393b.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515960460/F43F63452854B10B416FDF3BF9EF3068E6E68F26/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6e9c37 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Survivor 6e9c37.ttslua' +LuaScriptState: '{"ml":{"002455":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29957282543182,"z":-77.3202438354492},"rot":{"x":0.0208082124590874,"y":269.9990234375,"z":0.0167706627398729}},"00c4cc":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29768872261047,"z":-63.5084533691406},"rot":{"x":0.0208092592656612,"y":269.997497558594,"z":0.0167702659964561}},"04d33d":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30565047264099,"z":-52.0087776184082},"rot":{"x":0.0208087060600519,"y":270,"z":0.0167708285152912}},"08b398":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208114981651306,"y":269.98974609375,"z":0.0167670976370573}},"0b9f53":{"lock":false,"pos":{"x":58.0996475219727,"y":1.30614292621613,"z":-61.2709846496582},"rot":{"x":0.020808769389987,"y":269.999694824219,"z":0.0167711768299341}},"0c433b":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30159246921539,"z":-70.4202117919922},"rot":{"x":0.0208082273602486,"y":270.000091552734,"z":0.0167697127908468}},"13ae70":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208113119006157,"y":269.989868164063,"z":0.0167675241827965}},"16fea1":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208087936043739,"y":269.999603271484,"z":0.0167708788067102}},"1c3b8f":{"lock":false,"pos":{"x":58.0996627807617,"y":1.3074893951416,"z":-56.6709785461426},"rot":{"x":0.0208073779940605,"y":270.004180908203,"z":0.0167727936059237}},"1c8915":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30038166046143,"z":-54.3084411621094},"rot":{"x":0.0208091828972101,"y":269.99755859375,"z":0.0167703665792942}},"22fc6c":{"lock":false,"pos":{"x":52.944206237793,"y":1.3069783449173,"z":-52.0203475952148},"rot":{"x":0.0208088215440512,"y":269.999816894531,"z":0.0167719312012196}},"234fae":{"lock":false,"pos":{"x":52.9441146850586,"y":1.29755306243896,"z":-84.2202377319336},"rot":{"x":0.020808856934309,"y":269.998901367188,"z":0.0167707614600658}},"2a37f3":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.02081149071455,"y":269.989624023438,"z":0.0167672820389271}},"2d9585":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208086147904396,"y":269.999206542969,"z":0.0167709589004517}},"2ebdf1":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29903519153595,"z":-58.908447265625},"rot":{"x":0.0208093542605639,"y":269.99755859375,"z":0.0167703721672297}},"35bbe8":{"lock":false,"pos":{"x":40.2900466918945,"y":1.2976701259613,"z":-68.1198654174805},"rot":{"x":0.0208117887377739,"y":269.989562988281,"z":0.0167673155665398}},"36bc5b":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30632376670837,"z":-49.708812713623},"rot":{"x":0.0208087302744389,"y":269.999572753906,"z":0.0167705770581961}},"382580":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29499578475952,"z":-72.7083969116211},"rot":{"x":0.020808594301343,"y":269.999969482422,"z":0.0167711898684502}},"38374c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208087284117937,"y":269.999542236328,"z":0.0167710017412901}},"3ab577":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202239990234},"rot":{"x":0.0208093635737896,"y":269.999176025391,"z":0.016770888119936}},"3bbc0b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29432249069214,"z":-75.0084228515625},"rot":{"x":0.0208084862679243,"y":269.999938964844,"z":0.0167711600661278}},"45956a":{"lock":false,"pos":{"x":52.9441909790039,"y":1.29688251018524,"z":-86.511100769043},"rot":{"x":0.0208107065409422,"y":269.991607666016,"z":0.0167677439749241}},"48db58":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30603182315826,"z":-58.9203453063965},"rot":{"x":0.0208088085055351,"y":269.999847412109,"z":0.016771923750639}},"4a5655":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30105495452881,"z":-52.008430480957},"rot":{"x":0.0208092723041773,"y":269.997589111328,"z":0.0167703740298748}},"4d9a97":{"lock":false,"pos":{"x":58.0999031066895,"y":1.30883598327637,"z":-52.0709953308105},"rot":{"x":0.0208062250167131,"y":270.007598876953,"z":0.0167739596217871}},"5010c5":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30091917514801,"z":-72.720329284668},"rot":{"x":0.0208080783486366,"y":269.999206542969,"z":0.0167705751955509}},"50acc5":{"lock":false,"pos":{"x":52.9282608032227,"y":1.2955287694931,"z":-91.1161499023438},"rot":{"x":0.0208095107227564,"y":269.999603271484,"z":0.0167714096605778}},"53d6d9":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30681622028351,"z":-58.9709815979004},"rot":{"x":0.0208084899932146,"y":270.000030517578,"z":0.016771238297224}},"584914":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.0208080094307661,"y":270.002471923828,"z":0.0167720280587673}},"59f3e4":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208088699728251,"y":269.99951171875,"z":0.0167704820632935}},"5a1991":{"lock":false,"pos":{"x":52.9284210205078,"y":1.29620385169983,"z":-88.8097076416016},"rot":{"x":0.0208093617111444,"y":269.999542236328,"z":0.0167715195566416}},"5a2b49":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208084098994732,"y":270.000030517578,"z":0.0167712420225143}},"5b1550":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208085682243109,"y":270.000030517578,"z":0.0167711526155472}},"5d45c1":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30091917514801,"z":-72.720344543457},"rot":{"x":0.0208091028034687,"y":269.999084472656,"z":0.0167713742703199}},"61d1e5":{"lock":false,"pos":{"x":52.944206237793,"y":1.30226576328278,"z":-68.1202087402344},"rot":{"x":0.0208079684525728,"y":269.999359130859,"z":0.0167706459760666}},"630d65":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372929573059,"z":-47.4200057983398},"rot":{"x":0.0208113435655832,"y":269.990051269531,"z":0.0167675837874413}},"673d14":{"lock":false,"pos":{"x":36.624340057373,"y":1.2956690788269,"z":-70.4083023071289},"rot":{"x":0.0208085179328918,"y":269.999603271484,"z":0.0167693328112364}},"6842aa":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30428540706635,"z":-61.2203521728516},"rot":{"x":0.0208090711385012,"y":269.999450683594,"z":0.0167706124484539}},"6a04c3":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30430400371552,"z":-56.6087913513184},"rot":{"x":0.0208087712526321,"y":269.999542236328,"z":0.0167706292122602}},"6a8a9f":{"lock":false,"pos":{"x":49.2784881591797,"y":1.3049772977829,"z":-54.3087882995605},"rot":{"x":0.0208089388906956,"y":269.999542236328,"z":0.0167707987129688}},"719a45":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29364931583405,"z":-77.3083343505859},"rot":{"x":0.0208084955811501,"y":269.999938964844,"z":0.0167710166424513}},"71a760":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30361223220825,"z":-63.5203552246094},"rot":{"x":0.0208085142076015,"y":270.000061035156,"z":0.0167700350284576}},"76b07c":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30495870113373,"z":-58.9203491210938},"rot":{"x":0.0208092946559191,"y":269.999206542969,"z":0.0167703088372946}},"7fe153":{"lock":false,"pos":{"x":58.0992050170898,"y":1.31019079685211,"z":-47.4415969848633},"rot":{"x":0.0208058450371027,"y":270.0087890625,"z":0.0167744904756546}},"812c4f":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30699694156647,"z":-47.4087867736816},"rot":{"x":0.0208085775375366,"y":269.999603271484,"z":0.0167708434164524}},"840ba5":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208077691495419,"y":270.002410888672,"z":0.0167719721794128}},"8cdf20":{"lock":false,"pos":{"x":36.6243324279785,"y":1.296342253685,"z":-68.1083068847656},"rot":{"x":0.0208093766123056,"y":269.997406005859,"z":0.0167702957987785}},"910b12":{"lock":false,"pos":{"x":52.9442138671875,"y":1.30563187599182,"z":-56.6203460693359},"rot":{"x":0.0208091922104359,"y":269.998718261719,"z":0.016770213842392}},"9869ee":{"lock":false,"pos":{"x":52.9462394714355,"y":1.2982269525528,"z":-81.9204635620117},"rot":{"x":0.0208083167672157,"y":269.998962402344,"z":0.0167704615741968}},"9d09f0":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170953273773,"z":-54.3199996948242},"rot":{"x":0.0208116844296455,"y":269.989898681641,"z":0.0167674943804741}},"9dcdd3":{"lock":false,"pos":{"x":49.2784996032715,"y":1.30699694156647,"z":-47.4087791442871},"rot":{"x":0.0208087489008904,"y":269.999694824219,"z":0.0167717505246401}},"9e4e11":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765163898468,"z":-49.7203407287598},"rot":{"x":0.0208087507635355,"y":269.999176025391,"z":0.0167706254869699}},"9f9e58":{"lock":false,"pos":{"x":40.2900543212891,"y":1.29699695110321,"z":-70.4198837280273},"rot":{"x":0.0208116210997105,"y":269.989562988281,"z":0.0167675018310547}},"a06013":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430389404297,"z":-79.6199035644531},"rot":{"x":0.0208077616989613,"y":270.002746582031,"z":0.0167723596096039}},"a177db":{"lock":false,"pos":{"x":36.6243476867676,"y":1.29499578475952,"z":-72.708381652832},"rot":{"x":0.0208084397017956,"y":269.999450683594,"z":0.0167704783380032}},"a1c47b":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036306381226,"z":-58.9200057983398},"rot":{"x":0.0208115391433239,"y":269.989807128906,"z":0.0167676489800215}},"a4e44a":{"lock":false,"pos":{"x":40.2900352478027,"y":1.29632365703583,"z":-72.7199935913086},"rot":{"x":0.0208078436553478,"y":270.0029296875,"z":0.0167722515761852}},"a5fc16":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208078101277351,"y":270.002807617188,"z":0.016772173345089}},"ac7db0":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30363070964813,"z":-58.9087944030762},"rot":{"x":0.020808894187212,"y":269.999542236328,"z":0.0167707465589046}},"ad0934":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208081528544426,"y":269.998962402344,"z":0.0167704001069069}},"ad6d9d":{"lock":false,"pos":{"x":52.9442138671875,"y":1.3063051700592,"z":-54.3203430175781},"rot":{"x":0.0208091493695974,"y":269.999206542969,"z":0.0167703796178102}},"b09d6f":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.020807858556509,"y":270.002624511719,"z":0.0167722813785076}},"b337ac":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.0208114441484213,"y":269.989685058594,"z":0.0167674217373133}},"b633d0":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30293893814087,"z":-65.8202056884766},"rot":{"x":0.0208086743950844,"y":269.999389648438,"z":0.0167689081281424}},"b8f774":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29566895961761,"z":-70.4083099365234},"rot":{"x":0.0208093896508217,"y":269.997406005859,"z":0.0167703647166491}},"bce471":{"lock":false,"pos":{"x":58.0996742248535,"y":1.30816268920898,"z":-54.3709678649902},"rot":{"x":0.0208085533231497,"y":269.999694824219,"z":0.0167711433023214}},"bf6a7b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208093002438545,"y":269.99755859375,"z":0.0167702157050371}},"c490a4":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208091475069523,"y":269.99755859375,"z":0.0167699493467808}},"c6c157":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29701554775238,"z":-65.8083038330078},"rot":{"x":0.0208092089742422,"y":269.997497558594,"z":0.0167703088372946}},"cda2e6":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093313217163,"z":-91.1157989501953},"rot":{"x":0.0208077486604452,"y":270.002349853516,"z":0.0167721193283796}},"ce1a7d":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29836189746857,"z":-61.2084503173828},"rot":{"x":0.0208094324916601,"y":269.99755859375,"z":0.016770277172327}},"d88560":{"lock":false,"pos":{"x":36.6243324279785,"y":1.3017281293869,"z":-49.7084655761719},"rot":{"x":0.0208084192126989,"y":270,"z":0.0167710538953543}},"dd0b79":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30238282680511,"z":-52.0199966430664},"rot":{"x":0.0208115000277758,"y":269.989929199219,"z":0.0167675297707319}},"e64769":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363143444061,"z":-81.9201202392578},"rot":{"x":0.0208078771829605,"y":270.002807617188,"z":0.0167722050100565}},"ea2337":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208082906901836,"y":270.000732421875,"z":0.0167713817209005}},"ea8324":{"lock":false,"pos":{"x":58.0999031066895,"y":1.30950927734375,"z":-49.77099609375},"rot":{"x":0.020803265273571,"y":270.018493652344,"z":0.016778027638793}},"ecc3b9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208113957196474,"y":269.989990234375,"z":0.0167671646922827}},"f69d7d":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29970848560333,"z":-56.6084442138672},"rot":{"x":0.0208093095570803,"y":269.99755859375,"z":0.0167704410851002}},"f8a977":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29632365703583,"z":-72.719970703125},"rot":{"x":0.0208085738122463,"y":270.000061035156,"z":0.0167713612318039}},"f8e50b":{"lock":false,"pos":{"x":44.2288818359375,"y":1.29546678066254,"z":-84.2006301879883},"rot":{"x":0.0208089891821146,"y":269.999816894531,"z":0.0167717114090919}},"fd393b":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30024600028992,"z":-75.0203399658203},"rot":{"x":0.0208081156015396,"y":270.000061035156,"z":0.016769764944911}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Survivor +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.3 + posY: 1.66 + posZ: -85.51 + rotX: 0.02 + rotY: 270.02 + rotZ: 0.02 + scaleX: 1.2 + scaleY: 1.2 + scaleZ: 1.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card .18 Derringer (2) f8a977.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card .18 Derringer (2) f8a977.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card .18 Derringer (2) f8a977.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card .18 Derringer (2) f8a977.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card A Chance Encounter (2) 6842aa.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card A Chance Encounter (2) 6842aa.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card A Chance Encounter (2) 6842aa.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card A Chance Encounter (2) 6842aa.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card A Test of Will (1) 2d9585.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card A Test of Will (1) 2d9585.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card A Test of Will (1) 2d9585.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card A Test of Will (1) 2d9585.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card A Test of Will (2) 71a760.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card A Test of Will (2) 71a760.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card A Test of Will (2) 71a760.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card A Test of Will (2) 71a760.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Against All Odds (2) b633d0.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Against All Odds (2) b633d0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Against All Odds (2) b633d0.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Against All Odds (2) b633d0.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Alter Fate (1) 9e4e11.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Alter Fate (1) 9e4e11.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Alter Fate (1) 9e4e11.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Alter Fate (1) 9e4e11.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Alter Fate (3) 5a1991.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Alter Fate (3) 5a1991.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Alter Fate (3) 5a1991.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Alter Fate (3) 5a1991.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Ancient Covenant (2) 840ba5.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Ancient Covenant (2) 840ba5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Ancient Covenant (2) 840ba5.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Ancient Covenant (2) 840ba5.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Aquinnah (1) 630d65.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Aquinnah (1) 630d65.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Aquinnah (1) 630d65.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Aquinnah (1) 630d65.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Aquinnah (3) bf6a7b.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Aquinnah (3) bf6a7b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Aquinnah (3) bf6a7b.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Aquinnah (3) bf6a7b.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Bait and Switch (3) 50acc5.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Bait and Switch (3) 50acc5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Bait and Switch (3) 50acc5.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Bait and Switch (3) 50acc5.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Brute Force (1) 7fe153.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Brute Force (1) 7fe153.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Brute Force (1) 7fe153.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Brute Force (1) 7fe153.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Butterfly Effect (1) 22fc6c.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Butterfly Effect (1) 22fc6c.yaml new file mode 100644 index 000000000..22cf04583 --- /dev/null +++ b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Butterfly Effect (1) 22fc6c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232108 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 22fc6c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Butterfly Effect (1) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.31 + posY: 1.41 + posZ: -85.51 + rotX: 0.02 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Chainsaw (4) 382580.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Chainsaw (4) 382580.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Chainsaw (4) 382580.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Chainsaw (4) 382580.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Cherished Keepsake (1) 5a2b49.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Cherished Keepsake (1) 5a2b49.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Cherished Keepsake (1) 5a2b49.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Cherished Keepsake (1) 5a2b49.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Close Call (2) 61d1e5.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Close Call (2) 61d1e5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Close Call (2) 61d1e5.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Close Call (2) 61d1e5.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Cornered (2) a5fc16.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Cornered (2) a5fc16.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Cornered (2) a5fc16.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Cornered (2) a5fc16.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Devil's Luck (1) ad6d9d.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Devil's Luck (1) ad6d9d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Devil's Luck (1) ad6d9d.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Devil's Luck (1) ad6d9d.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Dig Deep (2) a06013.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Dig Deep (2) a06013.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Dig Deep (2) a06013.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Dig Deep (2) a06013.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Dumb Luck (2) 0c433b.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Dumb Luck (2) 0c433b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Dumb Luck (2) 0c433b.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Dumb Luck (2) 0c433b.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Déjà Vu (5) 719a45.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Déjà Vu (5) 719a45.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Déjà Vu (5) 719a45.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Déjà Vu (5) 719a45.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Eucatastrophe (3) 9dcdd3.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Eucatastrophe (3) 9dcdd3.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Eucatastrophe (3) 9dcdd3.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Eucatastrophe (3) 9dcdd3.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Expeditious Retreat (1) ea8324.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Expeditious Retreat (1) ea8324.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Expeditious Retreat (1) ea8324.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Expeditious Retreat (1) ea8324.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Fire Extinguisher (1) dd0b79.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Fire Extinguisher (1) dd0b79.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Fire Extinguisher (1) dd0b79.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Fire Extinguisher (1) dd0b79.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Five of Pentacles (1) 9d09f0.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Five of Pentacles (1) 9d09f0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Five of Pentacles (1) 9d09f0.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Five of Pentacles (1) 9d09f0.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Flare (1) 910b12.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Flare (1) 910b12.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Flare (1) 910b12.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Flare (1) 910b12.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Fortune or Fate (2) 5010c5.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Fortune or Fate (2) 5010c5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Fortune or Fate (2) 5010c5.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Fortune or Fate (2) 5010c5.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Granny Orne (3) d88560.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Granny Orne (3) d88560.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Granny Orne (3) d88560.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Granny Orne (3) d88560.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Gravedigger's Shovel (2) e64769.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Gravedigger's Shovel (2) e64769.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Gravedigger's Shovel (2) e64769.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Gravedigger's Shovel (2) e64769.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Grisly Totem (3) 4a5655.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Grisly Totem (3) 4a5655.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Grisly Totem (3) 4a5655.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Grisly Totem (3) 4a5655.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Guiding Spirit (1) 13ae70.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Guiding Spirit (1) 13ae70.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Guiding Spirit (1) 13ae70.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Guiding Spirit (1) 13ae70.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Infighting (3) 36bc5b.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Infighting (3) 36bc5b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Infighting (3) 36bc5b.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Infighting (3) 36bc5b.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Jessica Hyde (1) a1c47b.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Jessica Hyde (1) a1c47b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Jessica Hyde (1) a1c47b.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Jessica Hyde (1) a1c47b.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Lantern (2) b09d6f.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Lantern (2) b09d6f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Lantern (2) b09d6f.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Lantern (2) b09d6f.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Leather Coat (1) 5b1550.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Leather Coat (1) 5b1550.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Leather Coat (1) 5b1550.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Leather Coat (1) 5b1550.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Look what I found! (2) fd393b.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Look what I found! (2) fd393b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Look what I found! (2) fd393b.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Look what I found! (2) fd393b.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Lucky! (2) 002455.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Lucky! (2) 002455.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Lucky! (2) 002455.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Lucky! (2) 002455.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Lucky! (3) 04d33d.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Lucky! (3) 04d33d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Lucky! (3) 04d33d.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Lucky! (3) 04d33d.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Lure (1) 76b07c.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Lure (1) 76b07c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Lure (1) 76b07c.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Lure (1) 76b07c.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Lure (2) ad0934.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Lure (2) ad0934.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Lure (2) ad0934.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Lure (2) ad0934.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Miss Doyle (1) b337ac.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Miss Doyle (1) b337ac.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Miss Doyle (1) b337ac.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Miss Doyle (1) b337ac.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Newspaper (2) ea2337.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Newspaper (2) ea2337.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Newspaper (2) ea2337.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Newspaper (2) ea2337.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Nightmare Bauble (3) 1c8915.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Nightmare Bauble (3) 1c8915.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Nightmare Bauble (3) 1c8915.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Nightmare Bauble (3) 1c8915.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Nothing Left to Lose (3) 6a8a9f.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Nothing Left to Lose (3) 6a8a9f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Nothing Left to Lose (3) 6a8a9f.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Nothing Left to Lose (3) 6a8a9f.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Old Hunting Rifle (3) f69d7d.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Old Hunting Rifle (3) f69d7d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Old Hunting Rifle (3) f69d7d.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Old Hunting Rifle (3) f69d7d.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card On Your Own (3) 2ebdf1.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card On Your Own (3) 2ebdf1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card On Your Own (3) 2ebdf1.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card On Your Own (3) 2ebdf1.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card On Your Own (3) ce1a7d.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card On Your Own (3) ce1a7d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card On Your Own (3) ce1a7d.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card On Your Own (3) ce1a7d.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Oops! (2) 9869ee.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Oops! (2) 9869ee.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Oops! (2) 9869ee.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Oops! (2) 9869ee.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Peter Sylvestre (2) 584914.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Peter Sylvestre (2) 584914.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Peter Sylvestre (2) 584914.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Peter Sylvestre (2) 584914.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Plucky (1) 2a37f3.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Plucky (1) 2a37f3.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Plucky (1) 2a37f3.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Plucky (1) 2a37f3.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Quick Learner (4) 3bbc0b.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Quick Learner (4) 3bbc0b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Quick Learner (4) 3bbc0b.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Quick Learner (4) 3bbc0b.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Rabbit's Foot (3) 00c4cc.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Rabbit's Foot (3) 00c4cc.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Rabbit's Foot (3) 00c4cc.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Rabbit's Foot (3) 00c4cc.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Rise to the Occasion (3) 0b9f53.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Rise to the Occasion (3) 0b9f53.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Rise to the Occasion (3) 0b9f53.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Rise to the Occasion (3) 0b9f53.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Scavenging (2) cda2e6.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Scavenging (2) cda2e6.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Scavenging (2) cda2e6.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Scavenging (2) cda2e6.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Scrapper (3) c6c157.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Scrapper (3) c6c157.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Scrapper (3) c6c157.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Scrapper (3) c6c157.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Sharp Vision (1) 4d9a97.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Sharp Vision (1) 4d9a97.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Sharp Vision (1) 4d9a97.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Sharp Vision (1) 4d9a97.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Snare Trap (2) 234fae.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Snare Trap (2) 234fae.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Snare Trap (2) 234fae.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Snare Trap (2) 234fae.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Stroke of Luck (2) bce471.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Stroke of Luck (2) bce471.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Stroke of Luck (2) bce471.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Stroke of Luck (2) bce471.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Survival Instinct (2) 1c3b8f.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Survival Instinct (2) 1c3b8f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Survival Instinct (2) 1c3b8f.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Survival Instinct (2) 1c3b8f.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Tennessee Sour Mash (3) 8cdf20.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Tennessee Sour Mash (3) 8cdf20.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Tennessee Sour Mash (3) 8cdf20.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Tennessee Sour Mash (3) 8cdf20.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Third Time's a Charm (2) 45956a.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Third Time's a Charm (2) 45956a.yaml new file mode 100644 index 000000000..ab0784bbc --- /dev/null +++ b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Third Time's a Charm (2) 45956a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232109 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 45956a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Third Time's a Charm (2) +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 66.31 + posY: 1.41 + posZ: -85.51 + rotX: 0.02 + rotY: 269.99 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card True Survivor (3) 6a04c3.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card True Survivor (3) 6a04c3.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card True Survivor (3) 6a04c3.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card True Survivor (3) 6a04c3.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Try and Try Again (1) 35bbe8.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Try and Try Again (1) 35bbe8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Try and Try Again (1) 35bbe8.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Try and Try Again (1) 35bbe8.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Try and Try Again (3) b8f774.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Try and Try Again (3) b8f774.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Try and Try Again (3) b8f774.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Try and Try Again (3) b8f774.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Unexpected Courage (2) 53d6d9.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Unexpected Courage (2) 53d6d9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Unexpected Courage (2) 53d6d9.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Unexpected Courage (2) 53d6d9.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Will to Survive (3) ac7db0.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Will to Survive (3) ac7db0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Will to Survive (3) ac7db0.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Will to Survive (3) ac7db0.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Yaotl (1) 9f9e58.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Yaotl (1) 9f9e58.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1/Card Yaotl (1) 9f9e58.yaml rename to unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37/Card Yaotl (1) 9f9e58.yaml diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1.ttslua b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1.ttslua deleted file mode 100644 index f999547e7..000000000 --- a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1.ttslua +++ /dev/null @@ -1,503 +0,0 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1.yaml b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1.yaml deleted file mode 100644 index 752268c4e..000000000 --- a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor f15fc1.yaml +++ /dev/null @@ -1,119 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 -ContainedObjects: -- !include 'Custom_Model_Bag Survivor f15fc1/Card Ancient Covenant (2) 840ba5.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Lucky! (2) 002455.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Rabbit''s Foot (3) 00c4cc.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Lucky! (3) 04d33d.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Rise to the Occasion (3) 0b9f53.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Dumb Luck (2) 0c433b.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Guiding Spirit (1) 13ae70.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Survival Instinct (2) 1c3b8f.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Nightmare Bauble (3) 1c8915.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Snare Trap (2) 234fae.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Plucky (1) 2a37f3.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card A Test of Will (1) 2d9585.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card On Your Own (3) 2ebdf1.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Try and Try Again (1) 35bbe8.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Infighting (3) 36bc5b.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Chainsaw (4) 382580.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Quick Learner (4) 3bbc0b.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Grisly Totem (3) 4a5655.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Sharp Vision (1) 4d9a97.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Fortune or Fate (2) 5010c5.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Bait and Switch (3) 50acc5.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Unexpected Courage (2) 53d6d9.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Peter Sylvestre (2) 584914.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Alter Fate (3) 5a1991.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Cherished Keepsake (1) 5a2b49.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Leather Coat (1) 5b1550.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Close Call (2) 61d1e5.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Aquinnah (1) 630d65.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card A Chance Encounter (2) 6842aa.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card True Survivor (3) 6a04c3.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Nothing Left to Lose (3) 6a8a9f.yaml' -- !include "Custom_Model_Bag Survivor f15fc1/Card D\xE9j\xE0 Vu (5) 719a45.yaml" -- !include 'Custom_Model_Bag Survivor f15fc1/Card A Test of Will (2) 71a760.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Lure (1) 76b07c.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Brute Force (1) 7fe153.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Tennessee Sour Mash (3) 8cdf20.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Flare (1) 910b12.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Oops! (2) 9869ee.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Five of Pentacles (1) 9d09f0.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Eucatastrophe (3) 9dcdd3.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Alter Fate (1) 9e4e11.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Yaotl (1) 9f9e58.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Dig Deep (2) a06013.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Jessica Hyde (1) a1c47b.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Cornered (2) a5fc16.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Will to Survive (3) ac7db0.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Lure (2) ad0934.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Devil''s Luck (1) ad6d9d.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Lantern (2) b09d6f.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Miss Doyle (1) b337ac.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Against All Odds (2) b633d0.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Try and Try Again (3) b8f774.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Stroke of Luck (2) bce471.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Aquinnah (3) bf6a7b.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Scrapper (3) c6c157.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Scavenging (2) cda2e6.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card On Your Own (3) ce1a7d.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Granny Orne (3) d88560.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Fire Extinguisher (1) dd0b79.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Gravedigger''s Shovel (2) e64769.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Newspaper (2) ea2337.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Expeditious Retreat (1) ea8324.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Old Hunting Rifle (3) f69d7d.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card .18 Derringer (2) f8a977.yaml' -- !include 'Custom_Model_Bag Survivor f15fc1/Card Look what I found! (2) fd393b.yaml' -CustomMesh: - CastShadows: true - ColliderURL: '' - Convex: true - CustomShader: - FresnelStrength: 0.0 - SpecularColor: - b: 1.0 - g: 1.0 - r: 1.0 - SpecularIntensity: 0.0 - SpecularSharpness: 2.0 - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/952965722515960460/F43F63452854B10B416FDF3BF9EF3068E6E68F26/ - MaterialIndex: 3 - MeshURL: https://pastebin.com/raw/ALrYhQGb - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: f15fc1 -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: !include 'Custom_Model_Bag Survivor f15fc1.ttslua' -LuaScriptState: '{"ml":{"002455":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30024600028992,"z":-75.0203552246094},"rot":{"x":0.0208087377250195,"y":269.998962402344,"z":0.0167707335203886}},"00c4cc":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29768872261047,"z":-63.5084533691406},"rot":{"x":0.0208098404109478,"y":269.997497558594,"z":0.016770463436842}},"04d33d":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30699706077576,"z":-47.4087867736816},"rot":{"x":0.0208086892962456,"y":270.000030517578,"z":0.0167711563408375}},"08b398":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208114981651306,"y":269.98974609375,"z":0.0167670976370573}},"0b9f53":{"lock":false,"pos":{"x":58.0996475219727,"y":1.30614304542542,"z":-61.2709846496582},"rot":{"x":0.0208085458725691,"y":269.999694824219,"z":0.0167710296809673}},"0c433b":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202239990234},"rot":{"x":0.0208086371421814,"y":270.000030517578,"z":0.016771262511611}},"13ae70":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30103635787964,"z":-56.620002746582},"rot":{"x":0.0208115708082914,"y":269.989868164063,"z":0.0167673621326685}},"16fea1":{"lock":false,"pos":{"x":58.0996589660645,"y":1.30681622028351,"z":-58.9709777832031},"rot":{"x":0.0208087936043739,"y":269.999603271484,"z":0.0167708788067102}},"1c3b8f":{"lock":false,"pos":{"x":58.0996627807617,"y":1.30748951435089,"z":-56.6709785461426},"rot":{"x":0.020807359367609,"y":270.004180908203,"z":0.0167726185172796}},"1c8915":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30038166046143,"z":-54.3084411621094},"rot":{"x":0.0208095237612724,"y":269.99755859375,"z":0.0167698338627815}},"234fae":{"lock":false,"pos":{"x":52.9462356567383,"y":1.2982269525528,"z":-81.9204711914063},"rot":{"x":0.0208088215440512,"y":269.998840332031,"z":0.0167707167565823}},"2a37f3":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29834342002869,"z":-65.8198699951172},"rot":{"x":0.0208114571869373,"y":269.989624023438,"z":0.0167673993855715}},"2d9585":{"lock":false,"pos":{"x":52.944206237793,"y":1.30832493305206,"z":-47.420352935791},"rot":{"x":0.0208088401705027,"y":269.999206542969,"z":0.0167708750814199}},"2ebdf1":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29903519153595,"z":-58.908447265625},"rot":{"x":0.0208094660192728,"y":269.99755859375,"z":0.0167699158191681}},"35bbe8":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29767024517059,"z":-68.1198654174805},"rot":{"x":0.0208115205168724,"y":269.989562988281,"z":0.0167673267424107}},"36bc5b":{"lock":false,"pos":{"x":52.9282608032227,"y":1.2955287694931,"z":-91.1161575317383},"rot":{"x":0.0208084732294083,"y":269.999633789063,"z":0.0167712103575468}},"382580":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29499578475952,"z":-72.7083969116211},"rot":{"x":0.0208095014095306,"y":269.999969482422,"z":0.0167717542499304}},"38374c":{"lock":false,"pos":{"x":36.6243362426758,"y":1.29432249069214,"z":-75.008415222168},"rot":{"x":0.0208087284117937,"y":269.999542236328,"z":0.0167710017412901}},"3ab577":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30226576328278,"z":-68.1202239990234},"rot":{"x":0.0208093635737896,"y":269.999176025391,"z":0.016770888119936}},"3bbc0b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29432249069214,"z":-75.0084228515625},"rot":{"x":0.0208091791719198,"y":269.999938964844,"z":0.0167716573923826}},"48db58":{"lock":false,"pos":{"x":52.9442100524902,"y":1.30603182315826,"z":-58.9203453063965},"rot":{"x":0.0208088085055351,"y":269.999847412109,"z":0.016771923750639}},"4a5655":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30105495452881,"z":-52.008430480957},"rot":{"x":0.0208092387765646,"y":269.997589111328,"z":0.0167698096483946}},"4d9a97":{"lock":false,"pos":{"x":58.0999031066895,"y":1.30883610248566,"z":-52.0709953308105},"rot":{"x":0.0208061747252941,"y":270.007598876953,"z":0.016773933544755}},"5010c5":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30159258842468,"z":-70.4202270507813},"rot":{"x":0.0208089761435986,"y":269.999145507813,"z":0.0167708490043879}},"50acc5":{"lock":false,"pos":{"x":52.9442405700684,"y":1.29687988758087,"z":-86.5202713012695},"rot":{"x":0.02080855704844,"y":269.999603271484,"z":0.0167709235101938}},"53d6d9":{"lock":false,"pos":{"x":58.0996551513672,"y":1.30681622028351,"z":-58.9709815979004},"rot":{"x":0.0208087116479874,"y":270.000030517578,"z":0.0167711973190308}},"584914":{"lock":false,"pos":{"x":40.2742691040039,"y":1.29160833358765,"z":-88.8093566894531},"rot":{"x":0.020808594301343,"y":270.002471923828,"z":0.016772435978055}},"59f3e4":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428540706635,"z":-61.2203559875488},"rot":{"x":0.0208088699728251,"y":269.99951171875,"z":0.0167704820632935}},"5a1991":{"lock":false,"pos":{"x":52.9441108703613,"y":1.29755306243896,"z":-84.2202453613281},"rot":{"x":0.0208085756748915,"y":269.999542236328,"z":0.0167709924280643}},"5a2b49":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208086054772139,"y":270.000030517578,"z":0.0167711935937405}},"5b1550":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29968988895416,"z":-61.2200088500977},"rot":{"x":0.0208084508776665,"y":270.000030517578,"z":0.0167710985988379}},"5d45c1":{"lock":false,"pos":{"x":52.9441947937012,"y":1.30091917514801,"z":-72.720344543457},"rot":{"x":0.0208091028034687,"y":269.999084472656,"z":0.0167713742703199}},"61d1e5":{"lock":false,"pos":{"x":52.9442024230957,"y":1.30293893814087,"z":-65.8202209472656},"rot":{"x":0.0208087377250195,"y":269.999328613281,"z":0.0167709514498711}},"630d65":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30372941493988,"z":-47.4200057983398},"rot":{"x":0.0208113826811314,"y":269.990051269531,"z":0.0167675483971834}},"673d14":{"lock":false,"pos":{"x":36.624340057373,"y":1.2956690788269,"z":-70.4083023071289},"rot":{"x":0.0208085179328918,"y":269.999603271484,"z":0.0167693328112364}},"6842aa":{"lock":false,"pos":{"x":52.944206237793,"y":1.30495870113373,"z":-58.920352935791},"rot":{"x":0.0208088755607605,"y":269.999450683594,"z":0.0167711451649666}},"6a04c3":{"lock":false,"pos":{"x":49.2784957885742,"y":1.30565059185028,"z":-52.0087699890137},"rot":{"x":0.0208085309714079,"y":269.999603271484,"z":0.0167712643742561}},"6a8a9f":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30632376670837,"z":-49.708812713623},"rot":{"x":0.0208087284117937,"y":269.999603271484,"z":0.0167709682136774}},"719a45":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29364931583405,"z":-77.3083343505859},"rot":{"x":0.0208092629909515,"y":269.999938964844,"z":0.0167714338749647}},"71a760":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30428552627563,"z":-61.2203559875488},"rot":{"x":0.0208085887134075,"y":270.000030517578,"z":0.0167711041867733}},"76b07c":{"lock":false,"pos":{"x":52.944221496582,"y":1.30563199520111,"z":-56.6203422546387},"rot":{"x":0.0208089537918568,"y":269.999206542969,"z":0.016771087422967}},"7fe153":{"lock":false,"pos":{"x":58.0992050170898,"y":1.3101909160614,"z":-47.4415969848633},"rot":{"x":0.0208058785647154,"y":270.0087890625,"z":0.0167742799967527}},"812c4f":{"lock":false,"pos":{"x":49.2784881591797,"y":1.30699694156647,"z":-47.4087867736816},"rot":{"x":0.0208085775375366,"y":269.999603271484,"z":0.0167708434164524}},"840ba5":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29565036296844,"z":-75.0199813842773},"rot":{"x":0.0208075344562531,"y":270.002410888672,"z":0.0167711600661278}},"8cdf20":{"lock":false,"pos":{"x":36.6243324279785,"y":1.296342253685,"z":-68.1083068847656},"rot":{"x":0.0208101067692041,"y":269.997406005859,"z":0.0167707335203886}},"910b12":{"lock":false,"pos":{"x":52.9442367553711,"y":1.30630528926849,"z":-54.3201904296875},"rot":{"x":0.0208089295774698,"y":269.998748779297,"z":0.0167708694934845}},"9869ee":{"lock":false,"pos":{"x":52.9442024230957,"y":1.29889953136444,"z":-79.620246887207},"rot":{"x":0.0208089202642441,"y":269.998901367188,"z":0.0167705956846476}},"9d09f0":{"lock":false,"pos":{"x":40.2900543212891,"y":1.30170965194702,"z":-54.3199996948242},"rot":{"x":0.0208116974681616,"y":269.989898681641,"z":0.0167674422264099}},"9dcdd3":{"lock":false,"pos":{"x":52.9284210205078,"y":1.29620397090912,"z":-88.8097152709961},"rot":{"x":0.0208088122308254,"y":269.999633789063,"z":0.0167708937078714}},"9e4e11":{"lock":false,"pos":{"x":52.944206237793,"y":1.30765175819397,"z":-49.7203407287598},"rot":{"x":0.0208089649677277,"y":269.999176025391,"z":0.0167708229273558}},"9f9e58":{"lock":false,"pos":{"x":40.2900543212891,"y":1.29699695110321,"z":-70.4198837280273},"rot":{"x":0.0208116229623556,"y":269.989562988281,"z":0.0167674217373133}},"a06013":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29430401325226,"z":-79.6199035644531},"rot":{"x":0.0208080913871527,"y":270.002746582031,"z":0.0167726464569569}},"a177db":{"lock":false,"pos":{"x":36.6243476867676,"y":1.29499578475952,"z":-72.708381652832},"rot":{"x":0.0208084397017956,"y":269.999450683594,"z":0.0167704783380032}},"a1c47b":{"lock":false,"pos":{"x":40.2900505065918,"y":1.30036318302155,"z":-58.9200057983398},"rot":{"x":0.0208115000277758,"y":269.989807128906,"z":0.0167676471173763}},"a4e44a":{"lock":false,"pos":{"x":40.2900352478027,"y":1.29632365703583,"z":-72.7199935913086},"rot":{"x":0.0208078436553478,"y":270.0029296875,"z":0.0167722515761852}},"a5fc16":{"lock":false,"pos":{"x":40.2900466918945,"y":1.29497718811035,"z":-77.3199005126953},"rot":{"x":0.0208084397017956,"y":270.002807617188,"z":0.0167725309729576}},"ac7db0":{"lock":false,"pos":{"x":49.278678894043,"y":1.30497074127197,"z":-54.3310775756836},"rot":{"x":0.0208088811486959,"y":269.999603271484,"z":0.0167709235101938}},"ad0934":{"lock":false,"pos":{"x":52.9441986083984,"y":1.29957282543182,"z":-77.3202590942383},"rot":{"x":0.0208087749779224,"y":269.998901367188,"z":0.0167706478387117}},"ad6d9d":{"lock":false,"pos":{"x":52.944206237793,"y":1.3069783449173,"z":-52.0203437805176},"rot":{"x":0.0208086390048265,"y":269.999206542969,"z":0.0167708676308393}},"b09d6f":{"lock":false,"pos":{"x":40.2899589538574,"y":1.29295742511749,"z":-84.2198944091797},"rot":{"x":0.0208085756748915,"y":270.002624511719,"z":0.0167724676430225}},"b337ac":{"lock":false,"pos":{"x":40.2900428771973,"y":1.29901659488678,"z":-63.5200119018555},"rot":{"x":0.0208115763962269,"y":269.989685058594,"z":0.016767306253314}},"b633d0":{"lock":false,"pos":{"x":52.9441986083984,"y":1.30361223220825,"z":-63.5203590393066},"rot":{"x":0.0208089519292116,"y":269.999328613281,"z":0.0167708806693554}},"b8f774":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29566895961761,"z":-70.4083099365234},"rot":{"x":0.0208102352917194,"y":269.997406005859,"z":0.0167706869542599}},"bce471":{"lock":false,"pos":{"x":58.0996742248535,"y":1.30816268920898,"z":-54.3709678649902},"rot":{"x":0.020808732137084,"y":269.999694824219,"z":0.0167711079120636}},"bf6a7b":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208091959357262,"y":269.99755859375,"z":0.0167701914906502}},"c490a4":{"lock":false,"pos":{"x":36.6243324279785,"y":1.30240142345428,"z":-47.4084396362305},"rot":{"x":0.0208091475069523,"y":269.99755859375,"z":0.0167699493467808}},"c6c157":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29701554775238,"z":-65.8083038330078},"rot":{"x":0.0208098944276571,"y":269.997497558594,"z":0.0167707651853561}},"cda2e6":{"lock":false,"pos":{"x":40.2741088867188,"y":1.29093313217163,"z":-91.1157989501953},"rot":{"x":0.0208086892962456,"y":270.002349853516,"z":0.0167723298072815}},"ce1a7d":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29836189746857,"z":-61.2084503173828},"rot":{"x":0.0208095051348209,"y":269.99755859375,"z":0.016769902780652}},"d88560":{"lock":false,"pos":{"x":36.6243324279785,"y":1.3017281293869,"z":-49.7084655761719},"rot":{"x":0.0208086892962456,"y":270,"z":0.0167710967361927}},"dd0b79":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3023829460144,"z":-52.0199966430664},"rot":{"x":0.020811403170228,"y":269.989929199219,"z":0.0167674422264099}},"e64769":{"lock":false,"pos":{"x":40.2920837402344,"y":1.29363143444061,"z":-81.9201202392578},"rot":{"x":0.020808570086956,"y":270.002807617188,"z":0.0167725831270218}},"ea2337":{"lock":false,"pos":{"x":40.2900886535645,"y":1.2922842502594,"z":-86.5199127197266},"rot":{"x":0.0208093393594027,"y":270.000732421875,"z":0.0167717821896076}},"ea8324":{"lock":false,"pos":{"x":58.0999031066895,"y":1.30950927734375,"z":-49.77099609375},"rot":{"x":0.0208029132336378,"y":270.018493652344,"z":0.0167780052870512}},"ecc3b9":{"lock":false,"pos":{"x":40.2900505065918,"y":1.3030561208725,"z":-49.7199935913086},"rot":{"x":0.0208113957196474,"y":269.989990234375,"z":0.0167671646922827}},"f69d7d":{"lock":false,"pos":{"x":36.6243324279785,"y":1.29970848560333,"z":-56.6084442138672},"rot":{"x":0.0208094641566277,"y":269.99755859375,"z":0.0167699847370386}},"f8a977":{"lock":false,"pos":{"x":40.2900505065918,"y":1.29632377624512,"z":-72.719970703125},"rot":{"x":0.0208085272461176,"y":270.000061035156,"z":0.0167713537812233}},"f8e50b":{"lock":false,"pos":{"x":44.2288818359375,"y":1.29546678066254,"z":-84.2006301879883},"rot":{"x":0.0208089891821146,"y":269.999816894531,"z":0.0167717114090919}},"fd393b":{"lock":false,"pos":{"x":52.9441909790039,"y":1.30091917514801,"z":-72.720344543457},"rot":{"x":0.0208085179328918,"y":270.000030517578,"z":0.0167713351547718}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Survivor -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 66.3 - posY: 1.66 - posZ: -85.51 - rotX: 0.02 - rotY: 270.02 - rotZ: 0.02 - scaleX: 1.2 - scaleY: 1.2 - scaleZ: 1.2 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Circle Undone 0dcbe8.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 0dcbe8.ttslua index 4798d294b..daed6bf90 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 0dcbe8.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 0dcbe8.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097.ttslua index c99612b1a..beb7e9fed 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775.ttslua index 45f110e8b..ed7a62e7d 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775/Custom_Tile The Circle Undone f697b0.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775/Custom_Tile The Circle Undone f697b0.ttslua index 624750c7f..47d018ac8 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775/Custom_Tile The Circle Undone f697b0.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775/Custom_Tile The Circle Undone f697b0.ttslua @@ -1,21 +1,21 @@ -name = 'The Circle Undone' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Circle Undone' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc/Custom_Tile At Death's Doorstep b21125.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc/Custom_Tile At Death's Doorstep b21125.ttslua index 920788446..629fbd0e7 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc/Custom_Tile At Death's Doorstep b21125.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc/Custom_Tile At Death's Doorstep b21125.ttslua @@ -1,25 +1,25 @@ -name = "At Death's Doorstep" - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) +name = "At Death's Doorstep" + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0.ttslua index 33f4391a1..689030815 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} ---w }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +--w }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0/Custom_Tile The Secret Name b21125.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0/Custom_Tile The Secret Name b21125.ttslua index f9497f333..18a0d7f51 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0/Custom_Tile The Secret Name b21125.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0/Custom_Tile The Secret Name b21125.ttslua @@ -1,25 +1,25 @@ -name = 'The Secret Name' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) +name = 'The Secret Name' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8.ttslua index 45f110e8b..ed7a62e7d 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8/Custom_Tile The Wages of Sin b21125.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8/Custom_Tile The Wages of Sin b21125.ttslua index 512ea5569..1887450fa 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8/Custom_Tile The Wages of Sin b21125.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8/Custom_Tile The Wages of Sin b21125.ttslua @@ -1,25 +1,25 @@ -name = 'The Wages of Sin' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) +name = 'The Wages of Sin' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48.ttslua index 45f110e8b..ed7a62e7d 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Member of the Lodge 38a5f7.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Member of the Lodge 38a5f7.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Member of the Lodge 38a5f7.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Member of the Lodge 38a5f7.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Not a Member of the Lodge abe15f.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Not a Member of the Lodge abe15f.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Not a Member of the Lodge abe15f.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Not a Member of the Lodge abe15f.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Custom_Tile For the Greater Good bbb70a.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Custom_Tile For the Greater Good bbb70a.ttslua index 4a23f1a51..0c455ba9f 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Custom_Tile For the Greater Good bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Custom_Tile For the Greater Good bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'For the Greater Good' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'For the Greater Good' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a.ttslua index 45f110e8b..ed7a62e7d 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a/Custom_Tile Union and Disillusion 3fe126.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a/Custom_Tile Union and Disillusion 3fe126.ttslua index ce0e418ec..a25904f3f 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a/Custom_Tile Union and Disillusion 3fe126.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a/Custom_Tile Union and Disillusion 3fe126.ttslua @@ -1,25 +1,25 @@ -name = 'Union and Disillusion' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Union and Disillusion' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775.ttslua index 0748143c2..54d591927 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Anette Mason is posessed by evil d14543.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Anette Mason is posessed by evil d14543.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Anette Mason is posessed by evil d14543.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Anette Mason is posessed by evil d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Carl Sanford possesses the secrets of the universe 92c6fc.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Carl Sanford possesses the secrets of the universe 92c6fc.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Carl Sanford possesses the secrets of the universe 92c6fc.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Carl Sanford possesses the secrets of the universe 92c6fc.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Custom_Tile In the Clutches of Chaos e0709b.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Custom_Tile In the Clutches of Chaos e0709b.ttslua index 9f9470e13..89aa66922 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Custom_Tile In the Clutches of Chaos e0709b.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Custom_Tile In the Clutches of Chaos e0709b.ttslua @@ -1,25 +1,25 @@ -name = 'In the Clutches of Chaos' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'In the Clutches of Chaos' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66.ttslua index 0748143c2..54d591927 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66/Custom_Tile Before the Black Throne b16392.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66/Custom_Tile Before the Black Throne b16392.ttslua index 7b48da20b..3d469943a 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66/Custom_Tile Before the Black Throne b16392.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66/Custom_Tile Before the Black Throne b16392.ttslua @@ -1,25 +1,25 @@ -name = 'Before the Black Throne' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Before the Black Throne' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a/Custom_Tile The Circle Undone 05f912.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a/Custom_Tile The Circle Undone 05f912.ttslua index 624750c7f..47d018ac8 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a/Custom_Tile The Circle Undone 05f912.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a/Custom_Tile The Circle Undone 05f912.ttslua @@ -1,21 +1,21 @@ -name = 'The Circle Undone' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Circle Undone' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Tile The Circle Undone Campaign Log 1 44a05a.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Tile The Circle Undone Campaign Log 1 44a05a.ttslua index 797b18e09..274e1d634 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Tile The Circle Undone Campaign Log 1 44a05a.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Tile The Circle Undone Campaign Log 1 44a05a.ttslua @@ -1,653 +1,653 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {0.902,0.886,0.788} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.50,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.06,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.27}, - rows = 10, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.27}, - rows = 10, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.62}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.268}, - rows = 10, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.62}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.265}, - rows = 10, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.464,0.1,0.507}, - rows =16, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign NOtes 2 - { - pos = {0.344,0.1,0.187}, - rows = 10, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Mementos - { - pos = {0.351,0.1,0.744}, - rows = 12, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {0.902,0.886,0.788} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.50,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.06,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.27}, + rows = 10, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.27}, + rows = 10, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.62}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.268}, + rows = 10, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.62}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.265}, + rows = 10, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.464,0.1,0.507}, + rows =16, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign NOtes 2 + { + pos = {0.344,0.1,0.187}, + rows = 10, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Mementos + { + pos = {0.351,0.1,0.744}, + rows = 12, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a.ttslua index c99612b1a..beb7e9fed 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828.ttslua index 0748143c2..54d591927 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828/Custom_Tile Campaign A Setup 075016.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828/Custom_Tile Campaign A Setup 075016.ttslua index af12e8963..b26158ce8 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828/Custom_Tile Campaign A Setup 075016.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828/Custom_Tile Campaign A Setup 075016.ttslua @@ -1,25 +1,25 @@ -name = 'TDE_A' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'TDE_A' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7.ttslua index 45f110e8b..ed7a62e7d 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Model_Bag Set-aside a45247/Custom_Model_Bag Infestation Bag 0257a2.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Model_Bag Set-aside a45247/Custom_Model_Bag Infestation Bag 0257a2.ttslua index eba7fa0dc..3d2f7ab59 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Model_Bag Set-aside a45247/Custom_Model_Bag Infestation Bag 0257a2.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Model_Bag Set-aside a45247/Custom_Model_Bag Infestation Bag 0257a2.ttslua @@ -1,5 +1,5 @@ -function onCollisionEnter(collision_info) - self.shuffle() - self.shuffle() - self.shuffle() +function onCollisionEnter(collision_info) + self.shuffle() + self.shuffle() + self.shuffle() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Tile Campaign B Setup bbb70a.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Tile Campaign B Setup bbb70a.ttslua index 04f54ee0c..4dde019f3 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Tile Campaign B Setup bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Tile Campaign B Setup bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'TDE_B' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'TDE_B' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca.ttslua index 979aaf560..5534586ac 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca/Custom_Tile The Search For Kadath bbb70a.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca/Custom_Tile The Search For Kadath bbb70a.ttslua index 9e2b61d86..4cdcd8644 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca/Custom_Tile The Search For Kadath bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca/Custom_Tile The Search For Kadath bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'The Search For Kadath' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Search For Kadath' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86.ttslua index 979aaf560..5534586ac 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86/Custom_Tile A Thousand Shapes of Horror b53295.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86/Custom_Tile A Thousand Shapes of Horror b53295.ttslua index cb91e7329..ba00854d4 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86/Custom_Tile A Thousand Shapes of Horror b53295.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86/Custom_Tile A Thousand Shapes of Horror b53295.ttslua @@ -1,25 +1,25 @@ -name = 'A Thousand Shapes of Horror' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'A Thousand Shapes of Horror' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66.ttslua index 979aaf560..5534586ac 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66/Custom_Tile Dark Side of the Moon aa8d82.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66/Custom_Tile Dark Side of the Moon aa8d82.ttslua index afe917f51..e562e4cb3 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66/Custom_Tile Dark Side of the Moon aa8d82.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66/Custom_Tile Dark Side of the Moon aa8d82.ttslua @@ -1,25 +1,25 @@ -name = 'Dark Side of the Moon' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Dark Side of the Moon' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf.ttslua index 979aaf560..5534586ac 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf/Custom_Tile Point of No Return f302ab.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf/Custom_Tile Point of No Return f302ab.ttslua index c08e0e3c9..eff41dc38 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf/Custom_Tile Point of No Return f302ab.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf/Custom_Tile Point of No Return f302ab.ttslua @@ -1,25 +1,25 @@ -name = 'Point of No Return' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Point of No Return' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096.ttslua index 979aaf560..5534586ac 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096/Custom_Tile Point of No Return 3e86c2.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096/Custom_Tile Point of No Return 3e86c2.ttslua index 6f6daf608..6e4f3527f 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096/Custom_Tile Point of No Return 3e86c2.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096/Custom_Tile Point of No Return 3e86c2.ttslua @@ -1,25 +1,25 @@ -name = 'Where the Gods Dwell' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Where the Gods Dwell' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76.ttslua index 0748143c2..54d591927 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06.yaml index 4147be443..c61b03aac 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06.yaml +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06.yaml @@ -6,7 +6,7 @@ ColorDiffuse: ContainedObjects: - !include 'Custom_Model_Bag Set-aside 376a06/Bag Extra Tokens 7b57ef.yaml' - !include 'Custom_Model_Bag Set-aside 376a06/Deck Spinners in Darkness 912fa4.yaml' -- !include 'Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543.yaml' +- !include 'Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.yaml' CustomMesh: CastShadows: true ColliderURL: '' diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543.yaml deleted file mode 100644 index ce2757cb0..000000000 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543.yaml +++ /dev/null @@ -1,50 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 0.0 - g: 0.0 - r: 0.0 -ContainedObjects: -- !include 'Bag Atlach-Nacha d14543/Card Atlatch-Nacha a2f955.yaml' -- !include 'Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 8b17a1.yaml' -- !include 'Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha f4d669.yaml' -- !include 'Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 6af4f4.yaml' -- !include 'Bag Atlach-Nacha d14543/Custom_Tile 1b6f2a.yaml' -- !include 'Bag Atlach-Nacha d14543/Custom_Tile 719afa.yaml' -- !include 'Bag Atlach-Nacha d14543/Custom_Tile 13f1f9.yaml' -- !include 'Bag Atlach-Nacha d14543/Custom_Tile 7234af.yaml' -- !include 'Bag Atlach-Nacha d14543/Custom_Tile 5391d4.yaml' -- !include 'Bag Atlach-Nacha d14543/Custom_Tile bef50d.yaml' -- !include 'Bag Atlach-Nacha d14543/Custom_Tile 4d1c37.yaml' -- !include 'Bag Atlach-Nacha d14543/Custom_Tile 90ff22.yaml' -- !include 'Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 34d21c.yaml' -Description: Clear the map and click place when instructed to engage Atlach-Nacha -DragSelectable: true -GMNotes: '' -GUID: d14543 -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: !include 'Bag Atlach-Nacha d14543.ttslua' -LuaScriptState: '{"ml":{"13f1f9":{"lock":false,"pos":{"x":-33.5533,"y":1.626,"z":-7.7173},"rot":{"x":359.9201,"y":270.0078,"z":0.0169}},"1b6f2a":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":359.9831,"y":0,"z":359.92}},"34d21c":{"lock":false,"pos":{"x":-28.4995,"y":1.6923,"z":-2.2968},"rot":{"x":359.9201,"y":270.0027,"z":0.0169}},"4d1c37":{"lock":false,"pos":{"x":-27.0057,"y":1.6214,"z":7.6653},"rot":{"x":359.9201,"y":270.0078,"z":0.0169}},"5391d4":{"lock":false,"pos":{"x":-36.7731,"y":1.6339,"z":3.86},"rot":{"x":359.9831,"y":0.0001,"z":359.92}},"6af4f4":{"lock":false,"pos":{"x":-31.6761,"y":1.6967,"z":-2.2562},"rot":{"x":359.9201,"y":270.0027,"z":0.0169}},"719afa":{"lock":false,"pos":{"x":-27.0473,"y":1.617,"z":-7.6666},"rot":{"x":359.9201,"y":270.0079,"z":0.0169}},"7234af":{"lock":false,"pos":{"x":-36.7729,"y":1.6317,"z":-3.8299},"rot":{"x":359.9831,"y":0.0001,"z":359.92}},"8b17a1":{"lock":false,"pos":{"x":-28.5389,"y":1.6937,"z":2.2039},"rot":{"x":359.9201,"y":270.0027,"z":0.0169}},"90ff22":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":359.9831,"y":0,"z":359.92}},"a2f955":{"lock":false,"pos":{"x":-30.1169,"y":1.6952,"z":-0.0254},"rot":{"x":359.9201,"y":270.0026,"z":0.0169}},"bef50d":{"lock":false,"pos":{"x":-33.4851,"y":1.6304,"z":7.5392},"rot":{"x":359.9201,"y":270.0078,"z":0.0169}},"f4d669":{"lock":false,"pos":{"x":-31.697,"y":1.6981,"z":2.1938},"rot":{"x":359.9201,"y":270.0027,"z":0.0169}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Bag -Nickname: Atlach-Nacha -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 36.36 - posY: 3.58 - posZ: -10.54 - rotX: 0.02 - rotY: 90.0 - rotZ: 0.0 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.ttslua similarity index 96% rename from unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543.ttslua rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.ttslua index 512f2eed0..4d4017455 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.yaml new file mode 100644 index 000000000..a8f8c1fec --- /dev/null +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.yaml @@ -0,0 +1,51 @@ +Autoraise: true +ColorDiffuse: + b: 0.0 + g: 0.0 + r: 0.0 +ContainedObjects: +- !include 'Bag Atlach-Nacha f0a43a/Custom_Tile 13f1f9.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Custom_Tile 1b6f2a.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 34d21c.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Custom_Tile 4d1c37.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Custom_Tile 5391d4.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 6af4f4.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Custom_Tile 719afa.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Custom_Tile 7234af.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 8b17a1.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Custom_Tile Atlach-Nacha Helper 8e78c7.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Custom_Tile 90ff22.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Card Atlatch-Nacha a2f955.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Custom_Tile bef50d.yaml' +- !include 'Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha f4d669.yaml' +Description: Clear the map and click place when instructed to engage Atlach-Nacha +DragSelectable: true +GMNotes: '' +GUID: f0a43a +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Bag Atlach-Nacha f0a43a.ttslua' +LuaScriptState: '{"ml":{"13f1f9":{"lock":false,"pos":{"x":-33.5533,"y":1.626,"z":-7.7173},"rot":{"x":359.9201,"y":270.0078,"z":0.0169}},"1b6f2a":{"lock":false,"pos":{"x":-23.6765,"y":1.6133,"z":-3.83},"rot":{"x":359.9832,"y":0.0001,"z":359.9201}},"34d21c":{"lock":false,"pos":{"x":-28.5014,"y":1.6341,"z":-2.469},"rot":{"x":359.9201,"y":269.9781,"z":0.0169}},"4d1c37":{"lock":false,"pos":{"x":-27.0057,"y":1.6214,"z":7.6653},"rot":{"x":359.9201,"y":270.0078,"z":0.0169}},"5391d4":{"lock":false,"pos":{"x":-36.7731,"y":1.6339,"z":3.86},"rot":{"x":359.9832,"y":0.0003,"z":359.9201}},"6af4f4":{"lock":false,"pos":{"x":-31.8318,"y":1.6387,"z":-2.4732},"rot":{"x":359.9201,"y":270.0026,"z":0.0168}},"719afa":{"lock":false,"pos":{"x":-27.0473,"y":1.6169,"z":-7.6666},"rot":{"x":359.9201,"y":270.0079,"z":0.0169}},"7234af":{"lock":false,"pos":{"x":-36.7729,"y":1.6316,"z":-3.8299},"rot":{"x":359.9832,"y":0.0003,"z":359.9201}},"8b17a1":{"lock":false,"pos":{"x":-28.4878,"y":1.6355,"z":2.2838},"rot":{"x":359.9201,"y":270.0031,"z":0.0168}},"8e78c7":{"lock":false,"pos":{"x":-25.8364,"y":1.6192,"z":5.9049},"rot":{"x":359.9201,"y":269.9999,"z":0.0168}},"90ff22":{"lock":false,"pos":{"x":-23.6765,"y":1.6156,"z":3.86},"rot":{"x":359.9832,"y":0,"z":359.9201}},"a2f955":{"lock":false,"pos":{"x":-30.1756,"y":1.6371,"z":-0.045},"rot":{"x":359.9201,"y":270.0023,"z":0.0168}},"bef50d":{"lock":false,"pos":{"x":-33.4851,"y":1.6304,"z":7.5392},"rot":{"x":359.9201,"y":270.0079,"z":0.0169}},"f4d669":{"lock":false,"pos":{"x":-31.8502,"y":1.6401,"z":2.2814},"rot":{"x":359.9201,"y":270.0025,"z":0.0168}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Bag +Nickname: Atlach-Nacha +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 1.68 + posY: 3.48 + posZ: 14.28 + rotX: 359.96 + rotY: 225.0 + rotZ: 0.05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Atlatch-Nacha a2f955.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Atlatch-Nacha a2f955.yaml similarity index 95% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Atlatch-Nacha a2f955.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Atlatch-Nacha a2f955.yaml index aad839489..c8f58f3bb 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Atlatch-Nacha a2f955.yaml +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Atlatch-Nacha a2f955.yaml @@ -33,9 +33,9 @@ Snap: false Sticky: true Tooltip: true Transform: - posX: -30.12 - posY: 1.7 - posZ: -0.03 + posX: -30.18 + posY: 1.64 + posZ: -0.05 rotX: 359.92 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 34d21c.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 34d21c.yaml similarity index 95% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 34d21c.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 34d21c.yaml index 38061a48b..c1e63b942 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 34d21c.yaml +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 34d21c.yaml @@ -34,10 +34,10 @@ Sticky: true Tooltip: true Transform: posX: -28.5 - posY: 1.69 - posZ: -2.3 + posY: 1.63 + posZ: -2.47 rotX: 359.92 - rotY: 270.0 + rotY: 269.98 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 6af4f4.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 6af4f4.yaml similarity index 95% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 6af4f4.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 6af4f4.yaml index fc0effc2a..9b590a201 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 6af4f4.yaml +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 6af4f4.yaml @@ -33,9 +33,9 @@ Snap: false Sticky: true Tooltip: true Transform: - posX: -31.68 - posY: 1.7 - posZ: -2.26 + posX: -31.83 + posY: 1.64 + posZ: -2.47 rotX: 359.92 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 8b17a1.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 8b17a1.yaml similarity index 95% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 8b17a1.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 8b17a1.yaml index 6318e9660..7c556b38c 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 8b17a1.yaml +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha 8b17a1.yaml @@ -33,9 +33,9 @@ Snap: false Sticky: true Tooltip: true Transform: - posX: -28.54 - posY: 1.69 - posZ: 2.2 + posX: -28.49 + posY: 1.64 + posZ: 2.28 rotX: 359.92 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha f4d669.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha f4d669.yaml similarity index 95% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha f4d669.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha f4d669.yaml index 49c99fdfc..66d3292ca 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha f4d669.yaml +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Card Legs of Atlach-Nacha f4d669.yaml @@ -33,9 +33,9 @@ Snap: false Sticky: true Tooltip: true Transform: - posX: -31.7 - posY: 1.7 - posZ: 2.19 + posX: -31.85 + posY: 1.64 + posZ: 2.28 rotX: 359.92 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 13f1f9.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 13f1f9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 13f1f9.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 13f1f9.yaml diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 1b6f2a.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 1b6f2a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 1b6f2a.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 1b6f2a.yaml diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 4d1c37.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 4d1c37.yaml similarity index 100% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 4d1c37.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 4d1c37.yaml diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 5391d4.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 5391d4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 5391d4.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 5391d4.yaml diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 719afa.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 719afa.yaml similarity index 100% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 719afa.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 719afa.yaml diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 7234af.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 7234af.yaml similarity index 100% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 7234af.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 7234af.yaml diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 90ff22.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 90ff22.yaml similarity index 100% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile 90ff22.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile 90ff22.yaml diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile bef50d.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile bef50d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha d14543/Custom_Tile bef50d.yaml rename to unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile bef50d.yaml diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile Atlach-Nacha Helper 8e78c7.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile Atlach-Nacha Helper 8e78c7.ttslua new file mode 100644 index 000000000..386ffd1eb --- /dev/null +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile Atlach-Nacha Helper 8e78c7.ttslua @@ -0,0 +1,79 @@ +ENCOUNTER_DECK_POS = {-3.8, 1, 5.7} +MIN_VALUE = 1 + +function onload() + val = 1 + + self.createButton({ + label="Rotate", + click_function="doRotation", + function_owner=self, + position={0,0.1,-0.4}, + height=120, + width=450, + scale={x=1.75, y=1.75, z=1.75}, + font_size=100 + }) + + self.createButton({ + label=val, + click_function="add_subtract", + function_owner=self, + position={0,0.1,0.4}, + height=120, + width=250, + scale={x=1.75, y=1.75, z=1.75}, + font_size=100 + }) +end + +function add_subtract(_obj, _color, alt_click) + local mod = alt_click and -1 or 1 + new_value = math.max(val + mod, MIN_VALUE) + if val ~= new_value then + val = new_value + self.editButton({ + index = 1, + label = tostring(val) + }) + end +end + +function doRotation(_obj, _color, alt_click) + if IS_ROTATING then return end + + IS_ROTATING = true + local body = getObjectFromGUID("a2f955") + if body == nil then + printToColor("Place Atlach-Nacha first, then try again", _color) + end + + local objs = Physics.cast({ + origin = body.getPosition(), + direction = {0,1,0}, + type = 2, + size = { 6, 6, 6 }, + max_distance = 0 + }) + + local numAttachments = 0 + for i,v in ipairs(objs) do + local obj = v.hit_object + if obj.getGUID() ~= "a2f955" and (obj.tag == "Card" or obj.getName() == "Damage") then + numAttachments = numAttachments + 1 + body.addAttachment(obj) + end + end + + local r = body.getRotation() + body.setRotationSmooth({ r.x, r.y + (45 * val), r.z }, false, true) + + Wait.time(|| detachLegs(body, numAttachments), 1) +end + +function detachLegs(body, numAttachments) + for i = numAttachments-1,0,-1 do + body.removeAttachment(i) + end + Wait.time(function() IS_ROTATING = false end, 1) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile Atlach-Nacha Helper 8e78c7.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile Atlach-Nacha Helper 8e78c7.yaml new file mode 100644 index 000000000..e573b8e9f --- /dev/null +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a/Custom_Tile Atlach-Nacha Helper 8e78c7.yaml @@ -0,0 +1,46 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 0 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1696129502531615566/5EEBE5EDB93947E2138C14A354A5669C3682256F/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1696129502531615566/5EEBE5EDB93947E2138C14A354A5669C3682256F/ + WidthScale: 0.0 +Description: Rotates Atlach-Nacha with her legs, damage tokens, and card attachments + by the number of spaces displayed. Left-click the number to increase, right-click + to decrease, then click Rotate. +DragSelectable: true +GMNotes: '' +GUID: 8e78c7 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Tile Atlach-Nacha Helper 8e78c7.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Atlach-Nacha Helper +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -25.84 + posY: 1.62 + posZ: 5.9 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Tile Weaver of the Cosmos bbb70a.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Tile Weaver of the Cosmos bbb70a.ttslua index 5fe6a166c..418a5fce4 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Tile Weaver of the Cosmos bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Tile Weaver of the Cosmos bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'Weaver of the Cosmos' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Weaver of the Cosmos' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.ttslua index 0771ab2f7..28184b1f0 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.ttslua @@ -1,722 +1,722 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {0.902,0.886,0.788} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --1 checkbox - { - pos = {0.306,0.1,0.051}, - size = 250, - state = false - }, - --2 checkbox - { - pos = {0.35,0.1,0.114}, - size = 250, - state = false - }, - --3 checkbox - { - pos = {0.399,0.1,0.169}, - size = 250, - state = false - }, - --4 checkbox - { - pos = {0.455,0.1,0.221}, - size = 250, - state = false - }, - --5 checkbox - { - pos = {0.5,0.1,0.279}, - size = 250, - state = false - }, - --6 checkbox - { - pos = {0.54,0.1,0.334}, - size = 250, - state = false - }, - --7 checkbox - { - pos = {0.568,0.1,0.392}, - size = 250, - state = false - }, - --8 checkbox - { - pos = {0.604,0.1,0.457}, - size = 250, - state = false - }, - --9 checkbox - { - pos = {0.229,0.1,-0.007}, - size = 250, - state = false - }, - --10 checkbox - { - pos = {-0.816,0.1,0.02}, - size = 250, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.50,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.06,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.27}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.27}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.62}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.268}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.62}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.265}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.393,0.1,0.265}, - rows =10, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Killed Investigators - { - pos = {-0.417,0.1,0.881}, - rows = 4, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Evidence of Kadath - { - pos = {-0.388,0.1,0.676}, - rows = 2, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Chaos Bag - { - pos = {0.782,0.1,0.8}, - rows = 10, - width = 1500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {0.902,0.886,0.788} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --1 checkbox + { + pos = {0.306,0.1,0.051}, + size = 250, + state = false + }, + --2 checkbox + { + pos = {0.35,0.1,0.114}, + size = 250, + state = false + }, + --3 checkbox + { + pos = {0.399,0.1,0.169}, + size = 250, + state = false + }, + --4 checkbox + { + pos = {0.455,0.1,0.221}, + size = 250, + state = false + }, + --5 checkbox + { + pos = {0.5,0.1,0.279}, + size = 250, + state = false + }, + --6 checkbox + { + pos = {0.54,0.1,0.334}, + size = 250, + state = false + }, + --7 checkbox + { + pos = {0.568,0.1,0.392}, + size = 250, + state = false + }, + --8 checkbox + { + pos = {0.604,0.1,0.457}, + size = 250, + state = false + }, + --9 checkbox + { + pos = {0.229,0.1,-0.007}, + size = 250, + state = false + }, + --10 checkbox + { + pos = {-0.816,0.1,0.02}, + size = 250, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.50,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.06,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.27}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.27}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.62}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.268}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.62}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.265}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.393,0.1,0.265}, + rows =10, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Killed Investigators + { + pos = {-0.417,0.1,0.881}, + rows = 4, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Evidence of Kadath + { + pos = {-0.388,0.1,0.676}, + rows = 2, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Chaos Bag + { + pos = {0.782,0.1,0.8}, + rows = 10, + width = 1500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.yaml b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.yaml index 2661478c1..cf1ae21b4 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.yaml +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.yaml @@ -424,9 +424,9 @@ Sticky: true Tooltip: true Transform: posX: -1.22 - posY: 1.54 + posY: 1.48 posZ: -26.87 - rotX: 359.35 + rotX: 359.92 rotY: 270.07 rotZ: 0.02 scaleX: 6.5 diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a34f34.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a34f34.ttslua index 4798d294b..daed6bf90 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a34f34.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a34f34.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6.ttslua index c99612b1a..beb7e9fed 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9/Custom_Tile The Dunwich Legacy f5db25.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9/Custom_Tile The Dunwich Legacy f5db25.ttslua index 39ecc5466..cfa110e20 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9/Custom_Tile The Dunwich Legacy f5db25.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9/Custom_Tile The Dunwich Legacy f5db25.ttslua @@ -1,21 +1,21 @@ -name = 'The Dunwich Legacy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Dunwich Legacy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c/Custom_Tile The Dunwich Legacy b5928a.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c/Custom_Tile The Dunwich Legacy b5928a.ttslua index 39ecc5466..cfa110e20 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c/Custom_Tile The Dunwich Legacy b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c/Custom_Tile The Dunwich Legacy b5928a.ttslua @@ -1,21 +1,21 @@ -name = 'The Dunwich Legacy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Dunwich Legacy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf/Custom_Tile The Miskatonic Museum 703373.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf/Custom_Tile The Miskatonic Museum 703373.ttslua index ca89f18f6..f92a55f33 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf/Custom_Tile The Miskatonic Museum 703373.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf/Custom_Tile The Miskatonic Museum 703373.ttslua @@ -1,25 +1,25 @@ -name = 'The Miskatonic Museum' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Miskatonic Museum' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449/Custom_Tile The Essex County Express 247967.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449/Custom_Tile The Essex County Express 247967.ttslua index 9ff549176..8942d6ff8 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449/Custom_Tile The Essex County Express 247967.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449/Custom_Tile The Essex County Express 247967.ttslua @@ -1,25 +1,25 @@ -name = 'The Essex County Express' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Essex County Express' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d/Custom_Tile Blood on the Altar 92b54a.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d/Custom_Tile Blood on the Altar 92b54a.ttslua index b50b2762f..35359436c 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d/Custom_Tile Blood on the Altar 92b54a.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d/Custom_Tile Blood on the Altar 92b54a.ttslua @@ -1,25 +1,25 @@ -name = 'Blood on the Altar' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Blood on the Altar' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce/Custom_Tile Undimensioned and Unseen 393c71.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce/Custom_Tile Undimensioned and Unseen 393c71.ttslua index 4da502b94..796c0adfa 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce/Custom_Tile Undimensioned and Unseen 393c71.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce/Custom_Tile Undimensioned and Unseen 393c71.ttslua @@ -1,25 +1,25 @@ -name = 'Undimensioned and Unseen' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Undimensioned and Unseen' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf/Custom_Tile Where Doom Awaits a621ae.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf/Custom_Tile Where Doom Awaits a621ae.ttslua index 5f3588cb8..c8658d789 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf/Custom_Tile Where Doom Awaits a621ae.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf/Custom_Tile Where Doom Awaits a621ae.ttslua @@ -1,25 +1,25 @@ -name = 'Where Doom Awaits' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Where Doom Awaits' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060/Custom_Tile Lost in Time and Space 64a607.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060/Custom_Tile Lost in Time and Space 64a607.ttslua index 09337160a..a649f8c03 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060/Custom_Tile Lost in Time and Space 64a607.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060/Custom_Tile Lost in Time and Space 64a607.ttslua @@ -1,25 +1,25 @@ -name = 'Lost in Time and Space' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Lost in Time and Space' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua index 3d43d4f4c..690a83709 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua @@ -1,669 +1,669 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First checkbox --- { --- pos = {-0.62,0.1,0.056}, --- size = 400, --- state = false --- }, - --Second checkbox --- { --- pos = {-0.629,0.1,0.199}, --- size = 400, --- state = false --- }, - --Third checkbox --- { --- pos = {-0.594,0.1,0.355}, --- size = 400, --- state = false --- }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.45,0.1,0.55}, - rows =18, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.384,0.1,0.228}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists interrogated - { - pos = {0.384,0.1,0.69}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First checkbox +-- { +-- pos = {-0.62,0.1,0.056}, +-- size = 400, +-- state = false +-- }, + --Second checkbox +-- { +-- pos = {-0.629,0.1,0.199}, +-- size = 400, +-- state = false +-- }, + --Third checkbox +-- { +-- pos = {-0.594,0.1,0.355}, +-- size = 400, +-- state = false +-- }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.45,0.1,0.55}, + rows =18, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.384,0.1,0.228}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists interrogated + { + pos = {0.384,0.1,0.69}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 5889dd.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 5889dd.ttslua index 4798d294b..daed6bf90 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 5889dd.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 5889dd.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 03b888.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 03b888.ttslua index 4798d294b..daed6bf90 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 03b888.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 03b888.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19.ttslua index c99612b1a..beb7e9fed 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956/Custom_Tile The Forgotten Age e95200.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956/Custom_Tile The Forgotten Age e95200.ttslua index 200437b6c..75c4561fb 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956/Custom_Tile The Forgotten Age e95200.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956/Custom_Tile The Forgotten Age e95200.ttslua @@ -1,21 +1,21 @@ -name = 'The Forgotten Age' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Forgotten Age' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1/Custom_Tile The Doom of Eztli 294ec4.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1/Custom_Tile The Doom of Eztli 294ec4.ttslua index 5672c33bc..25a046b6a 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1/Custom_Tile The Doom of Eztli 294ec4.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1/Custom_Tile The Doom of Eztli 294ec4.ttslua @@ -1,25 +1,25 @@ -name = 'The Doom of Eztli' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Doom of Eztli' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8/Custom_Tile Threads of Fate 7a95f6.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8/Custom_Tile Threads of Fate 7a95f6.ttslua index 0d6a8bd42..aa256f497 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8/Custom_Tile Threads of Fate 7a95f6.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8/Custom_Tile Threads of Fate 7a95f6.ttslua @@ -1,25 +1,25 @@ -name = 'Threads of Fate' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Threads of Fate' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f/Custom_Tile The Boundary Beyond 010761.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f/Custom_Tile The Boundary Beyond 010761.ttslua index f46c523bf..88130bf52 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f/Custom_Tile The Boundary Beyond 010761.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f/Custom_Tile The Boundary Beyond 010761.ttslua @@ -1,25 +1,25 @@ -name = 'The Boundary Beyond' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Boundary Beyond' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00/Custom_Tile Heart of the Elders 493cb1.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00/Custom_Tile Heart of the Elders 493cb1.ttslua index 5a7299c73..4f3609807 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00/Custom_Tile Heart of the Elders 493cb1.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00/Custom_Tile Heart of the Elders 493cb1.ttslua @@ -1,25 +1,25 @@ -name = 'Heart of the Elders' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Heart of the Elders' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 2 5b2403.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 2 5b2403.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 2 5b2403.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 2 5b2403.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce/Custom_Tile The City of Archives 2fb6dc.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce/Custom_Tile The City of Archives 2fb6dc.ttslua index 3224092d4..787f8705f 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce/Custom_Tile The City of Archives 2fb6dc.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce/Custom_Tile The City of Archives 2fb6dc.ttslua @@ -1,25 +1,25 @@ -name = 'The City of Archives' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The City of Archives' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Tile The Depths of Yoth 7aa4e3.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Tile The Depths of Yoth 7aa4e3.ttslua index e569e19b2..7d9affdc4 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Tile The Depths of Yoth 7aa4e3.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Tile The Depths of Yoth 7aa4e3.ttslua @@ -1,25 +1,25 @@ -name = 'The Depths of Yoth' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Depths of Yoth' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - EasyStandard dd61f1.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - EasyStandard dd61f1.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - EasyStandard dd61f1.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - EasyStandard dd61f1.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - HardExpert 2da146.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - HardExpert 2da146.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - HardExpert 2da146.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - HardExpert 2da146.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d/Custom_Tile Shattered Aeons 6dc72a.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d/Custom_Tile Shattered Aeons 6dc72a.ttslua index b31a42434..b78ce3eb4 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d/Custom_Tile Shattered Aeons 6dc72a.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d/Custom_Tile Shattered Aeons 6dc72a.ttslua @@ -1,21 +1,21 @@ -name = 'Shattered Aeons' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Shattered Aeons' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 9 Secret Scenario c52079.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 9 Secret Scenario c52079.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 9 Secret Scenario c52079.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 9 Secret Scenario c52079.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua index 682c9d34c..3e3ff898f 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua @@ -1,691 +1,691 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Yig's Fury - { - pos = {0.097,0.1,0.88}, - size = 500, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one Supplies - { - pos = {-0.637,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two supplies - { - pos = {-0.2,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three supplies - { - pos = {0.24,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four supplies - { - pos = {0.671,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.475,0.1,0.62}, - rows =12, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.527,0.1,0.507}, - rows = 12, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Yig's Fury + { + pos = {0.097,0.1,0.88}, + size = 500, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one Supplies + { + pos = {-0.637,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two supplies + { + pos = {-0.2,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three supplies + { + pos = {0.24,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four supplies + { + pos = {0.671,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.475,0.1,0.62}, + rows =12, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.527,0.1,0.507}, + rows = 12, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 10bd18.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 10bd18.ttslua index 4798d294b..daed6bf90 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 10bd18.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 10bd18.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.ttslua index c99612b1a..beb7e9fed 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.yaml index 7c42d4e0e..6f992374f 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.yaml @@ -4,6 +4,8 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: +- !include 'Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil + Reef 7ced47.yaml' - !include 'Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.yaml' - !include 'Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The @@ -42,7 +44,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: false LuaScript: !include 'Custom_Model_Bag The Innsmouth Conspiracy 465aab.ttslua' -LuaScriptState: '{"ml":{"8c6d05":{"lock":false,"pos":{"x":12.2498617172241,"y":1.46560549736023,"z":3.98637843132019},"rot":{"x":359.920135498047,"y":269.999938964844,"z":0.0168737974017859}},"c09838":{"lock":false,"pos":{"x":12.2519626617432,"y":1.46795845031738,"z":11.9863872528076},"rot":{"x":359.920135498047,"y":269.999969482422,"z":0.0168738570064306}},"c3844b":{"lock":false,"pos":{"x":-1.85711514949799,"y":1.49247181415558,"z":28.4344081878662},"rot":{"x":359.920135498047,"y":269.997497558594,"z":0.0168756488710642}},"c3a225":{"lock":false,"pos":{"x":12.2494630813599,"y":1.46325051784515,"z":-4.01362371444702},"rot":{"x":359.920135498047,"y":269.999969482422,"z":0.0168740749359131}},"f40183":{"lock":false,"pos":{"x":-1.46566390991211,"y":1.4756224155426,"z":-26.9309825897217},"rot":{"x":359.920135498047,"y":270.00390625,"z":0.0168663803488016}}}}' +LuaScriptState: '{"ml":{"7ced47":{"lock":false,"pos":{"x":12.2501277923584,"y":1.46089363098145,"z":-12.0136613845825},"rot":{"x":359.920135498047,"y":269.999908447266,"z":0.0168741159141064}},"8c6d05":{"lock":false,"pos":{"x":12.2498655319214,"y":1.46560561656952,"z":3.98637819290161},"rot":{"x":359.920135498047,"y":269.999938964844,"z":0.016873586922884}},"c09838":{"lock":false,"pos":{"x":12.2519645690918,"y":1.46795833110809,"z":11.9863882064819},"rot":{"x":359.920135498047,"y":269.999969482422,"z":0.0168738402426243}},"c3844b":{"lock":false,"pos":{"x":-1.85711562633514,"y":1.492471575737,"z":28.4344139099121},"rot":{"x":359.920135498047,"y":269.997497558594,"z":0.016875471919775}},"c3a225":{"lock":false,"pos":{"x":12.2494659423828,"y":1.46325016021729,"z":-4.01362419128418},"rot":{"x":359.920135498047,"y":269.999938964844,"z":0.0168740376830101}},"f40183":{"lock":false,"pos":{"x":-1.46565198898315,"y":1.47562229633331,"z":-26.9309902191162},"rot":{"x":359.920135498047,"y":270.004089355469,"z":0.0168659463524818}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838/Custom_Tile The Innsmouth Conspiracy 16562e.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838/Custom_Tile The Innsmouth Conspiracy 16562e.ttslua index 1f1e08361..f8bd0074b 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838/Custom_Tile The Innsmouth Conspiracy 16562e.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838/Custom_Tile The Innsmouth Conspiracy 16562e.ttslua @@ -1,21 +1,21 @@ -name = 'The Innsmouth Conspiracy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Innsmouth Conspiracy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.yaml index b13b3827e..b80567701 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.yaml @@ -19,6 +19,8 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: +- !include 'Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The + Vanishing of Elina Harper 16562e.yaml' - !include 'Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile 0f3a96.yaml' - !include 'Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Card The Little Bookshop 2c6d3b.yaml' @@ -87,7 +89,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: false LuaScript: !include 'Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.ttslua' -LuaScriptState: '{"ml":{"0f3a96":{"lock":false,"pos":{"x":-34.2316017150879,"y":1.63262534141541,"z":11.693302154541},"rot":{"x":359.955413818359,"y":224.999908447266,"z":0.0683813542127609}},"2c6d3b":{"lock":false,"pos":{"x":-30.2241992950439,"y":1.64166986942291,"z":15.1899995803833},"rot":{"x":359.920104980469,"y":269.999877929688,"z":0.0168398283421993}},"3359db":{"lock":false,"pos":{"x":-32.8963012695313,"y":1.62404119968414,"z":-11.1805019378662},"rot":{"x":359.931579589844,"y":315,"z":359.955413818359}},"360107":{"lock":false,"pos":{"x":-4.10027408599854,"y":1.64185810089111,"z":16.465877532959},"rot":{"x":359.919738769531,"y":270.000152587891,"z":180.016830444336}},"392d3e":{"lock":false,"pos":{"x":-36.7731018066406,"y":1.64856243133545,"z":7.56999921798706},"rot":{"x":359.920104980469,"y":269.997772216797,"z":0.0168427284806967}},"3a4050":{"lock":false,"pos":{"x":-27.228099822998,"y":1.62276828289032,"z":11.3824996948242},"rot":{"x":359.931579589844,"y":315.000091552734,"z":359.955413818359}},"3b60c1":{"lock":false,"pos":{"x":-30.2243003845215,"y":1.62582564353943,"z":7.57000017166138},"rot":{"x":359.920104980469,"y":270.00927734375,"z":0.0168530736118555}},"62791a":{"lock":false,"pos":{"x":-27.0009994506836,"y":1.62018251419067,"z":3.66190075874329},"rot":{"x":359.955413818359,"y":224.999984741211,"z":0.068380780518055}},"7234af":{"lock":false,"pos":{"x":-33.4277000427246,"y":1.62693536281586,"z":-3.85319948196411},"rot":{"x":359.955413818359,"y":224.996597290039,"z":0.0683845430612564}},"7556a4":{"lock":false,"pos":{"x":-2.68849968910217,"y":1.59734869003296,"z":-5.048499584198},"rot":{"x":0.0168359950184822,"y":180,"z":0.080255039036274}},"785a9e":{"lock":false,"pos":{"x":-7.88368225097656,"y":1.61057507991791,"z":15.2385272979736},"rot":{"x":359.920867919922,"y":270.003845214844,"z":0.0163123663514853}},"8984ad":{"lock":false,"pos":{"x":-23.6767997741699,"y":1.62581276893616,"z":-7.70000028610229},"rot":{"x":359.920104980469,"y":270.019378662109,"z":0.0168126486241817}},"9c140b":{"lock":false,"pos":{"x":-26.767599105835,"y":1.61765778064728,"z":-3.82140016555786},"rot":{"x":359.931579589844,"y":314.977905273438,"z":359.955444335938}},"9c6651":{"lock":false,"pos":{"x":-30.2273616790771,"y":1.49182748794556,"z":-7.68851900100708},"rot":{"x":0.141018375754356,"y":269.889678955078,"z":355.192443847656}},"a45247":{"lock":false,"pos":{"x":1.6961008310318,"y":1.55831706523895,"z":14.2788019180298},"rot":{"x":359.955139160156,"y":224.998001098633,"z":0.068672738969326}},"aeb649":{"lock":false,"pos":{"x":-2.72469973564148,"y":1.6159462928772,"z":0.373300343751907},"rot":{"x":0.0168358720839024,"y":179.999893188477,"z":0.0802557766437531}},"b6b9b7":{"lock":false,"pos":{"x":-36.7732009887695,"y":1.6440749168396,"z":-7.70000123977661},"rot":{"x":359.920104980469,"y":269.999816894531,"z":0.0168399270623922}},"c150be":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.63030004501343,"z":7.56999969482422},"rot":{"x":359.920104980469,"y":269.999877929688,"z":0.016839848831296}},"d1bf92":{"lock":false,"pos":{"x":-3.92760038375854,"y":1.72993636131287,"z":5.75770092010498},"rot":{"x":359.919738769531,"y":269.99951171875,"z":180.016815185547}},"d28cd1":{"lock":false,"pos":{"x":-30.2241992950439,"y":1.63719689846039,"z":-0.0300001557916403},"rot":{"x":359.920104980469,"y":269.999755859375,"z":0.016839936375618}},"d5f792":{"lock":false,"pos":{"x":-33.2551002502441,"y":1.62890481948853,"z":3.66560053825378},"rot":{"x":359.931579589844,"y":315.000030517578,"z":359.955413818359}},"d9882d":{"lock":false,"pos":{"x":-27.0109996795654,"y":1.61566078662872,"z":-11.7710008621216},"rot":{"x":359.955413818359,"y":224.999923706055,"z":0.0683760941028595}},"e8fcf0":{"lock":false,"pos":{"x":-30.2243003845215,"y":1.63271510601044,"z":-15.2799997329712},"rot":{"x":359.920104980469,"y":269.999908447266,"z":0.016839699819684}},"ee32d2":{"lock":false,"pos":{"x":-3.95590043067932,"y":1.59753930568695,"z":-10.4412021636963},"rot":{"x":359.919738769531,"y":269.982727050781,"z":0.0168614368885756}},"f3ec1a":{"lock":false,"pos":{"x":-4.13920640945435,"y":1.64114463329315,"z":13.8521060943604},"rot":{"x":359.919738769531,"y":269.999938964844,"z":180.016830444336}}}}' +LuaScriptState: '{"ml":{"0f3a96":{"lock":false,"pos":{"x":-34.2316017150879,"y":1.63262534141541,"z":11.6933040618896},"rot":{"x":359.955413818359,"y":224.999816894531,"z":0.0683767721056938}},"16562e":{"lock":false,"pos":{"x":-4.00748586654663,"y":1.58268630504608,"z":-14.9348430633545},"rot":{"x":359.919555664063,"y":270.62158203125,"z":0.0159660521894693}},"2c6d3b":{"lock":false,"pos":{"x":-30.2241992950439,"y":1.64166986942291,"z":15.189998626709},"rot":{"x":359.920104980469,"y":269.999847412109,"z":0.0168398693203926}},"3359db":{"lock":false,"pos":{"x":-32.8963012695313,"y":1.62404108047485,"z":-11.1805028915405},"rot":{"x":359.931579589844,"y":314.999908447266,"z":359.955413818359}},"360107":{"lock":false,"pos":{"x":-4.10027503967285,"y":1.64185810089111,"z":16.4658794403076},"rot":{"x":359.919738769531,"y":270.000152587891,"z":180.016830444336}},"392d3e":{"lock":false,"pos":{"x":-36.7731018066406,"y":1.64856243133545,"z":7.5699987411499},"rot":{"x":359.920104980469,"y":269.997741699219,"z":0.0168427955359221}},"3a4050":{"lock":false,"pos":{"x":-27.228099822998,"y":1.62276828289032,"z":11.3825006484985},"rot":{"x":359.931579589844,"y":315.000122070313,"z":359.955413818359}},"3b60c1":{"lock":false,"pos":{"x":-30.2243003845215,"y":1.62582564353943,"z":7.56999969482422},"rot":{"x":359.920104980469,"y":270.009216308594,"z":0.0168544296175241}},"62791a":{"lock":false,"pos":{"x":-27.0009994506836,"y":1.62018239498138,"z":3.66190147399902},"rot":{"x":359.955413818359,"y":224.999984741211,"z":0.0683809816837311}},"7234af":{"lock":false,"pos":{"x":-33.4277000427246,"y":1.62693536281586,"z":-3.85319948196411},"rot":{"x":359.955413818359,"y":224.996597290039,"z":0.068381778895855}},"7556a4":{"lock":false,"pos":{"x":-2.68849968910217,"y":1.59734869003296,"z":-5.04849910736084},"rot":{"x":0.0168360080569983,"y":180,"z":0.0802551135420799}},"785a9e":{"lock":false,"pos":{"x":-7.88368320465088,"y":1.61056900024414,"z":15.2385272979736},"rot":{"x":359.921600341797,"y":270.003845214844,"z":0.0167044159024954}},"8984ad":{"lock":false,"pos":{"x":-23.6767978668213,"y":1.62581276893616,"z":-7.70000028610229},"rot":{"x":359.920104980469,"y":270.019287109375,"z":0.0168125182390213}},"9c140b":{"lock":false,"pos":{"x":-26.767599105835,"y":1.61765778064728,"z":-3.82140040397644},"rot":{"x":359.931579589844,"y":314.977905273438,"z":359.955444335938}},"9c6651":{"lock":false,"pos":{"x":-30.2298126220703,"y":1.49485957622528,"z":-7.66663932800293},"rot":{"x":0.397051692008972,"y":269.543975830078,"z":352.934112548828}},"a45247":{"lock":false,"pos":{"x":1.69610095024109,"y":1.55831742286682,"z":14.2788038253784},"rot":{"x":359.955139160156,"y":224.997970581055,"z":0.0686724036931992}},"aeb649":{"lock":false,"pos":{"x":-2.7246994972229,"y":1.6159462928772,"z":0.373300731182098},"rot":{"x":0.0168358944356442,"y":179.999893188477,"z":0.0802557542920113}},"b6b9b7":{"lock":false,"pos":{"x":-36.7732009887695,"y":1.6440749168396,"z":-7.70000267028809},"rot":{"x":359.920104980469,"y":269.999816894531,"z":0.0168398804962635}},"c150be":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.63030004501343,"z":7.5699987411499},"rot":{"x":359.920104980469,"y":269.999816894531,"z":0.0168398134410381}},"d1bf92":{"lock":false,"pos":{"x":-3.9276008605957,"y":1.72993648052216,"z":5.7577018737793},"rot":{"x":359.919738769531,"y":269.99951171875,"z":180.016815185547}},"d28cd1":{"lock":false,"pos":{"x":-30.2241992950439,"y":1.63719689846039,"z":-0.0300004538148642},"rot":{"x":359.920104980469,"y":269.999755859375,"z":0.0168399680405855}},"d5f792":{"lock":false,"pos":{"x":-33.2551002502441,"y":1.62890458106995,"z":3.66560101509094},"rot":{"x":359.931579589844,"y":315.000061035156,"z":359.955413818359}},"d9882d":{"lock":false,"pos":{"x":-27.0109996795654,"y":1.61566078662872,"z":-11.7710018157959},"rot":{"x":359.955413818359,"y":224.999969482422,"z":0.068376362323761}},"e8fcf0":{"lock":false,"pos":{"x":-30.2243003845215,"y":1.63271510601044,"z":-15.2799997329712},"rot":{"x":359.920104980469,"y":269.999908447266,"z":0.0168397668749094}},"ee32d2":{"lock":false,"pos":{"x":-3.95590043067932,"y":1.59753930568695,"z":-10.4412040710449},"rot":{"x":359.919738769531,"y":269.982727050781,"z":0.0168613940477371}},"f3ec1a":{"lock":false,"pos":{"x":-4.1392068862915,"y":1.64114463329315,"z":13.8521070480347},"rot":{"x":359.919738769531,"y":269.999969482422,"z":180.016830444336}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile 9c6651.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile 9c6651.yaml index 1e786b787..036e3b948 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile 9c6651.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile 9c6651.yaml @@ -125,10 +125,10 @@ Tooltip: true Transform: posX: -30.23 posY: 1.49 - posZ: -7.69 - rotX: 0.37 - rotY: 269.96 - rotZ: 352.92 + posZ: -7.67 + rotX: 0.4 + rotY: 269.54 + rotZ: 352.93 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.ttslua new file mode 100644 index 000000000..480e70b7b --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.ttslua @@ -0,0 +1,25 @@ +name = 'The Vanishing of Elina Harper' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.yaml new file mode 100644 index 000000000..8c4431983 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/EcbhVuh.jpg/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/965354846165100486/3DC8FCEF364B30758B09EF96AF9458F2B8E64D56/ + WidthScale: 0.0 +Description: click to set chaos token difficulty +DragSelectable: true +GMNotes: '' +GUID: 16562e +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Tile The Vanishing of Elina Harper 16562e.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: The Vanishing of Elina Harper +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -4.01 + posY: 1.58 + posZ: -14.93 + rotX: 359.92 + rotY: 270.62 + rotZ: 0.02 + scaleX: 2.2 + scaleY: 1.0 + scaleZ: 2.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.yaml index cdb18fc5f..b7134a3f7 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.yaml @@ -19,7 +19,6 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag 3 In Too Deep c3a225/Custom_PDF b71c73.yaml' - !include 'Custom_Model_Bag 3 In Too Deep c3a225/Custom_Token 00d19a.yaml' - !include 'Custom_Model_Bag 3 In Too Deep c3a225/Custom_Token 026bb9.yaml' - !include 'Custom_Model_Bag 3 In Too Deep c3a225/Deck Encounter Deck 0326ec.yaml' @@ -62,6 +61,7 @@ ContainedObjects: - !include 'Custom_Model_Bag 3 In Too Deep c3a225/Custom_Model_Bag Set-aside a45247.yaml' - !include 'Custom_Model_Bag 3 In Too Deep c3a225/Custom_Token b228a8.yaml' - !include 'Custom_Model_Bag 3 In Too Deep c3a225/Custom_Token b6e32d.yaml' +- !include 'Custom_Model_Bag 3 In Too Deep c3a225/Custom_PDF b71c73.yaml' - !include 'Custom_Model_Bag 3 In Too Deep c3a225/Card Through the Labyrinth b8638a.yaml' - !include 'Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile In Too Deep bbb70a.yaml' - !include 'Custom_Model_Bag 3 In Too Deep c3a225/Card Shoreward Slums c0d0df.yaml' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a.yaml index 4fb8bc4a0..eff379a23 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a.yaml @@ -2,13 +2,13 @@ Autoraise: true ColorDiffuse: b: 0.606999934 g: 0.694 - r: 0.128999382 + r: 0.128999323 ContainedObjects: -- !include 'Bag Keys 99972a/Custom_Tile f2a6d9.yaml' -- !include 'Bag Keys 99972a/Custom_Tile a359d6.yaml' - !include 'Bag Keys 99972a/Custom_Tile 8bde30.yaml' - !include 'Bag Keys 99972a/Custom_Tile d70b36.yaml' - !include 'Bag Keys 99972a/Custom_Tile 429c04.yaml' +- !include 'Bag Keys 99972a/Custom_Tile f2a6d9.yaml' +- !include 'Bag Keys 99972a/Custom_Tile a359d6.yaml' - !include 'Bag Keys 99972a/Custom_Tile 480325.yaml' Description: '' DragSelectable: true diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 429c04.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 429c04.yaml index 047b205a6..2e85837f7 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 429c04.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 429c04.yaml @@ -32,12 +32,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 17.21 - posY: 3.41 - posZ: -52.8 - rotX: 0.02 + posX: -17.12 + posY: 3.8 + posZ: -0.03 + rotX: 0.17 rotY: 270.0 - rotZ: 0.02 + rotZ: 179.96 scaleX: 0.55 scaleY: 1.0 scaleZ: 0.55 diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 480325.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 480325.yaml index a36f2a237..1078562dc 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 480325.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 480325.yaml @@ -32,12 +32,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 15.43 - posY: 3.7 - posZ: -50.66 - rotX: 0.03 - rotY: 269.98 - rotZ: 327.64 + posX: -17.12 + posY: 3.79 + posZ: -0.03 + rotX: 0.62 + rotY: 270.0 + rotZ: 179.85 scaleX: 0.55 scaleY: 1.0 scaleZ: 0.55 diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 8bde30.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 8bde30.yaml index 7ceb80c54..604afb9b0 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 8bde30.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile 8bde30.yaml @@ -32,12 +32,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 13.73 - posY: 3.47 - posZ: -52.2 - rotX: 0.63 - rotY: 270.15 - rotZ: 5.52 + posX: -13.73 + posY: 1.7 + posZ: 1.25 + rotX: 359.92 + rotY: 270.0 + rotZ: 180.02 scaleX: 0.55 scaleY: 1.0 scaleZ: 0.55 diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile a359d6.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile a359d6.yaml index f0d185bc0..799c6e584 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile a359d6.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile a359d6.yaml @@ -32,12 +32,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 13.62 - posY: 3.4 - posZ: -49.87 - rotX: 0.02 + posX: -13.91 + posY: 1.7 + posZ: -0.38 + rotX: 359.92 rotY: 270.0 - rotZ: 0.02 + rotZ: 180.02 scaleX: 0.55 scaleY: 1.0 scaleZ: 0.55 diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile d70b36.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile d70b36.yaml index 912759d2b..0e294d992 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile d70b36.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile d70b36.yaml @@ -32,12 +32,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 13.47 - posY: 3.31 - posZ: -52.14 - rotX: 359.06 - rotY: 269.86 - rotZ: 4.49 + posX: -14.95 + posY: 1.7 + posZ: 2.93 + rotX: 359.92 + rotY: 270.0 + rotZ: 180.02 scaleX: 0.55 scaleY: 1.0 scaleZ: 0.55 diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile f2a6d9.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile f2a6d9.yaml index af4b0a135..dc60d4d96 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile f2a6d9.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Bag Keys 99972a/Custom_Tile f2a6d9.yaml @@ -32,12 +32,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 13.78 - posY: 3.41 - posZ: -51.16 - rotX: 359.54 + posX: -15.04 + posY: 1.7 + posZ: -2.27 + rotX: 359.92 rotY: 270.0 - rotZ: 0.42 + rotZ: 180.02 scaleX: 0.55 scaleY: 1.0 scaleZ: 0.55 diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile Flood Token eeb375.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile Flood Token eeb375.yaml index 0ac0d2722..20b9ad2a8 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile Flood Token eeb375.yaml +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile Flood Token eeb375.yaml @@ -33,9 +33,9 @@ Sticky: true Tooltip: true Transform: posX: -37.65 - posY: 1.64 + posY: 1.65 posZ: -16.73 - rotX: 359.91 + rotX: 359.94 rotY: 270.0 rotZ: 1.83 scaleX: 0.51 diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile In Too Deep bbb70a.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile In Too Deep bbb70a.ttslua index 6da01d7cc..74f4e72ef 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile In Too Deep bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile In Too Deep bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'In Too Deep' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'In Too Deep' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.ttslua new file mode 100644 index 000000000..5aa27be92 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.ttslua @@ -0,0 +1,503 @@ +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.yaml new file mode 100644 index 000000000..96f035322 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.yaml @@ -0,0 +1,100 @@ +AttachedDecals: +- CustomDecal: + ImageURL: http://cloud-3.steamusercontent.com/ugc/959719855119695911/931B9829687A20F4DEADB36DA57B7E6D76792231/ + Name: dunwich_back + Size: 7.4 + Transform: + posX: -0.0021877822 + posY: -0.08963572 + posZ: -0.00288731651 + rotX: 270.0 + rotY: 359.869568 + rotZ: 0.0 + scaleX: 2.00000215 + scaleY: 2.00000238 + scaleZ: 2.00000262 +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Deck Temples of the Union 03f2d2.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Card Fishing Vessel 1b4fad.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Card Thomas Dawson 1f7e6e.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Flood Token 2b06f0.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Deck Deep One Grottos 2dea23.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Bag Otherwise 33d465.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Deck Tidal Tunnel Deck 3d5b6e.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile 429c04.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens + 457419.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile 47aa44.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens + 47b626.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens + 4bec3c.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Notecard 7e3c60.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Card Churning Waters 863c96.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Deck Encounter Deck 8cbe29.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile a359d6.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Custom_PDF b71c73.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Bag Memory Recovered A Battle With + a Horrifying Devil ce45f7.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Deck Cyclopean Ruins db3d41.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Deck Devil Reefs df464a.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Card Scenario f724f6.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens + fe6f38.yaml' +- !include 'Custom_Model_Bag 4 Devil Reef 7ced47/Card Reef of Mysteries fff4bf.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1655599785041522964/8FA86C29491740F61FA1D5C66716C65DA7632CF3/ + MaterialIndex: 3 + MeshURL: https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj + NormalURL: '' + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7ced47 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag 4 Devil Reef 7ced47.ttslua' +LuaScriptState: '{"ml":{"03f2d2":{"lock":false,"pos":{"x":-19.198823928833,"y":1.63660669326782,"z":-7.41333341598511},"rot":{"x":359.920104980469,"y":269.999938964844,"z":0.0168411899358034}},"1b4fad":{"lock":false,"pos":{"x":-33.1410827636719,"y":1.65547871589661,"z":-0.0487568117678165},"rot":{"x":0.452195674180985,"y":269.997894287109,"z":0.0168655049055815}},"1f7e6e":{"lock":false,"pos":{"x":-30.2241764068604,"y":1.63834011554718,"z":3.85998702049255},"rot":{"x":359.920104980469,"y":269.999755859375,"z":0.0168400518596172}},"2b06f0":{"lock":false,"pos":{"x":-29.4579124450684,"y":1.73674738407135,"z":-1.57321524620056},"rot":{"x":359.97509765625,"y":269.941253662109,"z":181.681228637695}},"2dea23":{"lock":false,"pos":{"x":-19.2135334014893,"y":1.63872611522675,"z":-0.271478444337845},"rot":{"x":359.920104980469,"y":270.019470214844,"z":0.0168139021843672}},"33d465":{"lock":false,"pos":{"x":-2.62676882743835,"y":1.39977955818176,"z":-1.11660575866699},"rot":{"x":359.983154296875,"y":2.30986443057191E-05,"z":359.919677734375}},"3d5b6e":{"lock":false,"pos":{"x":0.739418745040894,"y":1.64155220985413,"z":5.72908687591553},"rot":{"x":359.919738769531,"y":269.999725341797,"z":0.0168405678123236}},"429c04":{"lock":false,"pos":{"x":-14.3120603561401,"y":1.60404407978058,"z":8.95496463775635},"rot":{"x":0.016834132373333,"y":179.999755859375,"z":0.0798998475074768}},"457419":{"lock":false,"pos":{"x":-17.1200370788574,"y":1.65833747386932,"z":-15.2800197601318},"rot":{"x":359.920104980469,"y":269.999755859375,"z":0.0168514419347048}},"47aa44":{"lock":false,"pos":{"x":-11.7806797027588,"y":1.59976744651794,"z":6.41307020187378},"rot":{"x":359.983154296875,"y":0.000726366823073477,"z":359.920104980469}},"47b626":{"lock":false,"pos":{"x":-43.3699684143066,"y":1.70389592647552,"z":15.1899862289429},"rot":{"x":359.920104980469,"y":270.000091552734,"z":0.0168501008301973}},"4bec3c":{"lock":false,"pos":{"x":-43.3700408935547,"y":1.69494128227234,"z":-15.2800168991089},"rot":{"x":359.920104980469,"y":270.000061035156,"z":0.016851557418704}},"7e3c60":{"lock":false,"pos":{"x":-15.5948553085327,"y":1.66510093212128,"z":-3.74399757385254},"rot":{"x":0.0799026787281036,"y":90.0193481445313,"z":359.983184814453}},"863c96":{"lock":false,"pos":{"x":-30.2242908477783,"y":1.63715088367462,"z":-0.0442854017019272},"rot":{"x":359.920532226563,"y":270.000671386719,"z":0.0140526294708252}},"8cbe29":{"lock":false,"pos":{"x":-3.92764377593994,"y":1.76844871044159,"z":5.75713920593262},"rot":{"x":359.919738769531,"y":269.999908447266,"z":180.016815185547}},"99972a":{"lock":false,"pos":{"x":-11.6714706420898,"y":1.4152580499649,"z":8.71882724761963},"rot":{"x":359.920013427734,"y":269.997619628906,"z":0.0168800465762615}},"a359d6":{"lock":false,"pos":{"x":-11.8673753738403,"y":1.60140740871429,"z":11.5826091766357},"rot":{"x":359.920104980469,"y":270,"z":0.0168513767421246}},"a45247":{"lock":false,"pos":{"x":1.69638752937317,"y":1.5583164691925,"z":14.2788696289063},"rot":{"x":359.955139160156,"y":224.99787902832,"z":0.0686701312661171}},"b71c73":{"lock":false,"pos":{"x":-26.4178485870361,"y":1.61551141738892,"z":-9.46666622161865},"rot":{"x":359.920104980469,"y":269.999664306641,"z":0.0168400127440691}},"ce45f7":{"lock":false,"pos":{"x":-2.67772579193115,"y":1.40076732635498,"z":2.00538849830627},"rot":{"x":359.983154296875,"y":0.000144133737194352,"z":359.919677734375}},"db3d41":{"lock":false,"pos":{"x":-19.2110919952393,"y":1.63774025440216,"z":-3.61433815956116},"rot":{"x":359.920104980469,"y":270.003814697266,"z":0.0168354269117117}},"df464a":{"lock":false,"pos":{"x":-17.1199417114258,"y":1.6514630317688,"z":3.8599853515625},"rot":{"x":359.920104980469,"y":269.998291015625,"z":0.0168441496789455}},"edc524":{"lock":false,"pos":{"x":-3.97627353668213,"y":1.58263719081879,"z":-14.9533967971802},"rot":{"x":359.919738769531,"y":270.019897460938,"z":0.0168099906295538}},"eeb51f":{"lock":false,"pos":{"x":-19.1465129852295,"y":1.86955404281616,"z":-0.0595723651349545},"rot":{"x":359.921051025391,"y":270.019592285156,"z":0.0156556870788336}},"f724f6":{"lock":false,"pos":{"x":-3.95589113235474,"y":1.59753930568695,"z":-10.441180229187},"rot":{"x":359.919738769531,"y":269.998809814453,"z":0.0168387722223997}},"fe6f38":{"lock":false,"pos":{"x":-17.1199722290039,"y":1.6672922372818,"z":15.1899824142456},"rot":{"x":359.920104980469,"y":269.999938964844,"z":0.0168540347367525}},"fff4bf":{"lock":false,"pos":{"x":-2.68847942352295,"y":1.59734869003296,"z":-5.04854393005371},"rot":{"x":0.0168257001787424,"y":180.007339477539,"z":0.0802572071552277}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: '4: Devil Reef' +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 12.25 + posY: 1.46 + posZ: -12.01 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 2.21 + scaleY: 0.46 + scaleZ: 2.42 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a.yaml new file mode 100644 index 000000000..53309d5f8 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a.yaml @@ -0,0 +1,41 @@ +Autoraise: true +ColorDiffuse: + b: 0.606999934 + g: 0.694 + r: 0.128998935 +ContainedObjects: +- !include 'Bag Keys 99972a/Custom_Tile 480325.yaml' +- !include 'Bag Keys 99972a/Custom_Tile d70b36.yaml' +- !include 'Bag Keys 99972a/Custom_Tile 8bde30.yaml' +- !include 'Bag Keys 99972a/Custom_Tile f2a6d9.yaml' +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 99972a +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Bag +Nickname: Keys +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -11.67 + posY: 1.42 + posZ: 8.72 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile 480325.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile 480325.yaml new file mode 100644 index 000000000..1078562dc --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile 480325.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125353191/BDEBB5121A07EC12A04E749B335D01A4D4702A43/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125357797/FD3A585D86E22574B815CC630924027284122EF3/ + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '480325' +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 3.79 + posZ: -0.03 + rotX: 0.62 + rotY: 270.0 + rotZ: 179.85 + scaleX: 0.55 + scaleY: 1.0 + scaleZ: 0.55 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile 8bde30.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile 8bde30.yaml new file mode 100644 index 000000000..521e449a2 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile 8bde30.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125353191/BDEBB5121A07EC12A04E749B335D01A4D4702A43/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125361354/DB7B50BCF6C275C3C25843331D5C8EC68A6F9E57/ + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8bde30 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -16.1 + posY: 3.67 + posZ: 0.2 + rotX: 359.58 + rotY: 269.95 + rotZ: 179.82 + scaleX: 0.55 + scaleY: 1.0 + scaleZ: 0.55 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile d70b36.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile d70b36.yaml new file mode 100644 index 000000000..b12432871 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile d70b36.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125353191/BDEBB5121A07EC12A04E749B335D01A4D4702A43/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125354344/74C3014A27A00100FE3A719677CB50677285CB58/ + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d70b36 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 3.8 + posZ: -0.03 + rotX: 0.16 + rotY: 270.05 + rotZ: 184.88 + scaleX: 0.55 + scaleY: 1.0 + scaleZ: 0.55 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile f2a6d9.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile f2a6d9.yaml new file mode 100644 index 000000000..75e74dbed --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Keys 99972a/Custom_Tile f2a6d9.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125353191/BDEBB5121A07EC12A04E749B335D01A4D4702A43/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125360284/CBE3FFC95062445A9B6BC2B585BED340504256F7/ + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f2a6d9 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 3.78 + posZ: -0.03 + rotX: 0.79 + rotY: 270.0 + rotZ: 179.8 + scaleX: 0.55 + scaleY: 1.0 + scaleZ: 0.55 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Memory Recovered A Battle With a Horrifying Devil ce45f7.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Memory Recovered A Battle With a Horrifying Devil ce45f7.yaml new file mode 100644 index 000000000..8a99b5750 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Memory Recovered A Battle With a Horrifying Devil ce45f7.yaml @@ -0,0 +1,183 @@ +Autoraise: true +ColorDiffuse: + b: 0.0 + g: 0.366520882 + r: 0.7058823 +ContainedObjects: +- Autoraise: true + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + ContainedObjects: + - Autoraise: true + CardID: 232803 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2328': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Agenda 2 + DragSelectable: true + GMNotes: '' + GUID: 5337b0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Devil of the Depths + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 29.3399811 + posY: 1.2943697 + posZ: -65.80847 + rotX: 0.01676715 + rotY: 179.99118 + rotZ: 359.9792 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + - Autoraise: true + CardID: 232701 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Agenda 1 + DragSelectable: true + GMNotes: '' + GUID: 2273df + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Secrets of the Sea (v. I) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 29.34005 + posY: 1.33325779 + posZ: -65.80848 + rotX: 0.0168589782 + rotY: 180.022324 + rotZ: 359.9796 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + '2328': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + DeckIDs: + - 232803 + - 232701 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 1a2aa1 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Deck + Nickname: Agenda Deck + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -8.604532 + posY: 3.57035923 + posZ: 24.6358128 + rotX: 357.1575 + rotY: 179.974213 + rotZ: 0.6618065 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ce45f7 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Bag +Nickname: 'Memory Recovered: A Battle With a Horrifying Devil' +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -2.68 + posY: 1.4 + posZ: 2.01 + rotX: 359.98 + rotY: 0.0 + rotZ: 359.92 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Otherwise 33d465.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Otherwise 33d465.yaml new file mode 100644 index 000000000..6c677955e --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Bag Otherwise 33d465.yaml @@ -0,0 +1,183 @@ +Autoraise: true +ColorDiffuse: + b: 0.0 + g: 0.366520882 + r: 0.7058823 +ContainedObjects: +- Autoraise: true + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + ContainedObjects: + - Autoraise: true + CardID: 232803 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2328': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Agenda 2 + DragSelectable: true + GMNotes: '' + GUID: 1b46b6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Devil of the Depths + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 29.340498 + posY: 1.31092453 + posZ: -61.2078743 + rotX: 0.0170351919 + rotY: 181.098938 + rotZ: 0.7764429 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + - Autoraise: true + CardID: 232702 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Agenda 1 + DragSelectable: true + GMNotes: '' + GUID: c32d6a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Secrets of the Sea (v. II) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 29.34069 + posY: 1.35332417 + posZ: -61.2078819 + rotX: 359.893127 + rotY: 179.958176 + rotZ: 0.778648734 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + '2328': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + DeckIDs: + - 232803 + - 232702 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 6b1286 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Deck + Nickname: Agenda Deck + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -8.905521 + posY: 3.599233 + posZ: 20.34537 + rotX: 1.61541271 + rotY: 179.987274 + rotZ: 359.946472 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 33d465 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Bag +Nickname: 'Otherwise:' +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -2.63 + posY: 1.4 + posZ: -1.12 + rotX: 359.98 + rotY: 0.0 + rotZ: 359.92 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Churning Waters 863c96.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Churning Waters 863c96.yaml new file mode 100644 index 000000000..ff2b25f05 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Churning Waters 863c96.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232705 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true +Description: Ocean. +DragSelectable: true +GMNotes: '' +GUID: 863c96 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Churning Waters +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -30.22 + posY: 1.64 + posZ: -0.04 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.01 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Fishing Vessel 1b4fad.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Fishing Vessel 1b4fad.yaml new file mode 100644 index 000000000..d1aa13879 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Fishing Vessel 1b4fad.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232011 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1b4fad +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fishing Vessel +SidewaysCard: false +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -33.14 + posY: 1.66 + posZ: -0.05 + rotX: 0.45 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Reef of Mysteries fff4bf.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Reef of Mysteries fff4bf.yaml new file mode 100644 index 000000000..403fc37a6 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Reef of Mysteries fff4bf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232804 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2328': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true +Description: Act 1 +DragSelectable: true +GMNotes: '' +GUID: fff4bf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Reef of Mysteries +SidewaysCard: true +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -2.69 + posY: 1.6 + posZ: -5.05 + rotX: 0.02 + rotY: 180.01 + rotZ: 0.08 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Scenario f724f6.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Scenario f724f6.yaml new file mode 100644 index 000000000..b1a788bc8 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Scenario f724f6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232700 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true +Description: Devil Reef +DragSelectable: true +GMNotes: '' +GUID: f724f6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scenario +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -3.96 + posY: 1.6 + posZ: -10.44 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Thomas Dawson 1f7e6e.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Thomas Dawson 1f7e6e.yaml new file mode 100644 index 000000000..7492db6af --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Card Thomas Dawson 1f7e6e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 369815 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '3698': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Soldier in a New War +DragSelectable: true +GMNotes: '' +GUID: 1f7e6e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Thomas Dawson +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -30.22 + posY: 1.64 + posZ: 3.86 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247.yaml new file mode 100644 index 000000000..7bfed6a54 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247.yaml @@ -0,0 +1,60 @@ +Autoraise: true +ColorDiffuse: + b: 0.02148666 + g: 0.00100758043 + r: 0.02148666 +ContainedObjects: +- !include 'Custom_Model_Bag Set-aside a45247/Card Waveworn Idol 54fd3f.yaml' +- !include "Custom_Model_Bag Set-aside a45247/Card Headdress of Y\u2019ha-nthlei a4271e.yaml" +- !include 'Custom_Model_Bag Set-aside a45247/Card Awakened Mantle 2afb4a.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://i.imgur.com/yVhOLYs.jpg + MaterialIndex: 1 + MeshURL: https://paste.ee/r/ylQzQ + NormalURL: http://i.imgur.com/f1ogHo6.jpg + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a45247 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Set-aside +PhysicsMaterial: + BounceCombine: 0 + Bounciness: 0.0 + DynamicFriction: 0.6 + FrictionCombine: 0 + StaticFriction: 0.6 +Rigidbody: + AngularDrag: 5.0 + Drag: 5.0 + Mass: 1.375 + UseGravity: true +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 1.7 + posY: 1.56 + posZ: 14.28 + rotX: 359.96 + rotY: 225.0 + rotZ: 0.07 + scaleX: 2.0 + scaleY: 2.0 + scaleZ: 2.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Awakened Mantle 2afb4a.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Awakened Mantle 2afb4a.yaml new file mode 100644 index 000000000..87e3a8c30 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Awakened Mantle 2afb4a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232013 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2afb4a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Awakened Mantle +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 1.7 + posY: 3.66 + posZ: 14.28 + rotX: 359.95 + rotY: 225.0 + rotZ: 0.06 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Headdress of Y’ha-nthlei a4271e.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Headdress of Y’ha-nthlei a4271e.yaml new file mode 100644 index 000000000..a559015e3 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Headdress of Y’ha-nthlei a4271e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232014 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a4271e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "Headdress of Y\u2019ha-nthlei" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 1.7 + posY: 3.66 + posZ: 14.28 + rotX: 359.95 + rotY: 225.0 + rotZ: 0.06 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Waveworn Idol 54fd3f.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Waveworn Idol 54fd3f.yaml new file mode 100644 index 000000000..d9b8fca1d --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Bag Set-aside a45247/Card Waveworn Idol 54fd3f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232012 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 54fd3f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Waveworn Idol +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 1.7 + posY: 3.66 + posZ: 14.28 + rotX: 359.96 + rotY: 225.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 457419.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 457419.yaml new file mode 100644 index 000000000..bfc07e3b7 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 457419.yaml @@ -0,0 +1,98 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125365364/801197D43D3A6871F2E52C6C2D8C0F4B14B7EA01/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125365506/743F6C3A3016BC5EA07DA7A42105ABE6D428E3EE/ + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 2b06f0 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: Flood Token + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 9.398631 + posY: 1.60435748 + posZ: -8.925336 + rotX: 2.32510956e-06 + rotY: 0.0165837 + rotZ: -3.98838756e-06 + scaleX: 0.508209646 + scaleY: 1.0 + scaleZ: 0.508209646 + XmlUI: '' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1626320664125339561/95F05D85CCB68168B62DC7CD702500B222A5068A/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 7 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: '457419' +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Infinite_Bag +Nickname: Flood Tokens +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 1.66 + posZ: -15.28 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.58 + scaleY: 0.58 + scaleZ: 0.58 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 47b626.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 47b626.yaml new file mode 100644 index 000000000..8f45fe60b --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 47b626.yaml @@ -0,0 +1,98 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125365364/801197D43D3A6871F2E52C6C2D8C0F4B14B7EA01/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125365506/743F6C3A3016BC5EA07DA7A42105ABE6D428E3EE/ + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 2b06f0 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: Flood Token + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 9.398631 + posY: 1.60435748 + posZ: -8.925336 + rotX: 2.32510956e-06 + rotY: 0.0165837 + rotZ: -3.98838756e-06 + scaleX: 0.508209646 + scaleY: 1.0 + scaleZ: 0.508209646 + XmlUI: '' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1626320664125339561/95F05D85CCB68168B62DC7CD702500B222A5068A/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 7 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 47b626 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Infinite_Bag +Nickname: Flood Tokens +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -43.37 + posY: 1.7 + posZ: 15.19 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.58 + scaleY: 0.58 + scaleZ: 0.58 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 4bec3c.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 4bec3c.yaml new file mode 100644 index 000000000..3b1b7e62d --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens 4bec3c.yaml @@ -0,0 +1,98 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125365364/801197D43D3A6871F2E52C6C2D8C0F4B14B7EA01/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125365506/743F6C3A3016BC5EA07DA7A42105ABE6D428E3EE/ + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 2b06f0 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: Flood Token + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 9.398631 + posY: 1.60435748 + posZ: -8.925336 + rotX: 2.32510956e-06 + rotY: 0.0165837 + rotZ: -3.98838756e-06 + scaleX: 0.508209646 + scaleY: 1.0 + scaleZ: 0.508209646 + XmlUI: '' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1626320664125339561/95F05D85CCB68168B62DC7CD702500B222A5068A/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 7 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 4bec3c +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Infinite_Bag +Nickname: Flood Tokens +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -43.37 + posY: 1.69 + posZ: -15.28 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.58 + scaleY: 0.58 + scaleZ: 0.58 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens fe6f38.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens fe6f38.yaml new file mode 100644 index 000000000..c8c23e2b5 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Model_Infinite_Bag Flood Tokens fe6f38.yaml @@ -0,0 +1,98 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125365364/801197D43D3A6871F2E52C6C2D8C0F4B14B7EA01/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125365506/743F6C3A3016BC5EA07DA7A42105ABE6D428E3EE/ + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 2b06f0 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: Flood Token + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 9.398631 + posY: 1.60435748 + posZ: -8.925336 + rotX: 2.32510956e-06 + rotY: 0.0165837 + rotZ: -3.98838756e-06 + scaleX: 0.508209646 + scaleY: 1.0 + scaleZ: 0.508209646 + XmlUI: '' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1626320664125339561/95F05D85CCB68168B62DC7CD702500B222A5068A/ + MaterialIndex: 3 + MeshURL: https://pastebin.com/raw/ALrYhQGb + NormalURL: '' + TypeIndex: 7 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fe6f38 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Infinite_Bag +Nickname: Flood Tokens +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 1.67 + posZ: 15.19 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.58 + scaleY: 0.58 + scaleZ: 0.58 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_PDF b71c73.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_PDF b71c73.yaml new file mode 100644 index 000000000..d2863b2c0 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_PDF b71c73.yaml @@ -0,0 +1,39 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomPDF: + PDFPage: 0 + PDFPageOffset: 0 + PDFPassword: '' + PDFUrl: http://cloud-3.steamusercontent.com/ugc/1655599785041530668/3B56888BC5FBE7234CE08A7BA00DE862A7D091F8/ +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b71c73 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_PDF +Nickname: '' +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -26.42 + posY: 1.62 + posZ: -9.47 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 2.18 + scaleY: 1.0 + scaleZ: 2.18 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile 429c04.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile 429c04.yaml new file mode 100644 index 000000000..b03e5d261 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile 429c04.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125353191/BDEBB5121A07EC12A04E749B335D01A4D4702A43/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125424731/54F46CD15EC1DABE9816239302BB29E42CCC41FC/ + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 429c04 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -14.31 + posY: 1.6 + posZ: 8.95 + rotX: 0.02 + rotY: 180.0 + rotZ: 0.08 + scaleX: 0.55 + scaleY: 1.0 + scaleZ: 0.55 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile 47aa44.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile 47aa44.yaml new file mode 100644 index 000000000..099ba4537 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile 47aa44.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125353191/BDEBB5121A07EC12A04E749B335D01A4D4702A43/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125352947/0752FBDD80C0F92FDD27F54549C43F579D1878AB/ + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 47aa44 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -11.78 + posY: 1.6 + posZ: 6.41 + rotX: 359.98 + rotY: 0.0 + rotZ: 359.92 + scaleX: 0.55 + scaleY: 1.0 + scaleZ: 0.55 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile a359d6.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile a359d6.yaml new file mode 100644 index 000000000..47332e317 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile a359d6.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125353191/BDEBB5121A07EC12A04E749B335D01A4D4702A43/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125358977/AECDB2E0C55672BBBDDB70B5944C22A6B677841E/ + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a359d6 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -11.87 + posY: 1.6 + posZ: 11.58 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.55 + scaleY: 1.0 + scaleZ: 0.55 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.ttslua new file mode 100644 index 000000000..798c5fb7e --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.ttslua @@ -0,0 +1,25 @@ +name = 'Devil Reef' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.yaml new file mode 100644 index 000000000..3e087954d --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/949588657194710961/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/965354846165100486/3DC8FCEF364B30758B09EF96AF9458F2B8E64D56/ + WidthScale: 0.0 +Description: click to set chaos token difficulty +DragSelectable: true +GMNotes: '' +GUID: edc524 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Tile Devil Reef edc524.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Devil Reef +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -3.98 + posY: 1.58 + posZ: -14.95 + rotX: 359.92 + rotY: 270.02 + rotZ: 0.02 + scaleX: 2.2 + scaleY: 1.0 + scaleZ: 2.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Flood Token 2b06f0.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Flood Token 2b06f0.yaml new file mode 100644 index 000000000..bfafa0772 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Flood Token 2b06f0.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: true + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1626320664125365364/801197D43D3A6871F2E52C6C2D8C0F4B14B7EA01/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1626320664125365506/743F6C3A3016BC5EA07DA7A42105ABE6D428E3EE/ + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2b06f0 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Flood Token +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -29.46 + posY: 1.74 + posZ: -1.57 + rotX: 359.99 + rotY: 269.94 + rotZ: 181.68 + scaleX: 0.51 + scaleY: 1.0 + scaleZ: 0.51 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Cyclopean Ruins db3d41.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Cyclopean Ruins db3d41.yaml new file mode 100644 index 000000000..22f236d2b --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Cyclopean Ruins db3d41.yaml @@ -0,0 +1,138 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 232715 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: 431ca2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 29.3397465 + posY: 1.40809417 + posZ: -54.7967567 + rotX: 355.876343 + rotY: 270.4008 + rotZ: 0.0158094857 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232716 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: fdf43f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 29.340065 + posY: 1.51308322 + posZ: -54.3084 + rotX: 358.344727 + rotY: 269.99826 + rotZ: 0.02765166 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true +DeckIDs: +- 232715 +- 232716 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: db3d41 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Cyclopean Ruins +SidewaysCard: false +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -19.21 + posY: 1.64 + posZ: -3.61 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Deep One Grottos 2dea23.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Deep One Grottos 2dea23.yaml new file mode 100644 index 000000000..fa5402e62 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Deep One Grottos 2dea23.yaml @@ -0,0 +1,138 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 232714 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: cb5e3e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -23.6764565 + posY: 1.62694967 + posZ: -3.830014 + rotX: 359.9201 + rotY: 270.019531 + rotZ: 0.0168112889 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232713 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: 7d180e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -23.6765 + posY: 1.74755871 + posZ: -3.83000374 + rotX: 2.98576617 + rotY: 269.984558 + rotZ: 0.017181078 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true +DeckIDs: +- 232714 +- 232713 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2dea23 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Deep One Grottos +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -19.21 + posY: 1.64 + posZ: -0.27 + rotX: 359.92 + rotY: 270.02 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Devil Reefs df464a.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Devil Reefs df464a.yaml new file mode 100644 index 000000000..63ff199be --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Devil Reefs df464a.yaml @@ -0,0 +1,276 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 232707 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Ocean. Island. + DragSelectable: true + GMNotes: '' + GUID: 0ac37d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Devil Reef + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -23.6764641 + posY: 1.62806642 + posZ: -0.03001357 + rotX: 359.9201 + rotY: 269.998474 + rotZ: 0.0168406386 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232706 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Ocean. Island. + DragSelectable: true + GMNotes: '' + GUID: ceb95b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Devil Reef + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -26.7325478 + posY: 1.71799827 + posZ: 3.34163046 + rotX: 359.9328 + rotY: 269.9997 + rotZ: 0.0141649619 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232710 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Ocean. Island. + DragSelectable: true + GMNotes: '' + GUID: '344016' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Devil Reef + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -23.6764412 + posY: 1.71084058 + posZ: -0.03001681 + rotX: 359.9201 + rotY: 269.9996 + rotZ: 0.0168424863 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232709 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Ocean. Island. + DragSelectable: true + GMNotes: '' + GUID: f82316 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Devil Reef + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -23.6764412 + posY: 1.66724539 + posZ: -0.0300168749 + rotX: 359.9201 + rotY: 269.999634 + rotZ: 0.0168396328 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232708 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Ocean. Island. + DragSelectable: true + GMNotes: '' + GUID: 0340ea + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Devil Reef + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -23.6764412 + posY: 1.7011658 + posZ: -0.0300168619 + rotX: 359.9201 + rotY: 269.999634 + rotZ: 0.0168401059 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true +DeckIDs: +- 232707 +- 232706 +- 232710 +- 232709 +- 232708 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: df464a +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Devil Reefs +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 1.65 + posZ: 3.86 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Encounter Deck 8cbe29.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Encounter Deck 8cbe29.yaml new file mode 100644 index 000000000..a02b680f0 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Encounter Deck 8cbe29.yaml @@ -0,0 +1,1580 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 232016 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: ab11fd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunting Deep One + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.2316246 + posY: 1.513883 + posZ: -18.0531616 + rotX: 359.920135 + rotY: 270.0017 + rotZ: 0.01687119 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369523 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: f4291b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deep One Assault + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 11.8725967 + posY: 1.34089947 + posZ: 82.76212 + rotX: 0.118274935 + rotY: 269.999817 + rotZ: 0.01677272 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369524 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 4344d5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Undertow + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 11.3592262 + posY: 1.33944142 + posZ: 80.76894 + rotX: 0.08810971 + rotY: 269.9998 + rotZ: 0.0162825752 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232015 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: 2d3d4c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deep One Predator + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.8241434 + posY: 1.47183311 + posZ: -18.34785 + rotX: 359.920135 + rotY: 270.001465 + rotZ: 0.016870765 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369522 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: f0e05f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lurking Deep One + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 11.60603 + posY: 1.366471 + posZ: 79.90241 + rotX: 0.105170369 + rotY: 269.999542 + rotZ: 0.01115249 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369524 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: f367d2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Undertow + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 11.0193453 + posY: 1.28812623 + posZ: 80.76318 + rotX: 0.08810987 + rotY: 269.9998 + rotZ: 0.016282646 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232019 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: '624899' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Horrors from the Deep + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.0593338 + posY: 1.47028339 + posZ: -17.76294 + rotX: 359.920135 + rotY: 270.001953 + rotZ: 0.0168720391 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232021 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. Terror. + DragSelectable: true + GMNotes: '' + GUID: 4184dd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dragged Under + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.3046083 + posY: 1.51424038 + posZ: -17.0757847 + rotX: 359.920135 + rotY: 270.0078 + rotZ: 0.0168617684 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232020 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: de54a6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Stowaway + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.5574188 + posY: 1.51349068 + posZ: -17.94746 + rotX: 359.920135 + rotY: 270.0016 + rotZ: 0.0168725736 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369526 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 80645e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Riptide + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 11.1211653 + posY: 1.34094119 + posZ: 85.8429947 + rotX: 0.0848810747 + rotY: 269.999969 + rotZ: 0.0167570654 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232016 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: e1f2b7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunting Deep One + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.3397713 + posY: 1.47116244 + posZ: -18.18435 + rotX: 359.920135 + rotY: 270.0017 + rotZ: 0.0168714728 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232019 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: 1ebe41 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Horrors from the Deep + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.9074125 + posY: 1.51288879 + posZ: -17.6325779 + rotX: 359.920135 + rotY: 270.001953 + rotZ: 0.0168719124 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369520 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Power. + DragSelectable: true + GMNotes: '' + GUID: d1bfda + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Psychic Pull + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.2425289 + posY: 1.34135616 + posZ: 80.2821045 + rotX: 0.124396808 + rotY: 269.999969 + rotZ: 0.0168060735 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369519 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Monster. + DragSelectable: true + GMNotes: '' + GUID: b1647e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lloigor + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.2348719 + posY: 1.36526859 + posZ: 80.52088 + rotX: 0.103678443 + rotY: 269.999969 + rotZ: 0.0168057662 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369522 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: 49c47e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lurking Deep One + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 11.6065025 + posY: 1.3394593 + posZ: 79.88358 + rotX: 0.101752155 + rotY: 269.999542 + rotZ: 0.016763268 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369521 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: 306fc5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deep One Bull + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.0796442 + posY: 1.39762878 + posZ: 83.01213 + rotX: 0.097816065 + rotY: 269.980835 + rotZ: 0.686665833 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232015 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: c3156c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deep One Predator + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.0599527 + posY: 1.51415682 + posZ: -18.3916016 + rotX: 359.920135 + rotY: 270.001465 + rotZ: 0.016870901 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232020 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: 60aa0a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Stowaway + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.3418608 + posY: 1.4713161 + posZ: -17.6525478 + rotX: 359.920135 + rotY: 270.0016 + rotZ: 0.0168722328 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232021 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. Terror. + DragSelectable: true + GMNotes: '' + GUID: e31e2d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dragged Under + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.3120108 + posY: 1.54163218 + posZ: -17.0931187 + rotX: 359.9205 + rotY: 270.0078 + rotZ: 0.0146849984 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369520 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Power. + DragSelectable: true + GMNotes: '' + GUID: 2e4e7f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Psychic Pull + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.2424707 + posY: 1.36805511 + posZ: 80.2821 + rotX: 0.113899626 + rotY: 269.999969 + rotZ: 0.0127106225 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 370132 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3701': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Blunder. + DragSelectable: true + GMNotes: '' + GUID: fb1b51 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Malfunction + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -4.738597 + posY: 1.27292013 + posZ: 54.72633 + rotX: 0.0208084434 + rotY: 270.0 + rotZ: 0.01677125 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369525 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 560b72 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Rising Tides + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 10.8898554 + posY: 1.33965409 + posZ: 83.2009354 + rotX: 0.0895175859 + rotY: 269.999878 + rotZ: 0.0158648882 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232021 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. Terror. + DragSelectable: true + GMNotes: '' + GUID: dfa5b7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dragged Under + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.8649445 + posY: 1.47201884 + posZ: -17.524004 + rotX: 359.920135 + rotY: 270.0078 + rotZ: 0.0168617032 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369522 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Humanoid. Monster. Deep One. + DragSelectable: true + GMNotes: '' + GUID: 8bb970 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Lurking Deep One + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 11.4213581 + posY: 1.28840673 + posZ: 80.19318 + rotX: 0.101752169 + rotY: 269.999542 + rotZ: 0.0167634282 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232017 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: 4b921b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Shapes in the Water + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.464777 + posY: 1.513677 + posZ: -17.487709 + rotX: 359.920135 + rotY: 270.0016 + rotZ: 0.01687151 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232018 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: 12c0dc + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Aquatic Ambush + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.9020071 + posY: 1.47029841 + posZ: -18.4567814 + rotX: 359.920135 + rotY: 270.001953 + rotZ: 0.0168716721 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 370132 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3701': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Blunder. + DragSelectable: true + GMNotes: '' + GUID: 32c692 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Malfunction + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -4.906712 + posY: 1.30397749 + posZ: 54.4021034 + rotX: 0.0208091978 + rotY: 270.0001 + rotZ: 0.01678007 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232018 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: 4332ea + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Aquatic Ambush + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.7664824 + posY: 1.51284909 + posZ: -18.4450951 + rotX: 359.920135 + rotY: 270.001953 + rotZ: 0.0168717 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369526 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 575f1d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Riptide + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 10.8102989 + posY: 1.289435 + posZ: 86.00451 + rotX: 0.08488093 + rotY: 269.999969 + rotZ: 0.0167570058 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369525 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 425da1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Rising Tides + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 11.06843 + posY: 1.28885233 + posZ: 83.10661 + rotX: 0.08951775 + rotY: 269.999878 + rotZ: 0.0158648919 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232017 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: 332a7b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Shapes in the Water + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.6778173 + posY: 1.47092509 + posZ: -17.3899632 + rotX: 359.920135 + rotY: 270.0016 + rotZ: 0.0168718155 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369523 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: 0053ff + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Deep One Assault + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 11.8093939 + posY: 1.28976119 + posZ: 82.82988 + rotX: 0.118274957 + rotY: 269.999847 + rotZ: 0.0167728756 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369520 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Power. + DragSelectable: true + GMNotes: '' + GUID: 42a9b5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Psychic Pull + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 11.92166 + posY: 1.28922582 + posZ: 80.3030853 + rotX: 0.124396659 + rotY: 269.999969 + rotZ: 0.0168061648 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2320': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + '3695': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '3701': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +DeckIDs: +- 232016 +- 369523 +- 369524 +- 232015 +- 369522 +- 369524 +- 232019 +- 232021 +- 232020 +- 369526 +- 232016 +- 232019 +- 369520 +- 369519 +- 369522 +- 369521 +- 232015 +- 232020 +- 232021 +- 369520 +- 370132 +- 369525 +- 232021 +- 369522 +- 232017 +- 232018 +- 370132 +- 232018 +- 369526 +- 369525 +- 232017 +- 369523 +- 369520 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8cbe29 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Encounter Deck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -3.93 + posY: 1.77 + posZ: 5.76 + rotX: 359.92 + rotY: 270.0 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Temples of the Union 03f2d2.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Temples of the Union 03f2d2.yaml new file mode 100644 index 000000000..e100fbd18 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Temples of the Union 03f2d2.yaml @@ -0,0 +1,138 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 232717 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: 086743 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 29.3392563 + posY: 1.397738 + posZ: -54.30977 + rotX: 356.276947 + rotY: 270.045563 + rotZ: 0.0122407731 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232718 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: "Cave. Y\u2019ha-nthlei." + DragSelectable: true + GMNotes: '' + GUID: dfc9b4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unfathomable Depths + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 29.34007 + posY: 1.48322546 + posZ: -54.3084068 + rotX: 358.099457 + rotY: 269.9991 + rotZ: 0.018247284 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true +DeckIDs: +- 232717 +- 232718 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 03f2d2 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Temples of the Union +SidewaysCard: false +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -19.2 + posY: 1.64 + posZ: -7.41 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Tidal Tunnel Deck 3d5b6e.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Tidal Tunnel Deck 3d5b6e.yaml new file mode 100644 index 000000000..c9a1aecdd --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Deck Tidal Tunnel Deck 3d5b6e.yaml @@ -0,0 +1,422 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 232711 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Cave. + DragSelectable: true + GMNotes: '' + GUID: '653549' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tidal Tunnel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 23.5754623 + posY: 1.29429054 + posZ: -58.9277458 + rotX: 0.02080859 + rotY: 269.9989 + rotZ: 0.0167702958 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369926 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3699': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668810/B3C31810E9ADA30EAD9F56966F011C00694267D0/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668361/FA5D994677EFCA86F66F88600DE43822F8E1D9F8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true + Description: Cave. + DragSelectable: true + GMNotes: '' + GUID: 27399b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tidal Tunnel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.8448887 + posY: 1.32047808 + posZ: 71.2094 + rotX: 0.0166584942 + rotY: 269.999878 + rotZ: 180.006561 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232712 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + Description: Cave. + DragSelectable: true + GMNotes: '' + GUID: 081d87 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tidal Tunnel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 23.6148071 + posY: 1.32547677 + posZ: -59.0200157 + rotX: 0.0208085645 + rotY: 269.9989 + rotZ: 0.016774565 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369928 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3699': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668810/B3C31810E9ADA30EAD9F56966F011C00694267D0/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668361/FA5D994677EFCA86F66F88600DE43822F8E1D9F8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true + Description: Cave. + DragSelectable: true + GMNotes: '' + GUID: d5566b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tidal Tunnel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 21.0008354 + posY: 1.36702967 + posZ: 75.97807 + rotX: 0.01249279 + rotY: 269.9996 + rotZ: 181.4163 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369927 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3699': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668810/B3C31810E9ADA30EAD9F56966F011C00694267D0/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668361/FA5D994677EFCA86F66F88600DE43822F8E1D9F8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true + Description: Cave. + DragSelectable: true + GMNotes: '' + GUID: 8535af + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tidal Tunnel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 21.85952 + posY: 1.32826674 + posZ: 73.75093 + rotX: 0.0167483781 + rotY: 269.999756 + rotZ: 180.218216 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369927 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3699': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668810/B3C31810E9ADA30EAD9F56966F011C00694267D0/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668361/FA5D994677EFCA86F66F88600DE43822F8E1D9F8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true + Description: Cave. + DragSelectable: true + GMNotes: '' + GUID: 5c6c6b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tidal Tunnel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 21.7778568 + posY: 1.29128253 + posZ: 73.5148544 + rotX: 0.0208093133 + rotY: 269.9999 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369928 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3699': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668810/B3C31810E9ADA30EAD9F56966F011C00694267D0/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668361/FA5D994677EFCA86F66F88600DE43822F8E1D9F8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true + Description: Cave. + DragSelectable: true + GMNotes: '' + GUID: 0f20fc + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tidal Tunnel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 20.9962578 + posY: 1.29169452 + posZ: 75.8919449 + rotX: 0.0208079219 + rotY: 269.999939 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 369926 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '3699': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668810/B3C31810E9ADA30EAD9F56966F011C00694267D0/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668361/FA5D994677EFCA86F66F88600DE43822F8E1D9F8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true + Description: Cave. + DragSelectable: true + GMNotes: '' + GUID: 1c12f3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Tidal Tunnel + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.5894775 + posY: 1.28903437 + posZ: 71.0309753 + rotX: 0.02080917 + rotY: 269.999939 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2327': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038753458/53818E62EA20C499AD2CD72DB20C1E69022B2273/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718155004615/9B65938CD16D7446FB1FAA3C0CB998D71B576E21/ + NumHeight: 4 + NumWidth: 5 + Type: 0 + UniqueBack: true + '3699': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668810/B3C31810E9ADA30EAD9F56966F011C00694267D0/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132668361/FA5D994677EFCA86F66F88600DE43822F8E1D9F8/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +DeckIDs: +- 232711 +- 369926 +- 232712 +- 369928 +- 369927 +- 369927 +- 369928 +- 369926 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3d5b6e +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Tidal Tunnel Deck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 0.74 + posY: 1.64 + posZ: 5.73 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Notecard 7e3c60.yaml b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Notecard 7e3c60.yaml new file mode 100644 index 000000000..ae7c1c6c3 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Notecard 7e3c60.yaml @@ -0,0 +1,35 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +Description: Without looking at any revealed sides, randomly remove one card from + each pile, then shuffle and set aside the remaining cards. +DragSelectable: true +GMNotes: '' +GUID: 7e3c60 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Notecard +Nickname: '' +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -15.59 + posY: 1.67 + posZ: -3.74 + rotX: 0.08 + rotY: 90.02 + rotZ: 359.98 + scaleX: 0.9 + scaleY: 0.9 + scaleZ: 0.9 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Tile The Innsmouth Conspiracy Campaign Log f40183.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Tile The Innsmouth Conspiracy Campaign Log f40183.ttslua index 2d9e70e3f..63966807b 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Tile The Innsmouth Conspiracy Campaign Log f40183.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Tile The Innsmouth Conspiracy Campaign Log f40183.ttslua @@ -1,669 +1,669 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {0.902,0.886,0.788} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --1 checkbox --- { --- pos = {0.306,0.1,0.05}, --- size = 250, --- state = false --- }, - - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.46}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.51,0.1,-0.46}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.56}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.455}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.06,0.1,-0.455}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.15,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.64,0.1,-0.72}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.64,0.1,-0.63}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.64,0.1,-0.27}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.715}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.63}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.27}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.71}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.24,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.268}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.69,0.1,-0.71}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.69,0.1,-0.62}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.265}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Memories Recovered - { - pos = {0.44,0.1,0.325}, - rows =14, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.43,0.1,0.33}, - rows =14, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {-0.478,0.1,0.8}, - rows = 8, - width = 3000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Killed and Insane - { - pos = {0.448,0.1,0.887}, - rows = 5, - width = 4000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {0.902,0.886,0.788} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --1 checkbox +-- { +-- pos = {0.306,0.1,0.05}, +-- size = 250, +-- state = false +-- }, + + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.46}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.51,0.1,-0.46}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.56}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.455}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.06,0.1,-0.455}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.15,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.64,0.1,-0.72}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.64,0.1,-0.63}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.64,0.1,-0.27}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.715}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.63}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.27}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.71}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.24,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.268}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.69,0.1,-0.71}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.69,0.1,-0.62}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.265}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Memories Recovered + { + pos = {0.44,0.1,0.325}, + rows =14, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.43,0.1,0.33}, + rows =14, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {-0.478,0.1,0.8}, + rows = 8, + width = 3000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Killed and Insane + { + pos = {0.448,0.1,0.887}, + rows = 5, + width = 4000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa 899c3a.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa 899c3a.ttslua index 4798d294b..daed6bf90 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa 899c3a.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa 899c3a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c.ttslua index c99612b1a..beb7e9fed 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua index 7878134ac..978a9d2b5 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua @@ -1,21 +1,21 @@ -name = 'The Path to Carcosa' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Path to Carcosa' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.yaml index 0b4cb7ea3..2b607f91f 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.yaml @@ -19,30 +19,32 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Model_Bag Set-aside 1cbe12.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 01b9fa.yaml' - !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Encounter Deck 0e3277.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck f00abc.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 170d3d.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Model_Bag Set-aside 1cbe12.yaml' - !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Discovering the Truth 3da436.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 472b87.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper + 47a40e.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 657fc6.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 7234af.yaml' - !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality dda125.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml' - !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Bystanders a2d9f5.yaml' - !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Dining Room aa08d4.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 657fc6.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 472b87.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 01b9fa.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile dfdabe.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 7234af.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile d4d0a1.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile 170d3d.yaml' - !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile b25fa2.yaml' -- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile f935dd.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml' - !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Gallery cce10d.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile d4d0a1.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality dda125.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile dfdabe.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck f00abc.yaml' - !include 'Custom_Model_Bag 2 The Last King 6730a1/Notecard Errata f66b3b.yaml' +- !include 'Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile f935dd.yaml' CustomMesh: CastShadows: true ColliderURL: '' @@ -71,7 +73,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: false LuaScript: !include 'Custom_Model_Bag 2 The Last King 6730a1.ttslua' -LuaScriptState: '{"ml":{"01b9fa":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":359.9831,"y":0.0002,"z":359.9201}},"0e3277":{"lock":false,"pos":{"x":-3.9275,"y":1.7291,"z":5.7572},"rot":{"x":359.9197,"y":270.0004,"z":180.0168}},"170d3d":{"lock":false,"pos":{"x":-20.0997,"y":1.6105,"z":3.2408},"rot":{"x":359.9554,"y":224.9999,"z":0.0684}},"1cbe12":{"lock":false,"pos":{"x":1.696,"y":1.5583,"z":14.2787},"rot":{"x":359.9551,"y":224.998,"z":0.0687}},"3da436":{"lock":false,"pos":{"x":-2.6883,"y":1.6555,"z":-5.0487},"rot":{"x":0.0163,"y":180.3896,"z":0.0804}},"472b87":{"lock":false,"pos":{"x":-27.4076,"y":1.6185,"z":-3.9855},"rot":{"x":359.9316,"y":315,"z":359.9554}},"4b6478":{"lock":false,"pos":{"x":-30.2243,"y":1.6954,"z":-0.03},"rot":{"x":359.9201,"y":270,"z":0.0169}},"657fc6":{"lock":false,"pos":{"x":-20.5635,"y":1.6124,"z":7.5489},"rot":{"x":359.9201,"y":269.9948,"z":0.0169}},"7234af":{"lock":false,"pos":{"x":-26.7542,"y":1.6189,"z":0.1696},"rot":{"x":359.9201,"y":269.9948,"z":0.0169}},"857d0d":{"lock":false,"pos":{"x":-4.2848,"y":1.5829,"z":-15.6021},"rot":{"x":359.9197,"y":269.9998,"z":0.0168}},"981fa3":{"lock":false,"pos":{"x":-23.6765,"y":1.6862,"z":-0.03},"rot":{"x":359.9201,"y":270,"z":0.0169}},"a2d9f5":{"lock":false,"pos":{"x":-11.8925,"y":1.6719,"z":11.1211},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"aa08d4":{"lock":false,"pos":{"x":-17.12,"y":1.6793,"z":7.57},"rot":{"x":359.9201,"y":270,"z":0.0169}},"b25fa2":{"lock":false,"pos":{"x":-20.004,"y":1.6083,"z":-3.8134},"rot":{"x":359.9316,"y":315,"z":359.9554}},"b3c25b":{"lock":false,"pos":{"x":-23.6766,"y":1.684,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"c605d3":{"lock":false,"pos":{"x":-23.6765,"y":1.6885,"z":7.57},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"cce10d":{"lock":false,"pos":{"x":-17.1201,"y":1.6748,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"d4d0a1":{"lock":false,"pos":{"x":-27.2821,"y":1.6207,"z":3.8853},"rot":{"x":359.9554,"y":224.9999,"z":0.0684}},"dd2d33":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":270.0001,"z":0.0168}},"dda125":{"lock":false,"pos":{"x":-11.9758,"y":1.6824,"z":14.6596},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"dfdabe":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":359.9831,"y":0.0002,"z":359.92}},"f00abc":{"lock":false,"pos":{"x":-2.7246,"y":1.664,"z":0.3733},"rot":{"x":0.0168,"y":180.0003,"z":0.0803}},"f66b3b":{"lock":false,"pos":{"x":-11.375,"y":1.5603,"z":-23.9299},"rot":{"x":0.0799,"y":89.9999,"z":359.9831}},"f935dd":{"lock":false,"pos":{"x":-20.4019,"y":1.6078,"z":-7.3231},"rot":{"x":359.9201,"y":269.9875,"z":0.0169}}}}' +LuaScriptState: '{"ml":{"01b9fa":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.61334502696991,"z":-3.82999920845032},"rot":{"x":359.983154296875,"y":0.000221038033487275,"z":359.920074462891}},"0e3277":{"lock":false,"pos":{"x":-3.9275062084198,"y":1.7154940366745,"z":5.7572021484375},"rot":{"x":359.919738769531,"y":270.000396728516,"z":180.016815185547}},"170d3d":{"lock":false,"pos":{"x":-20.0996990203857,"y":1.61043524742126,"z":3.24080014228821},"rot":{"x":359.955413818359,"y":224.999908447266,"z":0.0683808028697968}},"1cbe12":{"lock":false,"pos":{"x":1.69600081443787,"y":1.55831742286682,"z":14.2787017822266},"rot":{"x":359.955139160156,"y":224.997985839844,"z":0.0686728805303574}},"3da436":{"lock":false,"pos":{"x":-2.68831658363342,"y":1.59734833240509,"z":-5.04869699478149},"rot":{"x":0.0162898916751146,"y":180.389587402344,"z":0.0803677588701248}},"472b87":{"lock":false,"pos":{"x":-27.407600402832,"y":1.61850214004517,"z":-3.98550081253052},"rot":{"x":359.931579589844,"y":315.000030517578,"z":359.955413818359}},"47a40e":{"lock":false,"pos":{"x":-11.540111541748,"y":1.59978473186493,"z":7.6138768196106},"rot":{"x":359.920104980469,"y":269.9990234375,"z":0.0168488472700119}},"4b6478":{"lock":false,"pos":{"x":-30.2243175506592,"y":1.63719701766968,"z":-0.0299969520419836},"rot":{"x":359.920104980469,"y":269.999969482422,"z":0.0168402809649706}},"657fc6":{"lock":false,"pos":{"x":-20.5634994506836,"y":1.6123480796814,"z":7.54890012741089},"rot":{"x":359.920104980469,"y":269.994873046875,"z":0.01687484793365}},"7234af":{"lock":false,"pos":{"x":-26.7541999816895,"y":1.61881196498871,"z":0.169599786400795},"rot":{"x":359.920104980469,"y":269.994812011719,"z":0.0168751962482929}},"857d0d":{"lock":false,"pos":{"x":-4.28480052947998,"y":1.58287870883942,"z":-15.6021022796631},"rot":{"x":359.919738769531,"y":269.999755859375,"z":0.0168382115662098}},"981fa3":{"lock":false,"pos":{"x":-23.6765174865723,"y":1.6280665397644,"z":-0.0299968998879194},"rot":{"x":359.920104980469,"y":269.999969482422,"z":0.0168403573334217}},"a2d9f5":{"lock":false,"pos":{"x":-11.8925075531006,"y":1.64630770683289,"z":11.1211023330688},"rot":{"x":359.920104980469,"y":269.999725341797,"z":0.0168419405817986}},"aa08d4":{"lock":false,"pos":{"x":-17.1200180053711,"y":1.62115752696991,"z":7.57000398635864},"rot":{"x":359.920104980469,"y":270,"z":0.0168404430150986}},"b25fa2":{"lock":false,"pos":{"x":-20.003999710083,"y":1.60822880268097,"z":-3.81340026855469},"rot":{"x":359.931579589844,"y":314.999969482422,"z":359.955413818359}},"b3c25b":{"lock":false,"pos":{"x":-23.6766166687012,"y":1.62581253051758,"z":-7.69999647140503},"rot":{"x":359.920104980469,"y":269.999877929688,"z":0.0168403405696154}},"c605d3":{"lock":false,"pos":{"x":-23.6765155792236,"y":1.63030016422272,"z":7.57000303268433},"rot":{"x":359.920104980469,"y":269.999786376953,"z":0.0168403759598732}},"cce10d":{"lock":false,"pos":{"x":-17.1201171875,"y":1.61667001247406,"z":-7.69999647140503},"rot":{"x":359.920104980469,"y":269.999908447266,"z":0.0168406385928392}},"d4d0a1":{"lock":false,"pos":{"x":-27.2821006774902,"y":1.62064015865326,"z":3.8853006362915},"rot":{"x":359.955413818359,"y":224.999893188477,"z":0.0683806613087654}},"dd2d33":{"lock":false,"pos":{"x":-3.95601654052734,"y":1.59753954410553,"z":-10.441198348999},"rot":{"x":359.919738769531,"y":270.000061035156,"z":0.0168371349573135}},"dda125":{"lock":false,"pos":{"x":-11.9758052825928,"y":1.64746379852295,"z":14.6596012115479},"rot":{"x":359.920104980469,"y":270.000061035156,"z":180.016830444336}},"dfdabe":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.6156051158905,"z":3.86000037193298},"rot":{"x":359.983154296875,"y":0.000254023383604363,"z":359.920043945313}},"f00abc":{"lock":false,"pos":{"x":-2.7246241569519,"y":1.6159462928772,"z":0.37330549955368},"rot":{"x":0.0168353132903576,"y":180.000289916992,"z":0.0802558958530426}},"f66b3b":{"lock":false,"pos":{"x":-11.3750019073486,"y":1.56032073497772,"z":-23.9299030303955},"rot":{"x":0.079878069460392,"y":89.9998931884766,"z":359.983123779297}},"f935dd":{"lock":false,"pos":{"x":-20.4018993377686,"y":1.60775208473206,"z":-7.32310056686401},"rot":{"x":359.920104980469,"y":269.987487792969,"z":0.0168849434703588}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml index 1bb104f8c..7ea74342c 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Ballroom c605d3.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.69 + posY: 1.63 posZ: 7.57 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml index 1b64d359b..87939a70f 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Courtyard 981fa3.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.69 + posY: 1.63 posZ: -0.03 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Dining Room aa08d4.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Dining Room aa08d4.yaml index 9a131397b..651633426 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Dining Room aa08d4.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Dining Room aa08d4.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -17.12 - posY: 1.68 + posY: 1.62 posZ: 7.57 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Discovering the Truth 3da436.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Discovering the Truth 3da436.yaml index 2fd4827dc..6a628a1a0 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Discovering the Truth 3da436.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Discovering the Truth 3da436.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -2.69 - posY: 1.66 + posY: 1.6 posZ: -5.05 rotX: 0.02 rotY: 180.39 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml index f3241c311..9f128ff2d 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Foyer 4b6478.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -30.22 - posY: 1.7 + posY: 1.64 posZ: -0.03 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Gallery cce10d.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Gallery cce10d.yaml index 0573888d1..7ceccb1f7 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Gallery cce10d.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Gallery cce10d.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -17.12 - posY: 1.67 + posY: 1.62 posZ: -7.7 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml index a3e323f46..dc1da93e8 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Living Room b3c25b.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.68 + posY: 1.63 posZ: -7.7 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml index 1f5c19086..b41f3baf4 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Card Scenario dd2d33.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -3.96 - posY: 1.66 + posY: 1.6 posZ: -10.44 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua index 80ce317d3..c9acd00d0 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua @@ -1,25 +1,25 @@ -name = 'The Last King' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Last King' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.ttslua new file mode 100644 index 000000000..4f6a8a0bc --- /dev/null +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.ttslua @@ -0,0 +1,74 @@ +BYSTANDERS_GUID = "a2d9f5" +BYSTANDERS_RETURN_TO_GUID = "dc02e3" +PLAYAREA_GUID = "721ba2" +LOCATIONS_GUID = { + { guid="aa08d4", offset=Vector({ 0, 0, 2.42 }) }, + { guid="c605d3", offset=Vector({ 0, 0, 2.42 }) }, + { guid="981fa3", offset=Vector({ 3.14, 0, 0 }) }, + { guid="b3c25b", offset=Vector({ 0, 0, -2.31 }) }, + { guid="cce10d", offset=Vector({ 0, 0, -2.31 }) } +} + +function onLoad() + self.createButton({ + label="Set Up", + click_function="setup", + function_owner=self, + position={0,0.1,0.4}, + height=120, + width=400, + scale={x=1.75, y=1.75, z=1.75}, + font_size=100 + }) + + playarea = getObjectFromGUID(PLAYAREA_GUID) + PLAYER_COUNTER = getObjectFromGUID('f182ee') + math.randomseed(os.time()) +end + +function setup(obj, color, alt_click) + local bystanders = getObjectFromGUID(BYSTANDERS_GUID) + if bystanders == nil then + bystanders = getObjectFromGUID(BYSTANDERS_RETURN_TO_GUID) + if bystanders == nil then + printToColor("Bystanders deck not found", color) + return + end + end + + -- place bystanders + bystanders.shuffle() + local cards = bystanders.getObjects() + local bPositions = {} + for i=1,#LOCATIONS_GUID-1 do + local b = cards[i] + local loc = LOCATIONS_GUID[i] + local pos = getObjectFromGUID(loc.guid).getPosition() + loc.offset + bystanders.takeObject({ + guid = b.guid, + position = pos, + smooth = false + }) + table.insert(bPositions, pos) + end + local finalLoc = LOCATIONS_GUID[5] + local finalPos = getObjectFromGUID(finalLoc.guid).getPosition() + + finalLoc.offset + bystanders.remainder.setPosition(finalPos) + table.insert(bPositions, finalPos) + + -- spawn clues + local numClues = PLAYER_COUNTER.getVar('val') + 1 + for i=1,#LOCATIONS_GUID do + local bPos = bPositions[i] + for j=0,numClues-1 do + local pos = bPos + if j < 4 then + pos = pos + Vector(0.3, 0.2, (0.55*j) - 0.8) + else + pos = pos + Vector(0.85, 0.2, (0.55*j) - 3) + end + Global.call("spawnToken", { pos, "clue" }) + end + end +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.yaml new file mode 100644 index 000000000..3e9870864 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King Helper 47a40e.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 0 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1666857701582751097/F7A8A49BBC657C0FD9D147C131855BD5DFCE04AF/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1666857701582751097/F7A8A49BBC657C0FD9D147C131855BD5DFCE04AF/ + WidthScale: 0.0 +Description: Randomly places bystanders at locations and spawns clues on them. +DragSelectable: true +GMNotes: '' +GUID: 47a40e +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Tile The Last King Helper 47a40e.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: The Last King Helper +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -11.54 + posY: 1.6 + posZ: 7.61 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.65 + scaleY: 1.0 + scaleZ: 0.65 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck f00abc.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck f00abc.yaml index 9ac1da632..f4ea48f61 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck f00abc.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Agenda Deck f00abc.yaml @@ -127,7 +127,7 @@ Sticky: true Tooltip: true Transform: posX: -2.72 - posY: 1.66 + posY: 1.62 posZ: 0.37 rotX: 0.02 rotY: 180.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Bystanders a2d9f5.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Bystanders a2d9f5.yaml index 9e1711499..005103478 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Bystanders a2d9f5.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Bystanders a2d9f5.yaml @@ -265,7 +265,7 @@ Sticky: true Tooltip: true Transform: posX: -11.89 - posY: 1.67 + posY: 1.65 posZ: 11.12 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Encounter Deck 0e3277.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Encounter Deck 0e3277.yaml index 21c9caa30..5c4a60af8 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Encounter Deck 0e3277.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Encounter Deck 0e3277.yaml @@ -1055,7 +1055,7 @@ Sticky: true Tooltip: true Transform: posX: -3.93 - posY: 1.73 + posY: 1.72 posZ: 5.76 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality dda125.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality dda125.yaml index 9f10e5c33..1570bbcc0 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality dda125.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Deck Sickening Reality dda125.yaml @@ -265,7 +265,7 @@ Sticky: true Tooltip: true Transform: posX: -11.98 - posY: 1.68 + posY: 1.65 posZ: 14.66 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua index fd833106f..9852aeb27 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua @@ -1,25 +1,25 @@ -name = 'Echoes of the Past' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Echoes of the Past' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua index e78b2e78a..f7109dddb 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua @@ -1,25 +1,25 @@ -name = 'The Unspeakable Oath' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Unspeakable Oath' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua index bacd5051f..e092a5769 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua @@ -1,25 +1,25 @@ -name = 'A Phantom of Truth' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'A Phantom of Truth' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua index c36627e17..9607689ac 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua @@ -1,25 +1,25 @@ -name = 'The Pallid Mask' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Pallid Mask' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.yaml index ef173e7e3..fa5166ab9 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.yaml @@ -19,31 +19,31 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include "Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Ch\u0153ur Gothique b52eaf.yaml" -- !include "Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Ch\u0153ur Gothique c7ee02.yaml" -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Deck Encounter Deck c380e4.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Scenario 1163a0.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag New Chaos Token 425d3a.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise - 20c21d.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232.yaml' - !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall 014bd6.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall db972a.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile 93d8de.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile 5b38c6.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower 69eae5.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower c0362a.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile d4528c.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile 73720d.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Grand Rue 20de8b.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile 8d134d.yaml' -- !include "Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Porte de l'Avanc\xE9e\ - \ c647a3.yaml" -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile 5bebe6.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps 38d12d.yaml' -- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps c2651e.yaml' - !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile 04d6e6.yaml' - !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Abbey Church 106f19.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Scenario 1163a0.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise + 20c21d.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Grand Rue 20de8b.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps 38d12d.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag New Chaos Token 425d3a.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile 5b38c6.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile 5bebe6.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower 69eae5.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile 73720d.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile 8d134d.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile 93d8de.yaml' +- !include "Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Ch\u0153ur Gothique b52eaf.yaml" +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower c0362a.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps c2651e.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Deck Encounter Deck c380e4.yaml' +- !include "Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Porte de l'Avanc\xE9e\ + \ c647a3.yaml" +- !include "Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Ch\u0153ur Gothique c7ee02.yaml" +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile d4528c.yaml' +- !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall db972a.yaml' CustomMesh: CastShadows: true ColliderURL: '' @@ -72,7 +72,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: false LuaScript: !include 'Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua' -LuaScriptState: '{"ml":{"014bd6":{"lock":false,"pos":{"x":-25.1033,"y":1.7317,"z":-15.3069},"rot":{"x":359.9212,"y":270.0016,"z":0.0164}},"04d6e6":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":0.0169,"y":179.9999,"z":0.0799}},"106f19":{"lock":false,"pos":{"x":-23.6766,"y":1.6885,"z":7.57},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"1163a0":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9999,"z":0.0168}},"20c21d":{"lock":false,"pos":{"x":-3.6194,"y":1.5818,"z":-15.7683},"rot":{"x":359.92,"y":269.9998,"z":0.0142}},"20de8b":{"lock":false,"pos":{"x":-30.2243,"y":1.6931,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"38d12d":{"lock":false,"pos":{"x":-23.6762,"y":1.6862,"z":-0.0302},"rot":{"x":359.9201,"y":270.0013,"z":0.0166}},"425d3a":{"lock":false,"pos":{"x":-5.9607,"y":1.4852,"z":-15.0445},"rot":{"x":359.9839,"y":359.9654,"z":5.3841}},"5b38c6":{"lock":false,"pos":{"x":-23.6766,"y":1.6122,"z":-7.7},"rot":{"x":359.9551,"y":225.2476,"z":0.0682}},"5bebe6":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":0.0169,"y":179.9999,"z":0.0799}},"69eae5":{"lock":false,"pos":{"x":-18.5817,"y":1.7825,"z":-7.6924},"rot":{"x":0.1249,"y":269.9906,"z":359.9901}},"73720d":{"lock":false,"pos":{"x":-26.9588,"y":1.6168,"z":-7.6633},"rot":{"x":359.9201,"y":270.0027,"z":0.0169}},"7c8232":{"lock":false,"pos":{"x":1.0476,"y":1.3951,"z":0.5264},"rot":{"x":359.9196,"y":269.9857,"z":0.0169}},"8d134d":{"lock":false,"pos":{"x":-33.6312,"y":1.6262,"z":-7.6001},"rot":{"x":0.0799,"y":90,"z":359.9831}},"93d8de":{"lock":false,"pos":{"x":-23.6765,"y":1.6111,"z":-11.51},"rot":{"x":0.0169,"y":179.9999,"z":0.0799}},"b52eaf":{"lock":false,"pos":{"x":-2.8742,"y":1.6617,"z":15.2703},"rot":{"x":359.9198,"y":269.9966,"z":0.0165}},"c0362a":{"lock":false,"pos":{"x":-17.1182,"y":1.7151,"z":-7.6998},"rot":{"x":358.4415,"y":269.9998,"z":0.0171}},"c2651e":{"lock":false,"pos":{"x":-25.0901,"y":1.7362,"z":-0.0141},"rot":{"x":359.9211,"y":270.0266,"z":0.0163}},"c380e4":{"lock":false,"pos":{"x":-3.9277,"y":1.7717,"z":5.7572},"rot":{"x":359.9197,"y":269.9998,"z":180.0168}},"c647a3":{"lock":false,"pos":{"x":-36.7733,"y":1.7022,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"c7ee02":{"lock":false,"pos":{"x":-4.3053,"y":1.7116,"z":15.2833},"rot":{"x":0.0807,"y":270.0334,"z":359.9872}},"d4528c":{"lock":false,"pos":{"x":-20.4212,"y":1.6077,"z":-7.6621},"rot":{"x":359.9189,"y":270.0012,"z":0.0204}},"db972a":{"lock":false,"pos":{"x":-23.6765,"y":1.6817,"z":-15.2798},"rot":{"x":359.9201,"y":270.0009,"z":0.0165}}}}' +LuaScriptState: '{"ml":{"014bd6":{"lock":false,"pos":{"x":-25.1033325195313,"y":1.67355096340179,"z":-15.3068981170654},"rot":{"x":359.921295166016,"y":270.00146484375,"z":0.0162949804216623}},"04d6e6":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.61560475826263,"z":3.8600001335144},"rot":{"x":0.0168393943458796,"y":179.999847412109,"z":0.0799410343170166}},"106f19":{"lock":false,"pos":{"x":-23.6766166687012,"y":1.63030028343201,"z":7.57000303268433},"rot":{"x":359.920104980469,"y":269.999877929688,"z":0.0168397165834904}},"1163a0":{"lock":false,"pos":{"x":-3.9560170173645,"y":1.59753942489624,"z":-10.441198348999},"rot":{"x":359.919738769531,"y":269.999908447266,"z":0.0168381743133068}},"20c21d":{"lock":false,"pos":{"x":-3.61939382553101,"y":1.58184027671814,"z":-15.7683191299438},"rot":{"x":359.920043945313,"y":269.999786376953,"z":0.0142190363258123}},"20de8b":{"lock":false,"pos":{"x":-30.2243175506592,"y":1.63494288921356,"z":-7.69999647140503},"rot":{"x":359.920104980469,"y":269.999877929688,"z":0.0168397463858128}},"38d12d":{"lock":false,"pos":{"x":-23.6762161254883,"y":1.62806081771851,"z":-0.0302017312496901},"rot":{"x":359.920166015625,"y":270.001342773438,"z":0.0164924804121256}},"425d3a":{"lock":false,"pos":{"x":-5.96069526672363,"y":1.48525238037109,"z":-15.0444965362549},"rot":{"x":359.983856201172,"y":359.965148925781,"z":5.38421249389648}},"5b38c6":{"lock":false,"pos":{"x":-23.6765995025635,"y":1.61220765113831,"z":-7.70000028610229},"rot":{"x":359.955108642578,"y":225.247619628906,"z":0.0682072043418884}},"5bebe6":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.61334478855133,"z":-3.8299994468689},"rot":{"x":0.0168393589556217,"y":179.999877929688,"z":0.0799403190612793}},"69eae5":{"lock":false,"pos":{"x":-18.5812110900879,"y":1.74221706390381,"z":-7.69240570068359},"rot":{"x":0.801447927951813,"y":269.992797851563,"z":359.989501953125}},"73720d":{"lock":false,"pos":{"x":-26.9587993621826,"y":1.61679518222809,"z":-7.66330051422119},"rot":{"x":359.920104980469,"y":270.002685546875,"z":0.0168617609888315}},"7c8232":{"lock":false,"pos":{"x":0.639023423194885,"y":1.39672064781189,"z":4.04552745819092},"rot":{"x":359.919647216797,"y":269.995056152344,"z":0.0168794598430395}},"8d134d":{"lock":false,"pos":{"x":-33.6311988830566,"y":1.62611818313599,"z":-7.60010147094727},"rot":{"x":0.0798943936824799,"y":90.0000152587891,"z":359.983123779297}},"93d8de":{"lock":false,"pos":{"x":-23.6764984130859,"y":1.61108767986298,"z":-11.5100011825562},"rot":{"x":0.0168392974883318,"y":179.999908447266,"z":0.0799340605735779}},"b52eaf":{"lock":false,"pos":{"x":-2.87421655654907,"y":1.60357391834259,"z":15.2703046798706},"rot":{"x":359.919799804688,"y":269.996612548828,"z":0.016482999548316}},"c0362a":{"lock":false,"pos":{"x":-17.1182441711426,"y":1.67623746395111,"z":-7.69982957839966},"rot":{"x":357.69091796875,"y":270.000030517578,"z":0.0173513479530811}},"c2651e":{"lock":false,"pos":{"x":-25.0901393890381,"y":1.67803597450256,"z":-0.0141058759763837},"rot":{"x":359.921234130859,"y":270.026763916016,"z":0.0162677206099033}},"c380e4":{"lock":false,"pos":{"x":-3.92771220207214,"y":1.75400674343109,"z":5.75720357894897},"rot":{"x":359.919738769531,"y":269.999786376953,"z":180.016815185547}},"c647a3":{"lock":false,"pos":{"x":-36.7733154296875,"y":1.64407503604889,"z":-7.69999742507935},"rot":{"x":359.920104980469,"y":269.999877929688,"z":0.0168410111218691}},"c7ee02":{"lock":false,"pos":{"x":-4.30531787872314,"y":1.65352654457092,"z":15.2833051681519},"rot":{"x":0.0813417807221413,"y":270.033386230469,"z":359.983245849609}},"d4528c":{"lock":false,"pos":{"x":-20.4211978912354,"y":1.60768973827362,"z":-7.66210556030273},"rot":{"x":359.919616699219,"y":270.001098632813,"z":0.0194527339190245}},"db972a":{"lock":false,"pos":{"x":-23.6765155792236,"y":1.62357914447784,"z":-15.2798004150391},"rot":{"x":359.920166015625,"y":270.000854492188,"z":0.0164686255156994}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag New Chaos Token 425d3a.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag New Chaos Token 425d3a.yaml index f793e7d63..a4446be91 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag New Chaos Token 425d3a.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag New Chaos Token 425d3a.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.07843696 - g: 0.07843696 - r: 0.302167654 + b: 0.07843693 + g: 0.07843693 + r: 0.302167624 ContainedObjects: - !include 'Bag New Chaos Token 425d3a/Custom_Tile 81a1d7.yaml' - !include 'Bag New Chaos Token 425d3a/Custom_Tile 2460df.yaml' diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232.yaml index 6e9ec93f3..8c22dbe72 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.05098012 + b: 0.0509801 g: 0.6313726 - r: 0.169647187 + r: 0.169647157 ContainedObjects: - !include 'Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.yaml' - !include 'Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.yaml' @@ -28,11 +28,11 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 1.05 + posX: 0.64 posY: 1.4 - posZ: 0.53 + posZ: 4.05 rotX: 359.92 - rotY: 269.99 + rotY: 270.0 rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua index 512f2eed0..4d4017455 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua index 512f2eed0..4d4017455 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Abbey Church 106f19.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Abbey Church 106f19.yaml index ee4315194..805412781 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Abbey Church 106f19.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Abbey Church 106f19.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.69 + posY: 1.63 posZ: 7.57 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps 38d12d.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps 38d12d.yaml index 1e0d517df..d82893066 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps 38d12d.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps 38d12d.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.69 + posY: 1.63 posZ: -0.03 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps c2651e.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps c2651e.yaml index 312ba4861..43ef52bfb 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps c2651e.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Broken Steps c2651e.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -25.09 - posY: 1.74 + posY: 1.68 posZ: -0.01 rotX: 359.92 rotY: 270.03 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique b52eaf.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique b52eaf.yaml index b3f6193b6..69cb9d242 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique b52eaf.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique b52eaf.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -2.87 - posY: 1.66 + posY: 1.6 posZ: 15.27 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique c7ee02.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique c7ee02.yaml index 9da24409d..7da7a9237 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique c7ee02.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Chœur Gothique c7ee02.yaml @@ -34,11 +34,11 @@ Sticky: true Tooltip: true Transform: posX: -4.31 - posY: 1.71 + posY: 1.65 posZ: 15.28 rotX: 0.08 rotY: 270.03 - rotZ: 359.99 + rotZ: 359.98 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Grand Rue 20de8b.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Grand Rue 20de8b.yaml index 9efd420e5..5af84794b 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Grand Rue 20de8b.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Grand Rue 20de8b.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -30.22 - posY: 1.69 + posY: 1.63 posZ: -7.7 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower 69eae5.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower 69eae5.yaml index 26680fc94..6321adaed 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower 69eae5.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower 69eae5.yaml @@ -34,9 +34,9 @@ Sticky: true Tooltip: true Transform: posX: -18.58 - posY: 1.78 + posY: 1.74 posZ: -7.69 - rotX: 0.12 + rotX: 0.8 rotY: 269.99 rotZ: 359.99 scaleX: 1.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower c0362a.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower c0362a.yaml index de7255c9f..b423e4887 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower c0362a.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card North Tower c0362a.yaml @@ -34,9 +34,9 @@ Sticky: true Tooltip: true Transform: posX: -17.12 - posY: 1.72 + posY: 1.68 posZ: -7.7 - rotX: 358.44 + rotX: 357.69 rotY: 270.0 rotZ: 0.02 scaleX: 1.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall 014bd6.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall 014bd6.yaml index 30674cad6..e6a5f30f1 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall 014bd6.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall 014bd6.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -25.1 - posY: 1.73 + posY: 1.67 posZ: -15.31 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall db972a.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall db972a.yaml index 3abcbcfd3..5198c5e99 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall db972a.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Outer Wall db972a.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -23.68 - posY: 1.68 + posY: 1.62 posZ: -15.28 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Porte de l'Avancée c647a3.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Porte de l'Avancée c647a3.yaml index 4b294d091..6da357e9e 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Porte de l'Avancée c647a3.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Porte de l'Avancée c647a3.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -36.77 - posY: 1.7 + posY: 1.64 posZ: -7.7 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Scenario 1163a0.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Scenario 1163a0.yaml index db72c59db..5d1717b53 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Scenario 1163a0.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Card Scenario 1163a0.yaml @@ -34,7 +34,7 @@ Sticky: true Tooltip: true Transform: posX: -3.96 - posY: 1.66 + posY: 1.6 posZ: -10.44 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua index a505ccca6..78350373e 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua @@ -1,25 +1,25 @@ -name = 'Black Stars Rise' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Black Stars Rise' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Deck Encounter Deck c380e4.yaml b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Deck Encounter Deck c380e4.yaml index e7c4a4b56..b61ffd9f5 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Deck Encounter Deck c380e4.yaml +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Deck Encounter Deck c380e4.yaml @@ -1431,7 +1431,7 @@ Sticky: true Tooltip: true Transform: posX: -3.93 - posY: 1.77 + posY: 1.75 posZ: 5.76 rotX: 359.92 rotY: 270.0 diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua index ffa409a5f..710b4a84e 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua @@ -1,25 +1,25 @@ -name = 'Dim Carcosa' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Dim Carcosa' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Tile Carcosa Campaign Log ae8317.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Tile Carcosa Campaign Log ae8317.ttslua index 7a861eb36..108024431 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Tile Carcosa Campaign Log ae8317.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Tile Carcosa Campaign Log ae8317.ttslua @@ -1,755 +1,755 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --Doubt 1 - { - pos = {-0.482,0.1,0.776}, - size = 200, - state = false - }, - --Doubt 2 - { - pos = {-0.43,0.1,0.776}, - size = 200, - state = false - }, - --Doubt 3 - { - pos = {-0.38,0.1,0.775}, - size = 200, - state = false - }, - --Doubt 4 - { - pos = {-0.325,0.1,0.778}, - size = 200, - state = false - }, - --Doubt 5 - { - pos = {-0.27,0.1,0.779}, - size = 200, - state = false - }, - --Doubt 6 - { - pos = {-0.219,0.1,0.778}, - size = 200, - state = false - }, - --Doubt 7 - { - pos = {-0.168,0.1,0.782}, - size = 200, - state = false - }, - --Doubt 8 - { - pos = {-0.111,0.1,0.783}, - size = 200, - state = false - }, - --Conviction 1 - { - pos = {-0.736,0.1,0.868}, - size = 200, - state = false - }, - --Conviction 2 - { - pos = {-0.68,0.1,0.869}, - size = 200, - state = false - }, - --Conviction 3 - { - pos = {-0.626,0.1,0.869}, - size = 200, - state = false - }, - --Conviction 4 - { - pos = {-0.574,0.1,0.874}, - size = 200, - state = false - }, - --Conviction 5 - { - pos = {-0.519,0.1,0.874}, - size = 200, - state = false - }, - --Conviction 6 - { - pos = {-0.467,0.1,0.879}, - size = 200, - state = false - }, - --Conviction 7 - { - pos = {-0.416,0.1,0.876}, - size = 200, - state = false - }, - --Conviction 8 - { - pos = {-0.357,0.1,0.879}, - size = 200, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Chasing The Stranger - { - pos = {0.414,0.1,0.106}, - size = 500, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.38,0.1,0.339}, - rows =16, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --VIPs Interviewed - { - pos = {0.43,0.1,0.338}, - rows = 6, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --VIPs Slain - { - pos = {0.43,0.1,0.643}, - rows = 6, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --Doubt 1 + { + pos = {-0.482,0.1,0.776}, + size = 200, + state = false + }, + --Doubt 2 + { + pos = {-0.43,0.1,0.776}, + size = 200, + state = false + }, + --Doubt 3 + { + pos = {-0.38,0.1,0.775}, + size = 200, + state = false + }, + --Doubt 4 + { + pos = {-0.325,0.1,0.778}, + size = 200, + state = false + }, + --Doubt 5 + { + pos = {-0.27,0.1,0.779}, + size = 200, + state = false + }, + --Doubt 6 + { + pos = {-0.219,0.1,0.778}, + size = 200, + state = false + }, + --Doubt 7 + { + pos = {-0.168,0.1,0.782}, + size = 200, + state = false + }, + --Doubt 8 + { + pos = {-0.111,0.1,0.783}, + size = 200, + state = false + }, + --Conviction 1 + { + pos = {-0.736,0.1,0.868}, + size = 200, + state = false + }, + --Conviction 2 + { + pos = {-0.68,0.1,0.869}, + size = 200, + state = false + }, + --Conviction 3 + { + pos = {-0.626,0.1,0.869}, + size = 200, + state = false + }, + --Conviction 4 + { + pos = {-0.574,0.1,0.874}, + size = 200, + state = false + }, + --Conviction 5 + { + pos = {-0.519,0.1,0.874}, + size = 200, + state = false + }, + --Conviction 6 + { + pos = {-0.467,0.1,0.879}, + size = 200, + state = false + }, + --Conviction 7 + { + pos = {-0.416,0.1,0.876}, + size = 200, + state = false + }, + --Conviction 8 + { + pos = {-0.357,0.1,0.879}, + size = 200, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Chasing The Stranger + { + pos = {0.414,0.1,0.106}, + size = 500, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.38,0.1,0.339}, + rows =16, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --VIPs Interviewed + { + pos = {0.43,0.1,0.338}, + rows = 6, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --VIPs Slain + { + pos = {0.43,0.1,0.643}, + rows = 6, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1.ttslua index c99612b1a..beb7e9fed 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1.yaml index ca21fa6e0..adb6497d1 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1.yaml @@ -42,6 +42,8 @@ ContainedObjects: Cycle aaceca.yaml' - !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12.yaml' +- !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic + Mouse 0954ef.yaml' - !include "Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep\ \ \u2013 New York 94a1f8.yaml" - !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London @@ -94,12 +96,14 @@ ContainedObjects: 578e97.yaml' - !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da.yaml' +- !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching + Storm 0fad66.yaml' - !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d.yaml' - !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0.yaml' -- !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching - Storm 0fad66.yaml' +- !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the + Outer Gods fc7674.yaml' - !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780.yaml' - !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of @@ -112,6 +116,7 @@ ContainedObjects: 72ab92.yaml' - !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.yaml' +- !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.yaml' - !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039.yaml' - !include 'Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of @@ -144,7 +149,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: false LuaScript: !include 'Custom_Model_Bag The Side Missions 2d16e1.ttslua' -LuaScriptState: '{"ml":{"00688d":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":270,"z":0.0169}},"00dc67":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9995,"z":0.0168}},"010d85":{"lock":false,"pos":{"x":-3.9274,"y":1.7344,"z":5.7571},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"011e57":{"lock":false,"pos":{"x":7.4136,"y":1.5493,"z":-1.6503},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"01d780":{"lock":false,"pos":{"x":12.2503604888916,"y":1.45853757858276,"z":-20.0136280059814},"rot":{"x":359.920135498047,"y":270,"z":0.0168733466416597}},"023e21":{"lock":false,"pos":{"x":-3.9277,"y":1.6752,"z":5.7572},"rot":{"x":359.9197,"y":269.9987,"z":180.0168}},"0251e6":{"lock":false,"pos":{"x":-58.7691,"y":1.7417,"z":22.2313},"rot":{"x":359.9201,"y":269.9973,"z":0.0169}},"025ede":{"lock":false,"pos":{"x":-2.7253,"y":1.6208,"z":0.3733},"rot":{"x":0.0168,"y":180.0004,"z":0.0803}},"02e7d2":{"lock":false,"pos":{"x":11.9735,"y":1.5323,"z":-8.617},"rot":{"x":0.0799,"y":90.0284,"z":359.9832}},"033daa":{"lock":false,"pos":{"x":-8.17570114135742,"y":1.60660123825073,"z":0.348499983549118},"rot":{"x":359.921447753906,"y":269.999481201172,"z":0.0163932610303164}},"0368c1":{"lock":false,"pos":{"x":-17.1201,"y":1.619,"z":-0.03},"rot":{"x":359.9202,"y":270.0046,"z":0.0167}},"03fc1c":{"lock":false,"pos":{"x":-2.7246,"y":1.6551,"z":0.3733},"rot":{"x":359.9197,"y":269.9996,"z":0.0168}},"042d44":{"lock":false,"pos":{"x":-2.6885,"y":1.6239,"z":-5.0485},"rot":{"x":359.9197,"y":270.0006,"z":0.0168}},"0488ba":{"lock":false,"pos":{"x":-30.2242,"y":1.7004,"z":7.57},"rot":{"x":359.9201,"y":270,"z":180.0169}},"04fdb8":{"lock":false,"pos":{"x":-2.7247,"y":1.6551,"z":0.3733},"rot":{"x":359.9197,"y":270.0046,"z":0.0168}},"05109d":{"lock":false,"pos":{"x":-3.12649917602539,"y":1.12493538856506,"z":-50.2695999145508},"rot":{"x":359.979156494141,"y":89.9994506835938,"z":359.983215332031}},"057b7e":{"lock":false,"pos":{"x":-23.6764,"y":1.6111,"z":-11.51},"rot":{"x":359.9831,"y":-0.0008,"z":359.9201}},"058b91":{"lock":false,"pos":{"x":-3.9559,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9998,"z":0.0168}},"05dd0a":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9998,"z":0.0168}},"0679c6":{"lock":false,"pos":{"x":-11.8399,"y":1.6678,"z":0.2602},"rot":{"x":359.9201,"y":269.988,"z":0.0169}},"06d29e":{"lock":false,"pos":{"x":-2.7248,"y":1.6551,"z":0.3733},"rot":{"x":0.0168,"y":179.9995,"z":0.0803}},"06f882":{"lock":true,"pos":{"x":-3.769,"y":4.1352,"z":5.6708},"rot":{"x":0,"y":90,"z":0}},"07bfca":{"lock":false,"pos":{"x":-11.1535,"y":1.6509,"z":1.3602},"rot":{"x":359.9201,"y":269.9977,"z":0.0169}},"0916b6":{"lock":false,"pos":{"x":12.2515,"y":1.4609,"z":-12.0147},"rot":{"x":359.9201,"y":270.0068,"z":0.0169}},"0967ea":{"lock":false,"pos":{"x":-23.6765,"y":1.6885,"z":7.57},"rot":{"x":359.9201,"y":269.9941,"z":0.0169}},"0a7a51":{"lock":false,"pos":{"x":-17.1199,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":270,"z":180.0169}},"0aa185":{"lock":false,"pos":{"x":-1.46660375595093,"y":1.47562384605408,"z":-26.9305057525635},"rot":{"x":359.920135498047,"y":269.996429443359,"z":0.0168766714632511}},"0acbd8":{"lock":false,"pos":{"x":-30.2243,"y":1.6959,"z":-7.7},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"0b6540":{"lock":false,"pos":{"x":-3.9276,"y":1.7299,"z":5.7571},"rot":{"x":359.9197,"y":270,"z":180.0168}},"0c01a1":{"lock":false,"pos":{"x":1.2422,"y":1.3947,"z":0.1206},"rot":{"x":359.9832,"y":0.0007,"z":359.9197}},"0ce6bb":{"lock":false,"pos":{"x":-12.6932,"y":1.6812,"z":6.9294},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"0d0ca8":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.6292097568512,"z":3.86000061035156},"rot":{"x":359.920104980469,"y":269.999908447266,"z":180.016830444336}},"0d7898":{"lock":false,"pos":{"x":-23.6765,"y":1.6868,"z":-7.7},"rot":{"x":359.9201,"y":269.9998,"z":180.0169}},"0d9dc2":{"lock":false,"pos":{"x":-20.7379,"y":1.6093,"z":-3.7735},"rot":{"x":359.9747,"y":209.9999,"z":0.0776}},"0df520":{"lock":false,"pos":{"x":-11.4769,"y":1.6694,"z":7.3277},"rot":{"x":359.9201,"y":269.9876,"z":0.0169}},"0e52c8":{"lock":false,"pos":{"x":-36.7731,"y":1.7045,"z":-0.03},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"0e6c8c":{"lock":false,"pos":{"x":-3.9277,"y":1.6971,"z":5.7571},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"0eb577":{"lock":false,"pos":{"x":-3.9275,"y":1.7611,"z":5.7571},"rot":{"x":359.9197,"y":269.9856,"z":180.0168}},"0f2ffc":{"lock":false,"pos":{"x":-2.6886,"y":1.6555,"z":-5.0485},"rot":{"x":0.0169,"y":179.9837,"z":0.0803}},"0f3e93":{"lock":false,"pos":{"x":-26.9859,"y":1.6191,"z":-0.0135},"rot":{"x":359.9201,"y":269.994,"z":0.0169}},"0f6d69":{"lock":false,"pos":{"x":-20.4015,"y":1.6099,"z":-0.1772},"rot":{"x":0.0799,"y":90.0005,"z":359.9831}},"102272":{"lock":false,"pos":{"x":-10.2894,"y":1.6717,"z":2.0208},"rot":{"x":359.9201,"y":270.0023,"z":0.0169}},"1078c7":{"lock":false,"pos":{"x":1.6964,"y":1.6699,"z":14.2788},"rot":{"x":359.9552,"y":224.998,"z":180.0686}},"109907":{"lock":false,"pos":{"x":-17.12,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":269.9846,"z":180.0169}},"11429d":{"lock":false,"pos":{"x":9.5267,"y":1.2845,"z":4.5868},"rot":{"x":0.0799,"y":89.9987,"z":359.9831}},"11a797":{"lock":false,"pos":{"x":-17.12,"y":1.6793,"z":7.57},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"12d492":{"lock":false,"pos":{"x":-30.2242,"y":1.6225,"z":-3.83},"rot":{"x":0.0169,"y":179.9998,"z":0.0799}},"13bc7d":{"lock":true,"pos":{"x":-33.1967010498047,"y":1.61310005187988,"z":30.128999710083},"rot":{"x":359.983093261719,"y":0,"z":359.920104980469}},"13c965":{"lock":false,"pos":{"x":-3.9276,"y":1.7504,"z":5.7571},"rot":{"x":359.9197,"y":269.9855,"z":180.0168}},"13ed7d":{"lock":false,"pos":{"x":12.2512035369873,"y":1.28292536735535,"z":11.9865989685059},"rot":{"x":0.0799588114023209,"y":89.9949340820313,"z":359.983093261719}},"13f15a":{"lock":false,"pos":{"x":3.8578,"y":1.414,"z":50.4456},"rot":{"x":0.0002,"y":270.0157,"z":359.3563}},"141409":{"lock":false,"pos":{"x":-30.2241,"y":1.6982,"z":-0.03},"rot":{"x":359.9201,"y":269.9963,"z":180.0169}},"147dea":{"lock":false,"pos":{"x":9.4431,"y":1.2854,"z":7.085},"rot":{"x":0.0799,"y":89.9987,"z":359.9831}},"149816":{"lock":false,"pos":{"x":-30.2241,"y":1.6225,"z":-3.83},"rot":{"x":359.9831,"y":-0.0009,"z":359.9201}},"149deb":{"lock":false,"pos":{"x":-17.1199,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"14fd91":{"lock":false,"pos":{"x":-2.7248,"y":1.6551,"z":0.3733},"rot":{"x":0.0168,"y":180.0145,"z":0.0803}},"150603":{"lock":false,"pos":{"x":-4.4609,"y":1.5834,"z":-14.7893},"rot":{"x":359.9197,"y":269.9951,"z":0.0168}},"15b639":{"lock":false,"pos":{"x":-2.68849968910217,"y":1.61911654472351,"z":-5.04850006103516},"rot":{"x":0.01681237667799,"y":180.0166015625,"z":0.0802607834339142}},"16ceab":{"lock":false,"pos":{"x":12.2508,"y":1.4684,"z":13.4375},"rot":{"x":359.9201,"y":269.9978,"z":0.0169}},"1708ee":{"lock":false,"pos":{"x":8.985,"y":1.2765,"z":-25.4264},"rot":{"x":359.9767,"y":355.3276,"z":359.9217}},"17807e":{"lock":false,"pos":{"x":-23.6766,"y":1.6314,"z":11.46},"rot":{"x":359.9201,"y":269.9978,"z":180.0168}},"18aa54":{"lock":false,"pos":{"x":12.2496,"y":1.4727,"z":27.9865},"rot":{"x":359.9201,"y":270.0681,"z":0.0168}},"1a3caf":{"lock":false,"pos":{"x":-3.9559,"y":1.5975,"z":-10.4412},"rot":{"x":359.9197,"y":269.9996,"z":0.0168}},"1a4e64":{"lock":false,"pos":{"x":-23.6766,"y":1.6862,"z":-0.03},"rot":{"x":359.9201,"y":269.9746,"z":0.0169}},"1aa87a":{"lock":false,"pos":{"x":-30.2245,"y":1.704,"z":7.5705},"rot":{"x":359.9201,"y":269.9915,"z":180.0169}},"1ac3ac":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":270.0313,"z":0.0168}},"1ae75c":{"lock":false,"pos":{"x":-23.6765,"y":1.684,"z":-7.7},"rot":{"x":359.9201,"y":269.9961,"z":0.0169}},"1ae977":{"lock":false,"pos":{"x":-33.4282,"y":1.6258,"z":-7.7062},"rot":{"x":0.0799,"y":90.0006,"z":359.9831}},"1af6e8":{"lock":false,"pos":{"x":-30.2241,"y":1.6976,"z":7.57},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"1c6049":{"lock":false,"pos":{"x":-2.7315,"y":1.6551,"z":0.3733},"rot":{"x":359.9197,"y":269.9742,"z":0.0169}},"1cc5a6":{"lock":false,"pos":{"x":12.2487,"y":1.29,"z":35.9869},"rot":{"x":359.9831,"y":0.0021,"z":359.92}},"1d2e12":{"lock":false,"pos":{"x":-3.956,"y":1.6585,"z":-10.4412},"rot":{"x":359.9197,"y":270.0003,"z":180.0168}},"1d53b9":{"lock":false,"pos":{"x":-27.1699,"y":1.6203,"z":3.4176},"rot":{"x":359.9316,"y":315.0006,"z":359.9554}},"1dd120":{"lock":false,"pos":{"x":-23.6766,"y":1.6913,"z":7.57},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"1e00a9":{"lock":false,"pos":{"x":9.3117,"y":1.285,"z":4.9883},"rot":{"x":0.0799,"y":89.9803,"z":359.9831}},"1e3806":{"lock":false,"pos":{"x":-30.2242,"y":1.6225,"z":-3.83},"rot":{"x":359.9832,"y":0.0096,"z":359.92}},"1e3988":{"lock":false,"pos":{"x":-30.2243,"y":1.6959,"z":-7.7},"rot":{"x":359.9201,"y":270.0014,"z":180.0169}},"1e7961":{"lock":false,"pos":{"x":-17.12,"y":1.6771,"z":-0.03},"rot":{"x":359.9203,"y":270,"z":0.016}},"1e7f1b":{"lock":false,"pos":{"x":-14.3835,"y":1.6303,"z":-0.2141},"rot":{"x":359.3509,"y":269.9973,"z":0.0169}},"1e99b2":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9852,"z":0.0169}},"1ee2a5":{"lock":false,"pos":{"x":-33.3772,"y":1.628,"z":-0.0078},"rot":{"x":0.0799,"y":90.0005,"z":359.9831}},"1f4db7":{"lock":false,"pos":{"x":-7.7139,"y":1.7478,"z":15.225},"rot":{"x":359.92,"y":270.0018,"z":180.0169}},"1fae15":{"lock":false,"pos":{"x":12.1805038452148,"y":1.27355456352234,"z":-20.1693019866943},"rot":{"x":0.0799674317240715,"y":89.9949417114258,"z":359.983062744141}},"201524":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":0.0168,"y":180.0351,"z":0.08}},"20314c":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":0.0169,"y":180,"z":0.0799}},"20982e":{"lock":false,"pos":{"x":8.3104,"y":1.2871,"z":7.5999},"rot":{"x":0.08,"y":89.9985,"z":359.9831}},"21c977":{"lock":false,"pos":{"x":-21.0584,"y":1.6119,"z":3.505},"rot":{"x":359.9554,"y":225,"z":0.0684}},"21f7a4":{"lock":false,"pos":{"x":-26.8493995666504,"y":1.61939942836761,"z":1.71710026264191},"rot":{"x":359.939239501953,"y":239.997482299805,"z":0.0545193664729595}},"222582":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"225690":{"lock":false,"pos":{"x":-17.1199,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"2261a5":{"lock":false,"pos":{"x":-4.7182,"y":1.5837,"z":-14.7432},"rot":{"x":359.9197,"y":270.0041,"z":0.0168}},"22cf16":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9969,"z":0.0168}},"22e3f2":{"lock":false,"pos":{"x":-2.6904,"y":1.655,"z":-5.0485},"rot":{"x":359.9197,"y":270.0118,"z":0.0168}},"239c56":{"lock":false,"pos":{"x":-36.7733,"y":1.7022,"z":-7.7},"rot":{"x":359.9201,"y":269.9961,"z":0.0169}},"23bbd8":{"lock":false,"pos":{"x":-27.2865,"y":1.6195,"z":-0.0152},"rot":{"x":0.0799,"y":89.9999,"z":359.9831}},"23d608":{"lock":false,"pos":{"x":-2.6884,"y":1.6535,"z":-5.0486},"rot":{"x":359.9197,"y":269.9854,"z":0.0169}},"23dd51":{"lock":false,"pos":{"x":12.2498416900635,"y":1.46560573577881,"z":3.98638510704041},"rot":{"x":359.920135498047,"y":269.999908447266,"z":0.0168732777237892}},"245765":{"lock":false,"pos":{"x":-11.097,"y":1.6708,"z":13.7077},"rot":{"x":359.9201,"y":269.9857,"z":0.0169}},"245b8d":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9964,"z":180.0169}},"24c385":{"lock":false,"pos":{"x":11.813,"y":1.4648,"z":-0.6861},"rot":{"x":359.9201,"y":270.0074,"z":0.0169}},"24e5eb":{"lock":false,"pos":{"x":-5.6029,"y":1.5487,"z":23.9983},"rot":{"x":359.9201,"y":270.0043,"z":359.5229}},"256aa6":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":270.0001,"z":0.0168}},"259b7b":{"lock":false,"pos":{"x":-20.746,"y":1.685,"z":-0.0446},"rot":{"x":359.9201,"y":270.0016,"z":180.0169}},"261874":{"lock":false,"pos":{"x":-17.1201,"y":1.6144,"z":-15.28},"rot":{"x":359.9201,"y":269.9753,"z":0.0169}},"266dcb":{"lock":false,"pos":{"x":8.1241,"y":1.2846,"z":-1.7036},"rot":{"x":0.08,"y":89.9962,"z":359.9831}},"267216":{"lock":false,"pos":{"x":-12.2715015411377,"y":1.49063980579376,"z":-27.0919055938721},"rot":{"x":359.920135498047,"y":270.001373291016,"z":0.0168702155351639}},"268bd8":{"lock":false,"pos":{"x":-30.2243,"y":1.6937,"z":-15.28},"rot":{"x":359.9201,"y":269.996,"z":180.0169}},"26b589":{"lock":false,"pos":{"x":-2.7247,"y":1.658,"z":0.3733},"rot":{"x":359.9198,"y":269.9589,"z":0.0169}},"271ce2":{"lock":false,"pos":{"x":-4.3628,"y":1.5831,"z":-15.1267},"rot":{"x":359.9197,"y":270.0001,"z":0.0168}},"27bf6a":{"lock":false,"pos":{"x":-10.5675,"y":1.6537,"z":13.5759},"rot":{"x":359.9201,"y":270.0211,"z":0.0168}},"27dc65":{"lock":false,"pos":{"x":-20.5971,"y":1.6123,"z":7.2097},"rot":{"x":359.9201,"y":269.993,"z":0.0169}},"28272f":{"lock":false,"pos":{"x":-27.0195,"y":1.6235,"z":14.5832},"rot":{"x":359.9201,"y":270.0063,"z":0.0169}},"286579":{"lock":false,"pos":{"x":12.2487,"y":1.2782,"z":-4.0135},"rot":{"x":0.08,"y":90.0003,"z":359.9831}},"2889f0":{"lock":false,"pos":{"x":9.5686,"y":1.2858,"z":9.0951},"rot":{"x":0.0799,"y":89.9924,"z":359.9831}},"28cca1":{"lock":false,"pos":{"x":-2.6882,"y":1.6191,"z":-5.0485},"rot":{"x":0.0168,"y":179.9995,"z":0.0803}},"299ea1":{"lock":false,"pos":{"x":-30.223,"y":1.6982,"z":-0.0301},"rot":{"x":359.9201,"y":270.024,"z":180.0168}},"29a427":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":359.9831,"y":-0.0032,"z":359.9201}},"29d7e2":{"lock":false,"pos":{"x":-15.5985,"y":1.8209,"z":0.017},"rot":{"x":359.8887,"y":269.9785,"z":0.0184}},"2ab9ac":{"lock":false,"pos":{"x":-17.12,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":269.9964,"z":180.0169}},"2bd90b":{"lock":false,"pos":{"x":12.2499008178711,"y":1.47031700611115,"z":19.9864044189453},"rot":{"x":359.920135498047,"y":269.998413085938,"z":0.0168759748339653}},"2c792a":{"lock":false,"pos":{"x":-34.0171,"y":1.6278,"z":-3.8093},"rot":{"x":0.0684,"y":134.9883,"z":0.0445}},"2cea4e":{"lock":false,"pos":{"x":66.0026016235352,"y":1.11109709739685,"z":-58.8017997741699},"rot":{"x":359.979156494141,"y":89.9906921386719,"z":359.983215332031}},"2d17c9":{"lock":false,"pos":{"x":-23.6765,"y":1.6913,"z":7.57},"rot":{"x":359.9201,"y":269.9958,"z":180.0169}},"2d9794":{"lock":false,"pos":{"x":-4.7969,"y":1.5838,"z":-15.0746},"rot":{"x":359.9197,"y":270.0009,"z":0.0168}},"2e4956":{"lock":false,"pos":{"x":-11.6656,"y":1.6551,"z":9.0735},"rot":{"x":359.9201,"y":269.9792,"z":0.0169}},"2e887e":{"lock":false,"pos":{"x":-3.9083,"y":1.5825,"z":-15.1234},"rot":{"x":359.9197,"y":269.9998,"z":0.0168}},"2e8f0a":{"lock":false,"pos":{"x":-2.7247,"y":1.6566,"z":0.3733},"rot":{"x":359.9197,"y":269.9843,"z":0.0169}},"2ebcda":{"lock":false,"pos":{"x":12.2489032745361,"y":1.46325099468231,"z":-4.01340055465698},"rot":{"x":359.920104980469,"y":270.041198730469,"z":0.0168166663497686}},"2ec188":{"lock":false,"pos":{"x":12.2495,"y":1.2688,"z":-36.0139},"rot":{"x":359.9831,"y":-0.0057,"z":359.92}},"2ec534":{"lock":false,"pos":{"x":-12.3654,"y":1.6721,"z":11.366},"rot":{"x":0.0799,"y":90,"z":359.9831}},"2f12bf":{"lock":false,"pos":{"x":-8.79560089111328,"y":1.60410356521606,"z":-11.0351009368896},"rot":{"x":359.921997070313,"y":270.050109863281,"z":0.0166930817067623}},"2f4093":{"lock":false,"pos":{"x":-30.2242,"y":1.6976,"z":7.57},"rot":{"x":359.9201,"y":269.9995,"z":0.0169}},"2fe933":{"lock":false,"pos":{"x":-3.9273,"y":1.7877,"z":5.7571},"rot":{"x":359.9197,"y":269.986,"z":180.0168}},"309b74":{"lock":false,"pos":{"x":-12.4322,"y":1.6796,"z":7.3153},"rot":{"x":359.9201,"y":270.0005,"z":0.0169}},"30c8b6":{"lock":false,"pos":{"x":-20.4245,"y":1.6099,"z":-0.3109},"rot":{"x":359.9201,"y":270.0001,"z":0.0169}},"3106e6":{"lock":false,"pos":{"x":1.6965,"y":1.6368,"z":14.2788},"rot":{"x":359.9552,"y":224.998,"z":0.0687}},"313523":{"lock":false,"pos":{"x":10.762,"y":1.4665,"z":-0.0039},"rot":{"x":359.9201,"y":270.0055,"z":0.0169}},"31a93a":{"lock":false,"pos":{"x":8.9743,"y":1.2844,"z":1.3267},"rot":{"x":0.0799,"y":89.9966,"z":359.9831}},"32039e":{"lock":false,"pos":{"x":12.2498016357422,"y":1.4608941078186,"z":-12.0138006210327},"rot":{"x":359.920135498047,"y":270.007476806641,"z":0.0168635416775942}},"3210d6":{"lock":false,"pos":{"x":-27.0934,"y":1.6172,"z":-7.2278},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"3296c9":{"lock":false,"pos":{"x":-2.689,"y":1.6535,"z":-5.0428},"rot":{"x":359.9197,"y":270.0282,"z":0.0168}},"33116d":{"lock":false,"pos":{"x":-27.119,"y":1.6184,"z":-3.2752},"rot":{"x":0.0446,"y":44.9999,"z":359.9316}},"336335":{"lock":false,"pos":{"x":-23.6765,"y":1.6828,"z":-11.51},"rot":{"x":359.9201,"y":269.9848,"z":0.0169}},"33b200":{"lock":false,"pos":{"x":-2.6885,"y":1.6535,"z":-5.0485},"rot":{"x":359.9197,"y":269.9997,"z":0.0168}},"35c492":{"lock":false,"pos":{"x":-17.1199,"y":1.6042,"z":-3.83},"rot":{"x":0.0169,"y":179.9977,"z":0.0799}},"3671bf":{"lock":false,"pos":{"x":9.0068,"y":1.2755,"z":-28.7444},"rot":{"x":359.9831,"y":0.001,"z":359.92}},"368ca7":{"lock":false,"pos":{"x":-2.6886,"y":1.6623,"z":-5.0485},"rot":{"x":359.9832,"y":-0.0001,"z":359.9197}},"370ae5":{"lock":false,"pos":{"x":7.3549,"y":1.5428,"z":0.9084},"rot":{"x":359.9201,"y":270,"z":0.0169}},"37c889":{"lock":false,"pos":{"x":-3.9559,"y":1.6585,"z":-10.4409},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"37ec51":{"lock":false,"pos":{"x":-17.12,"y":1.6771,"z":-0.03},"rot":{"x":359.9201,"y":269.9792,"z":0.0169}},"383672":{"lock":false,"pos":{"x":-23.6765,"y":1.6851,"z":-3.83},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"38fcc6":{"lock":false,"pos":{"x":9.0367,"y":1.2744,"z":-32.2131},"rot":{"x":359.9832,"y":0.0001,"z":359.92}},"3a3b5a":{"lock":false,"pos":{"x":8.159,"y":1.286,"z":2.9166},"rot":{"x":0.08,"y":89.9925,"z":359.9831}},"3b1e55":{"lock":false,"pos":{"x":-9.6032,"y":1.5034,"z":28.8126},"rot":{"x":359.9201,"y":269.9945,"z":0.0169}},"3b6690":{"lock":false,"pos":{"x":-20.3057,"y":1.6086,"z":-3.9972},"rot":{"x":359.9554,"y":224.9999,"z":0.0684}},"3ba2fb":{"lock":false,"pos":{"x":-30.2244,"y":1.6909,"z":-15.28},"rot":{"x":359.9201,"y":269.9962,"z":0.0169}},"3ba881":{"lock":false,"pos":{"x":-23.6766,"y":1.6885,"z":7.57},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"3be6e8":{"lock":false,"pos":{"x":-10.0797,"y":1.674,"z":-0.4023},"rot":{"x":359.9201,"y":269.9863,"z":0.0169}},"3c18ed":{"lock":false,"pos":{"x":-2.6885,"y":1.655,"z":-5.0482},"rot":{"x":359.9197,"y":269.9865,"z":0.0169}},"3c4300":{"lock":false,"pos":{"x":-23.6766,"y":1.6862,"z":-0.03},"rot":{"x":359.9201,"y":269.9987,"z":0.0169}},"3c6d68":{"lock":false,"pos":{"x":-11.7638,"y":1.6337,"z":-14.9715},"rot":{"x":359.9201,"y":270.0002,"z":0.0169}},"3cf9b8":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9969,"z":0.0169}},"3d2a1a":{"lock":false,"pos":{"x":-3.9275,"y":1.7504,"z":5.7571},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"3d9a8b":{"lock":false,"pos":{"x":-22.2198,"y":1.7339,"z":-7.7092},"rot":{"x":0.0792,"y":269.9715,"z":359.9832}},"3da6dd":{"lock":false,"pos":{"x":12.2621040344238,"y":1.27820038795471,"z":-4.00930261611938},"rot":{"x":0.0799657329916954,"y":89.9984359741211,"z":359.983093261719}},"3dc34f":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9974,"z":0.0168}},"3eef2e":{"lock":false,"pos":{"x":-9.6732,"y":1.6648,"z":0.0646},"rot":{"x":359.9201,"y":269.9858,"z":0.0169}},"3fb8ed":{"lock":false,"pos":{"x":-2.68849992752075,"y":1.62393057346344,"z":-5.04850149154663},"rot":{"x":359.919738769531,"y":270.000061035156,"z":0.0168369449675083}},"4011a5":{"lock":false,"pos":{"x":-17.1199,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9961,"z":180.0169}},"4027ed":{"lock":false,"pos":{"x":-30.2245006561279,"y":1.62473559379578,"z":3.86010050773621},"rot":{"x":0.0168600361794233,"y":179.98503112793,"z":0.0799304693937302}},"4076cd":{"lock":false,"pos":{"x":12.2501,"y":1.4727,"z":27.9864},"rot":{"x":359.9201,"y":269.9268,"z":0.017}},"407732":{"lock":false,"pos":{"x":-9.7271,"y":1.6676,"z":-0.255},"rot":{"x":359.9201,"y":269.9876,"z":0.0169}},"40f354":{"lock":false,"pos":{"x":-17.12,"y":1.6771,"z":-0.03},"rot":{"x":359.9201,"y":270.0001,"z":0.0169}},"43390e":{"lock":false,"pos":{"x":-25.129,"y":1.809,"z":-1.3516},"rot":{"x":359.9271,"y":270.0207,"z":6.3789}},"4339b6":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":270.0055,"z":0.0168}},"4369ca":{"lock":false,"pos":{"x":-20.9201,"y":1.6118,"z":3.8653},"rot":{"x":359.9747,"y":210,"z":0.0776}},"43d027":{"lock":false,"pos":{"x":-23.6765,"y":1.6862,"z":-0.0301},"rot":{"x":359.9201,"y":269.9807,"z":0.0169}},"447fd2":{"lock":false,"pos":{"x":-34.1668,"y":1.6303,"z":3.8209},"rot":{"x":0.0253,"y":29.9808,"z":359.9224}},"44b0c5":{"lock":false,"pos":{"x":-17.12,"y":1.6042,"z":-3.83},"rot":{"x":359.9831,"y":0.0002,"z":359.9201}},"4591d4":{"lock":false,"pos":{"x":-20.7985,"y":1.615,"z":15.1153},"rot":{"x":359.9201,"y":270.0109,"z":0.0169}},"4595ad":{"lock":false,"pos":{"x":-23.6765,"y":1.684,"z":-7.7},"rot":{"x":359.9201,"y":269.9967,"z":0.0169}},"45a6ec":{"lock":false,"pos":{"x":-17.1199,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":269.9998,"z":180.0169}},"45ae28":{"lock":false,"pos":{"x":-9.3921,"y":1.5611,"z":-27.1341},"rot":{"x":359.9201,"y":270,"z":180.0169}},"4667f1":{"lock":false,"pos":{"x":-27.2752,"y":1.6209,"z":4.5605},"rot":{"x":359.9316,"y":315,"z":359.9554}},"469d58":{"lock":false,"pos":{"x":-11.9576,"y":1.6717,"z":3.1538},"rot":{"x":359.9201,"y":269.9781,"z":0.0169}},"46b65b":{"lock":false,"pos":{"x":-10.4494,"y":1.5959,"z":-0.6855},"rot":{"x":359.9201,"y":270,"z":0.0169}},"46ead9":{"lock":false,"pos":{"x":-31.7026,"y":1.743,"z":-7.7614},"rot":{"x":0.081,"y":270.0021,"z":359.9834}},"4736d9":{"lock":false,"pos":{"x":-10.0405,"y":1.5945,"z":-3.243},"rot":{"x":359.9201,"y":270.0059,"z":0.0169}},"479a5a":{"lock":false,"pos":{"x":-2.7247,"y":1.656,"z":0.3733},"rot":{"x":359.9197,"y":270,"z":0.0168}},"480533":{"lock":false,"pos":{"x":-50.9243,"y":1.7294,"z":8.1784},"rot":{"x":359.9201,"y":269.931,"z":180.017}},"480756":{"lock":false,"pos":{"x":12.2534,"y":1.4727,"z":28.0062},"rot":{"x":359.9201,"y":269.9944,"z":0.0169}},"491279":{"lock":false,"pos":{"x":-3.9277,"y":1.7131,"z":5.7571},"rot":{"x":359.9197,"y":269.9995,"z":180.0168}},"49232a":{"lock":false,"pos":{"x":-26.9264,"y":1.619,"z":-0.0365},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"49dfb9":{"lock":false,"pos":{"x":12.2508,"y":1.4633,"z":-3.9202},"rot":{"x":359.9201,"y":269.9943,"z":0.0169}},"4a7540":{"lock":false,"pos":{"x":-3.9273,"y":1.7925,"z":5.7571},"rot":{"x":359.9197,"y":270.0006,"z":180.0168}},"4aaa9f":{"lock":false,"pos":{"x":-30.2242,"y":1.6248,"z":3.86},"rot":{"x":359.9832,"y":0.0095,"z":359.92}},"4add31":{"lock":false,"pos":{"x":-23.6765022277832,"y":1.65464842319489,"z":-0.0299997963011265},"rot":{"x":359.920104980469,"y":270.000030517578,"z":0.0168411564081907}},"4b81f6":{"lock":false,"pos":{"x":-3.8815,"y":1.5826,"z":-14.612},"rot":{"x":359.9197,"y":270.0021,"z":0.0168}},"4c07bf":{"lock":false,"pos":{"x":12.2919034957886,"y":1.27108502388,"z":-28.030704498291},"rot":{"x":0.0799620524048805,"y":90.0000457763672,"z":359.983093261719}},"4c173f":{"lock":false,"pos":{"x":12.2495775222778,"y":1.463250041008,"z":-4.01364850997925},"rot":{"x":359.920135498047,"y":269.999938964844,"z":0.0168728176504374}},"4c2b84":{"lock":false,"pos":{"x":-30.2242,"y":1.6248,"z":3.86},"rot":{"x":359.9831,"y":0,"z":359.92}},"4c5c55":{"lock":false,"pos":{"x":8.0489,"y":1.2874,"z":7.1029},"rot":{"x":0.0799,"y":89.9962,"z":359.9831}},"4c7aff":{"lock":false,"pos":{"x":1.6966,"y":1.6584,"z":14.2788},"rot":{"x":359.9552,"y":224.998,"z":0.0687}},"4cc43d":{"lock":false,"pos":{"x":-3.9274,"y":1.7925,"z":5.7571},"rot":{"x":359.9197,"y":269.9698,"z":180.0169}},"4d3553":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":359.9831,"y":359.9847,"z":359.9201}},"4d5e5f":{"lock":false,"pos":{"x":-2.6885,"y":1.6143,"z":-5.0485},"rot":{"x":359.9197,"y":269.9982,"z":0.0168}},"4d6544":{"lock":false,"pos":{"x":7.9998,"y":1.282,"z":-11.3677},"rot":{"x":359.92,"y":270.0005,"z":0.0169}},"4dc9bc":{"lock":false,"pos":{"x":-23.6766,"y":1.6303,"z":7.57},"rot":{"x":359.9201,"y":270.0023,"z":180.0168}},"4dee5a":{"lock":false,"pos":{"x":12.249457359314,"y":1.45618319511414,"z":-28.0136260986328},"rot":{"x":359.920135498047,"y":269.999969482422,"z":0.016874210909009}},"4e3390":{"lock":false,"pos":{"x":-13.0308,"y":1.6899,"z":7.2677},"rot":{"x":359.9201,"y":269.9855,"z":0.0169}},"4e82c5":{"lock":false,"pos":{"x":-36.7735,"y":1.7131,"z":7.5705},"rot":{"x":359.9201,"y":269.993,"z":180.0169}},"4ed173":{"lock":false,"pos":{"x":-3.9276,"y":1.7237,"z":5.7571},"rot":{"x":359.9197,"y":269.9888,"z":180.0168}},"4eeeb3":{"lock":false,"pos":{"x":-17.12,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":270,"z":180.0169}},"4f0a6b":{"lock":false,"pos":{"x":-19.6594,"y":1.61,"z":3.6336},"rot":{"x":0.0446,"y":45,"z":359.9316}},"4f944f":{"lock":false,"pos":{"x":12.2503,"y":1.4658,"z":4.6877},"rot":{"x":359.9201,"y":270.0047,"z":0.0169}},"4f9d72":{"lock":false,"pos":{"x":-2.72469973564148,"y":1.59899258613586,"z":0.37330025434494},"rot":{"x":0.0168360415846109,"y":180,"z":0.0802551060914993}},"4fa9f9":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"505e6c":{"lock":false,"pos":{"x":1.6965,"y":1.5583,"z":14.2788},"rot":{"x":359.9551,"y":224.998,"z":0.0687}},"50caf4":{"lock":false,"pos":{"x":-3.9559,"y":1.5975,"z":-10.4412},"rot":{"x":359.9197,"y":269.9998,"z":0.0168}},"50d3bc":{"lock":false,"pos":{"x":-17.12,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":269.9998,"z":180.0169}},"50ffd3":{"lock":false,"pos":{"x":-23.6765,"y":1.6902,"z":3.8601},"rot":{"x":359.9201,"y":270.0026,"z":180.0169}},"5127f6":{"lock":false,"pos":{"x":1.6965,"y":1.6662,"z":14.2788},"rot":{"x":359.9551,"y":224.9998,"z":180.0686}},"51527f":{"lock":false,"pos":{"x":-30.2243,"y":1.6954,"z":-0.03},"rot":{"x":359.9201,"y":269.9985,"z":0.0169}},"515e9e":{"lock":false,"pos":{"x":1.6965,"y":1.6368,"z":14.2789},"rot":{"x":359.9552,"y":224.9984,"z":0.0687}},"51fbbc":{"lock":false,"pos":{"x":12.2501020431519,"y":1.4726722240448,"z":27.9864044189453},"rot":{"x":359.920135498047,"y":269.995666503906,"z":0.0168801005929708}},"520889":{"lock":false,"pos":{"x":-3.8323,"y":1.5826,"z":-14.4151},"rot":{"x":359.9197,"y":270.0049,"z":0.0168}},"526ff9":{"lock":false,"pos":{"x":9.7361,"y":1.2851,"z":7.604},"rot":{"x":0.0799,"y":89.999,"z":359.9831}},"52d102":{"lock":false,"pos":{"x":12.2132043838501,"y":1.27584600448608,"z":-12.2319049835205},"rot":{"x":0.0799582898616791,"y":89.9938659667969,"z":359.983093261719}},"54707a":{"lock":false,"pos":{"x":-4.0348,"y":1.5826,"z":-15.3238},"rot":{"x":359.9197,"y":270.0002,"z":0.0168}},"5660ef":{"lock":false,"pos":{"x":-30.2242183685303,"y":1.64166986942291,"z":15.1899843215942},"rot":{"x":359.920104980469,"y":270.001068115234,"z":0.0168381482362747}},"567db0":{"lock":false,"pos":{"x":-3.974,"y":1.5826,"z":-15.0374},"rot":{"x":359.9197,"y":270.0023,"z":0.0168}},"56a08b":{"lock":false,"pos":{"x":-4.1,"y":1.5829,"z":-14.7352},"rot":{"x":359.9197,"y":270.0026,"z":0.0168}},"57318a":{"lock":false,"pos":{"x":-2.6886,"y":1.6543,"z":-5.0515},"rot":{"x":0.0169,"y":179.9818,"z":0.0803}},"5942b3":{"lock":false,"pos":{"x":-23.6766,"y":1.6874,"z":3.86},"rot":{"x":359.9201,"y":269.9991,"z":0.0169}},"5a9b00":{"lock":false,"pos":{"x":-17.1198,"y":1.6754,"z":-15.2785},"rot":{"x":359.9201,"y":270.0052,"z":180.0169}},"5abb04":{"lock":false,"pos":{"x":-23.6766,"y":1.6156,"z":3.86},"rot":{"x":359.9832,"y":-0.0044,"z":359.92}},"5b3ac7":{"lock":false,"pos":{"x":9.9267,"y":1.2833,"z":1.7477},"rot":{"x":0.0799,"y":89.9971,"z":359.9831}},"5bb7d0":{"lock":false,"pos":{"x":-23.6765,"y":1.6868,"z":-7.7},"rot":{"x":359.9201,"y":269.9953,"z":180.0169}},"5bd64c":{"lock":false,"pos":{"x":-30.2243,"y":1.6394,"z":7.5702},"rot":{"x":359.9201,"y":270.0232,"z":180.0168}},"5ca1a9":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":359.9831,"y":359.9848,"z":359.9201}},"5d070a":{"lock":false,"pos":{"x":-30.2242,"y":1.6203,"z":-11.51},"rot":{"x":359.9832,"y":0.0096,"z":359.9201}},"5d0fdd":{"lock":false,"pos":{"x":-23.6766,"y":1.6846,"z":-15.28},"rot":{"x":359.9201,"y":270.005,"z":180.0169}},"5d637f":{"lock":false,"pos":{"x":-2.1685,"y":1.493,"z":28.7958},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"5e4e43":{"lock":false,"pos":{"x":-13.2968,"y":1.6723,"z":-7.7574},"rot":{"x":359.9201,"y":270.028,"z":180.0168}},"5e7e07":{"lock":false,"pos":{"x":-23.6766,"y":1.6935,"z":15.19},"rot":{"x":359.9201,"y":270.0272,"z":180.0168}},"5ee55d":{"lock":false,"pos":{"x":-17.12,"y":1.6771,"z":-0.03},"rot":{"x":359.9201,"y":269.9988,"z":0.0169}},"5f0185":{"lock":false,"pos":{"x":-36.7732,"y":1.7045,"z":-0.03},"rot":{"x":359.9201,"y":269.9952,"z":0.0169}},"5f661f":{"lock":false,"pos":{"x":-2.6885,"y":1.655,"z":-5.0485},"rot":{"x":359.9197,"y":270.0056,"z":0.0168}},"60ad05":{"lock":false,"pos":{"x":-36.7731,"y":1.6317,"z":-3.83},"rot":{"x":0.0168,"y":180.0349,"z":0.0799}},"616612":{"lock":false,"pos":{"x":-33.8841,"y":1.6275,"z":-4.2381},"rot":{"x":0.0446,"y":45,"z":359.9316}},"61801e":{"lock":false,"pos":{"x":12.1700048446655,"y":1.28535795211792,"z":19.8675079345703},"rot":{"x":0.0799623876810074,"y":89.996826171875,"z":359.983093261719}},"61a21b":{"lock":false,"pos":{"x":-20.5245,"y":1.6101,"z":-0.2141},"rot":{"x":359.9201,"y":269.8899,"z":0.0171}},"61b186":{"lock":false,"pos":{"x":-11.155,"y":1.6791,"z":7.1548},"rot":{"x":359.9201,"y":269.9855,"z":180.0169}},"62b3ab":{"lock":false,"pos":{"x":-2.7247,"y":1.6566,"z":0.3733},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"631549":{"lock":false,"pos":{"x":-23.6766,"y":1.6157,"z":3.86},"rot":{"x":359.9832,"y":0.0089,"z":359.92}},"634aa3":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9964,"z":180.0169}},"641bdb":{"lock":false,"pos":{"x":-17.12,"y":1.6771,"z":-0.03},"rot":{"x":359.9201,"y":270,"z":0.0169}},"643870":{"lock":false,"pos":{"x":-20.1546,"y":1.6096,"z":0.0507},"rot":{"x":359.9201,"y":269.9931,"z":0.0169}},"64ad17":{"lock":false,"pos":{"x":12.2503,"y":1.4585,"z":-20.0136},"rot":{"x":359.9201,"y":269.9914,"z":0.0169}},"64b00f":{"lock":false,"pos":{"x":-17.1199,"y":1.6223,"z":11.4595},"rot":{"x":359.9201,"y":269.9901,"z":0.0169}},"64f279":{"lock":false,"pos":{"x":-17.1197,"y":1.889,"z":-11.5094},"rot":{"x":359.9201,"y":269.9996,"z":0.0169}},"65aae9":{"lock":false,"pos":{"x":-17.12,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9969,"z":180.0169}},"6645cd":{"lock":false,"pos":{"x":-23.6764,"y":1.6134,"z":-3.83},"rot":{"x":0.0169,"y":179.9981,"z":0.0799}},"668f68":{"lock":false,"pos":{"x":-26.9665,"y":1.6168,"z":-7.7199},"rot":{"x":0.0799,"y":90.0006,"z":359.9831}},"66dad0":{"lock":true,"pos":{"x":-58.557300567627,"y":1.69340002536774,"z":-18.8325004577637},"rot":{"x":359.920104980469,"y":269.999908447266,"z":0.0169000010937452}},"6791fd":{"lock":false,"pos":{"x":1.6969,"y":1.5583,"z":14.2784},"rot":{"x":359.9551,"y":224.9981,"z":0.0687}},"67cf63":{"lock":false,"pos":{"x":-12.1989,"y":1.522,"z":33.707},"rot":{"x":359.9201,"y":269.9902,"z":0.0169}},"67d524":{"lock":false,"pos":{"x":8.0606,"y":1.2899,"z":15.9247},"rot":{"x":0.08,"y":89.9808,"z":359.9831}},"686672":{"lock":false,"pos":{"x":-36.7732,"y":1.7067,"z":7.57},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"68ba2e":{"lock":false,"pos":{"x":-26.8859,"y":1.6172,"z":-6.0034},"rot":{"x":359.9554,"y":224.9895,"z":0.0684}},"68ca42":{"lock":false,"pos":{"x":-3.3874,"y":1.3969,"z":-14.6273},"rot":{"x":359.9832,"y":-0.0008,"z":359.9196}},"68e1d9":{"lock":false,"pos":{"x":-10.0449,"y":1.5965,"z":3.4829},"rot":{"x":359.9201,"y":269.9974,"z":0.0169}},"6950d2":{"lock":false,"pos":{"x":-33.7138,"y":1.6263,"z":-7.6781},"rot":{"x":0.0799,"y":89.9999,"z":359.9831}},"69c26d":{"lock":false,"pos":{"x":-4.3001,"y":1.4068,"z":14.6571},"rot":{"x":359.9832,"y":0.0007,"z":359.9197}},"6a72fc":{"lock":false,"pos":{"x":-30.2243,"y":1.6976,"z":7.57},"rot":{"x":359.9201,"y":269.9945,"z":0.0169}},"6a9431":{"lock":false,"pos":{"x":-2.7247,"y":1.664,"z":0.3733},"rot":{"x":0.0168,"y":180.0034,"z":0.0803}},"6aa57e":{"lock":false,"pos":{"x":-30.2244,"y":1.6954,"z":-0.0298},"rot":{"x":359.9207,"y":269.989,"z":0.0183}},"6bbd29":{"lock":false,"pos":{"x":-9.9085,"y":1.6664,"z":1.7308},"rot":{"x":359.9201,"y":269.9864,"z":0.0169}},"6bc393":{"lock":false,"pos":{"x":-30.2243,"y":1.7027,"z":15.19},"rot":{"x":359.9201,"y":270.0014,"z":180.0169}},"6c3b6c":{"lock":false,"pos":{"x":-17.120002746582,"y":1.6189227104187,"z":-0.0298999939113855},"rot":{"x":359.920104980469,"y":269.9970703125,"z":0.0167545769363642}},"6ca52c":{"lock":false,"pos":{"x":10.1258,"y":1.283,"z":1.8531},"rot":{"x":0.0799,"y":89.9977,"z":359.9831}},"6cb6e7":{"lock":false,"pos":{"x":-23.6764,"y":1.6134,"z":-3.83},"rot":{"x":359.9831,"y":-0.0006,"z":359.9201}},"6d8dad":{"lock":false,"pos":{"x":9.7158,"y":1.2818,"z":-4.1308},"rot":{"x":0.0799,"y":89.9964,"z":359.9831}},"6dca3e":{"lock":false,"pos":{"x":-2.7246,"y":1.6551,"z":0.3736},"rot":{"x":359.9197,"y":269.9846,"z":0.0169}},"6e0236":{"lock":false,"pos":{"x":9.3625,"y":1.284,"z":1.3791},"rot":{"x":0.0799,"y":89.9956,"z":359.9831}},"6e4a78":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":359.9831,"y":0.0003,"z":359.9201}},"6f1e9e":{"lock":false,"pos":{"x":-2.6885,"y":1.6535,"z":-5.0485},"rot":{"x":0.0169,"y":179.9695,"z":0.0802}},"6f1efa":{"lock":false,"pos":{"x":-36.7733,"y":1.705,"z":-7.7},"rot":{"x":359.9201,"y":269.996,"z":180.0169}},"6f2827":{"lock":false,"pos":{"x":-3.9277,"y":1.7664,"z":5.7571},"rot":{"x":359.9197,"y":269.9933,"z":180.0168}},"6f54e2":{"lock":false,"pos":{"x":-11.3147,"y":1.6797,"z":13.0979},"rot":{"x":359.9201,"y":269.9855,"z":180.0169}},"6f9258":{"lock":false,"pos":{"x":-20.9414,"y":1.6117,"z":3.308},"rot":{"x":0.0776,"y":120,"z":0.0253}},"709830":{"lock":false,"pos":{"x":-30.2243,"y":1.6225,"z":-3.83},"rot":{"x":359.9831,"y":-0.0046,"z":359.9201}},"7112e4":{"lock":false,"pos":{"x":-36.7732009887695,"y":1.64632904529572,"z":-0.0299993120133877},"rot":{"x":359.920104980469,"y":269.999664306641,"z":180.016830444336}},"713671":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9929,"z":0.0169}},"7234af":{"lock":false,"pos":{"x":-36.7731,"y":1.6339,"z":3.86},"rot":{"x":0.0168,"y":180.0342,"z":0.0799}},"72ab92":{"lock":false,"pos":{"x":12.25013256073,"y":1.4726722240448,"z":27.986400604248},"rot":{"x":359.920135498047,"y":270,"z":0.0168740078806877}},"7521a9":{"lock":false,"pos":{"x":-3.5895,"y":1.5822,"z":-14.7357},"rot":{"x":359.9197,"y":270.0013,"z":0.0168}},"759ab6":{"lock":false,"pos":{"x":-20.2426,"y":1.6075,"z":-7.7066},"rot":{"x":0.0799,"y":90.0007,"z":359.9831}},"75a1d7":{"lock":false,"pos":{"x":-3.92820000648499,"y":1.76844918727875,"z":5.75600099563599},"rot":{"x":359.919738769531,"y":270.007110595703,"z":180.016815185547}},"767864":{"lock":false,"pos":{"x":-6.91008472442627,"y":1.61784970760345,"z":-13.1002960205078},"rot":{"x":359.919738769531,"y":269.999938964844,"z":0.0168399773538113}},"770eca":{"lock":false,"pos":{"x":-17.12,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9958,"z":180.0169}},"789378":{"lock":false,"pos":{"x":-1.9242,"y":1.4772,"z":-23.8097},"rot":{"x":359.9201,"y":270,"z":0.0169}},"79090a":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":0.0169,"y":180,"z":0.0799}},"794376":{"lock":true,"pos":{"x":-22.7847995758057,"y":1.64330005645752,"z":-30.1574001312256},"rot":{"x":0.0169000010937452,"y":180,"z":0.0798999965190887}},"7a167a":{"lock":false,"pos":{"x":1.69940054416656,"y":1.55831527709961,"z":14.2875022888184},"rot":{"x":359.955474853516,"y":224.731384277344,"z":0.0688812211155891}},"7a4949":{"lock":false,"pos":{"x":-11.176,"y":1.6668,"z":-0.012},"rot":{"x":359.9201,"y":270.0181,"z":0.0169}},"7a4b8e":{"lock":false,"pos":{"x":-20.0769,"y":1.6117,"z":7.4094},"rot":{"x":359.9201,"y":270.0001,"z":0.0169}},"7b0f48":{"lock":false,"pos":{"x":-10.0533,"y":1.5959,"z":1.2614},"rot":{"x":359.9201,"y":269.9979,"z":0.0169}},"7b28eb":{"lock":false,"pos":{"x":12.2495,"y":1.2806,"z":3.9864},"rot":{"x":0.08,"y":89.9949,"z":359.9831}},"7b5228":{"lock":false,"pos":{"x":-17.12,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":270,"z":180.0169}},"7b57ad":{"lock":false,"pos":{"x":16.2712059020996,"y":1.27489864826202,"z":3.76080012321472},"rot":{"x":0.0799572914838791,"y":89.9929580688477,"z":359.983093261719}},"7b91a3":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.996,"z":180.0169}},"7b9e37":{"lock":false,"pos":{"x":-30.2243,"y":1.6225,"z":-3.83},"rot":{"x":0.0169,"y":179.9999,"z":0.0799}},"7ba738":{"lock":false,"pos":{"x":-3.946,"y":1.4062,"z":14.5235},"rot":{"x":359.9832,"y":-0.0016,"z":359.9197}},"7bdc6b":{"lock":false,"pos":{"x":-23.6765,"y":1.6879,"z":-3.83},"rot":{"x":359.9201,"y":270.0012,"z":180.0169}},"7cda3f":{"lock":false,"pos":{"x":12.2512,"y":1.2829,"z":11.9866},"rot":{"x":0.08,"y":89.9997,"z":359.9831}},"7d6343":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9982,"z":0.0169}},"7d8fed":{"lock":false,"pos":{"x":-30.2243003845215,"y":1.63271510601044,"z":-15.2799978256226},"rot":{"x":359.920104980469,"y":269.999938964844,"z":0.0168397836387157}},"7dcc93":{"lock":false,"pos":{"x":1.6965,"y":1.6545,"z":14.2788},"rot":{"x":359.9552,"y":224.998,"z":0.0687}},"7f9f0d":{"lock":false,"pos":{"x":9.3077,"y":1.2837,"z":0.2819},"rot":{"x":0.0799,"y":89.9984,"z":359.9831}},"7fb809":{"lock":false,"pos":{"x":-8.80660057067871,"y":1.60278069972992,"z":-15.5880012512207},"rot":{"x":359.921997070313,"y":269.999633789063,"z":0.0167620945721865}},"8075b9":{"lock":false,"pos":{"x":-2.7246,"y":1.6566,"z":0.3733},"rot":{"x":359.9197,"y":269.9854,"z":0.0169}},"8077a1":{"lock":false,"pos":{"x":9.1666,"y":1.2836,"z":-0.8205},"rot":{"x":0.0799,"y":89.9944,"z":359.9831}},"80fb47":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9855,"z":180.0169}},"81a6f5":{"lock":false,"pos":{"x":-26.8136,"y":1.6167,"z":-7.5513},"rot":{"x":0.0799,"y":90.0001,"z":359.9831}},"8221db":{"lock":false,"pos":{"x":12.2519,"y":1.468,"z":11.9864},"rot":{"x":359.9201,"y":269.9925,"z":0.0169}},"82e02f":{"lock":false,"pos":{"x":-26.575,"y":1.6185,"z":-0.1012},"rot":{"x":359.9201,"y":269.9947,"z":0.0169}},"82e1ed":{"lock":false,"pos":{"x":-4.0012,"y":1.5828,"z":-14.59},"rot":{"x":359.9197,"y":269.9926,"z":0.0168}},"8385c4":{"lock":false,"pos":{"x":-8.80050086975098,"y":1.60478103160858,"z":-8.75300121307373},"rot":{"x":359.921997070313,"y":270.004516601563,"z":180.016906738281}},"83b781":{"lock":false,"pos":{"x":-4.3576,"y":1.5832,"z":-14.9888},"rot":{"x":359.9197,"y":270.0004,"z":0.0168}},"845074":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":270,"z":0.0168}},"8480f8":{"lock":false,"pos":{"x":-3.956,"y":1.6585,"z":-10.4412},"rot":{"x":359.9197,"y":270,"z":180.0168}},"84cdaf":{"lock":false,"pos":{"x":8.0379,"y":1.2834,"z":-6.2152},"rot":{"x":0.08,"y":89.9981,"z":359.9831}},"8578ad":{"lock":false,"pos":{"x":-4.4263,"y":1.6455,"z":14.8008},"rot":{"x":359.9197,"y":269.9995,"z":0.0168}},"86cbee":{"lock":false,"pos":{"x":-17.12,"y":1.6042,"z":-3.83},"rot":{"x":0.0168,"y":180.0349,"z":0.08}},"88005c":{"lock":false,"pos":{"x":-27.1056,"y":1.6193,"z":0.044},"rot":{"x":359.9201,"y":269.9936,"z":0.0169}},"884951":{"lock":false,"pos":{"x":-23.6766,"y":1.6913,"z":7.57},"rot":{"x":359.9201,"y":269.9958,"z":180.0169}},"88a1cf":{"lock":false,"pos":{"x":-36.7732,"y":1.7022,"z":-7.7},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"893557":{"lock":false,"pos":{"x":-23.6765,"y":1.6885,"z":7.5699},"rot":{"x":359.9201,"y":269.9939,"z":0.0169}},"893c58":{"lock":false,"pos":{"x":-30.2243,"y":1.6982,"z":-0.03},"rot":{"x":359.9201,"y":269.9956,"z":180.0169}},"8944d1":{"lock":false,"pos":{"x":-3.9275,"y":1.7237,"z":5.7573},"rot":{"x":359.9197,"y":270.0005,"z":180.0168}},"8a689d":{"lock":false,"pos":{"x":-17.1197,"y":1.6503,"z":-0.0295},"rot":{"x":359.9201,"y":269.9999,"z":0.0168}},"8bae65":{"lock":false,"pos":{"x":-3.9277,"y":1.7344,"z":5.7572},"rot":{"x":359.9197,"y":269.9998,"z":180.0168}},"8ce0e1":{"lock":false,"pos":{"x":-23.6765,"y":1.6868,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"8ce4d8":{"lock":false,"pos":{"x":-2.6885,"y":1.6535,"z":-5.0485},"rot":{"x":0.0168,"y":179.9982,"z":0.0803}},"8cf84a":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":0.0169,"y":180.0001,"z":0.0799}},"8cfe99":{"lock":false,"pos":{"x":12.2498025894165,"y":1.46560561656952,"z":3.98629999160767},"rot":{"x":359.920135498047,"y":270.006072998047,"z":0.0168650802224875}},"8d88c8":{"lock":false,"pos":{"x":12.252,"y":1.468,"z":11.9863},"rot":{"x":359.9201,"y":270.0267,"z":0.0168}},"8eb793":{"lock":false,"pos":{"x":12.2504,"y":1.4656,"z":3.9856},"rot":{"x":359.9201,"y":270.0055,"z":0.0169}},"8ed50d":{"lock":false,"pos":{"x":-23.6766,"y":1.6935,"z":15.19},"rot":{"x":359.9201,"y":270.0014,"z":180.0169}},"8f0718":{"lock":false,"pos":{"x":-3.9275,"y":1.7504,"z":5.757},"rot":{"x":359.9197,"y":269.9868,"z":180.0168}},"8f297e":{"lock":false,"pos":{"x":12.2494,"y":1.4633,"z":-4.0136},"rot":{"x":359.9201,"y":269.9993,"z":0.0169}},"8f2b3d":{"lock":false,"pos":{"x":-33.341,"y":1.6301,"z":7.293},"rot":{"x":359.9201,"y":270.0001,"z":0.0169}},"8f569e":{"lock":false,"pos":{"x":-2.7247,"y":1.6566,"z":0.3733},"rot":{"x":0.0168,"y":180.027,"z":0.0803}},"905ad3":{"lock":false,"pos":{"x":8.4268,"y":1.2838,"z":-3.1101},"rot":{"x":0.0799,"y":89.9894,"z":359.9831}},"909b6f":{"lock":false,"pos":{"x":-2.6885,"y":1.6535,"z":-5.0485},"rot":{"x":359.9197,"y":270.0029,"z":0.0168}},"90aab1":{"lock":false,"pos":{"x":8.0656,"y":1.2886,"z":11.2954},"rot":{"x":0.08,"y":89.983,"z":359.9831}},"90ad8b":{"lock":false,"pos":{"x":-23.6765,"y":1.6281,"z":-0.03},"rot":{"x":359.9201,"y":269.9854,"z":180.0168}},"917494":{"lock":false,"pos":{"x":-2.7246,"y":1.664,"z":0.3733},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"92ed37":{"lock":false,"pos":{"x":-26.8628997802734,"y":1.61833643913269,"z":-1.96460044384003},"rot":{"x":359.922393798828,"y":300.005889892578,"z":359.974670410156}},"93a112":{"lock":false,"pos":{"x":-30.2243003845215,"y":1.63943076133728,"z":7.57079982757568},"rot":{"x":359.920104980469,"y":269.999206542969,"z":180.016830444336}},"949c7d":{"lock":false,"pos":{"x":-30.2242,"y":1.6248,"z":3.86},"rot":{"x":0.0169,"y":179.9995,"z":0.0799}},"952572":{"lock":false,"pos":{"x":12.2499,"y":1.4703,"z":19.9865},"rot":{"x":359.9201,"y":270.0185,"z":0.0168}},"95dc3d":{"lock":false,"pos":{"x":-12.1893,"y":1.5207,"z":29.2011},"rot":{"x":359.9201,"y":269.9885,"z":0.0169}},"961940":{"lock":false,"pos":{"x":8.4723,"y":1.2866,"z":6.7132},"rot":{"x":0.0799,"y":89.9989,"z":359.9831}},"963cfe":{"lock":false,"pos":{"x":-10.715,"y":1.6678,"z":0.2579},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"98b377":{"lock":false,"pos":{"x":-2.7248,"y":1.6566,"z":0.3733},"rot":{"x":359.9832,"y":-0.0021,"z":359.9197}},"98b72e":{"lock":false,"pos":{"x":-3.9559,"y":1.6585,"z":-10.4431},"rot":{"x":359.9197,"y":269.9995,"z":180.0168}},"98cfeb":{"lock":false,"pos":{"x":-3.95600056648254,"y":1.59753930568695,"z":-10.4416007995605},"rot":{"x":359.919738769531,"y":269.999572753906,"z":0.0168377906084061}},"98d4a2":{"lock":false,"pos":{"x":-50.9244,"y":1.7294,"z":8.1784},"rot":{"x":359.9201,"y":270,"z":180.0169}},"99db87":{"lock":true,"pos":{"x":-58.5584983825684,"y":1.69739997386932,"z":8.3577995300293},"rot":{"x":359.920104980469,"y":270.000061035156,"z":0.0169000010937452}},"9ae382":{"lock":false,"pos":{"x":-3.3515,"y":1.4052,"z":13.818},"rot":{"x":359.9832,"y":-0.0001,"z":359.9197}},"9af38c":{"lock":false,"pos":{"x":12.2501535415649,"y":1.48254573345184,"z":-36.0138473510742},"rot":{"x":-0.000153532513650134,"y":269.96923828125,"z":359.721130371094}},"9b0cf5":{"lock":false,"pos":{"x":-17.12,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9857,"z":180.0169}},"9bcafb":{"lock":false,"pos":{"x":-23.6764,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"9c6ccd":{"lock":false,"pos":{"x":-23.6765,"y":1.684,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"9caa1f":{"lock":false,"pos":{"x":-30.2242,"y":1.6248,"z":3.86},"rot":{"x":0.0168,"y":180.0349,"z":0.08}},"9cd1ad":{"lock":false,"pos":{"x":-4.0559,"y":1.5827,"z":-15.1513},"rot":{"x":359.9197,"y":270,"z":0.0168}},"9d4e42":{"lock":false,"pos":{"x":-3.9274,"y":1.7397,"z":5.7571},"rot":{"x":359.9197,"y":269.9857,"z":180.0169}},"9dab73":{"lock":false,"pos":{"x":-2.7245,"y":1.6159,"z":0.3733},"rot":{"x":359.9197,"y":269.9865,"z":0.0169}},"9e33a0":{"lock":false,"pos":{"x":12.2497,"y":1.4632,"z":-4.014},"rot":{"x":359.9201,"y":270.0055,"z":0.0169}},"9e701d":{"lock":false,"pos":{"x":-2.7247,"y":1.6566,"z":0.3733},"rot":{"x":359.9197,"y":269.9826,"z":0.0169}},"9e71b4":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4402},"rot":{"x":359.9197,"y":269.9982,"z":0.0168}},"9e73fa":{"lock":false,"pos":{"x":12.249927520752,"y":1.47031676769257,"z":19.9864044189453},"rot":{"x":359.920135498047,"y":270,"z":0.0168732572346926}},"9e9bdd":{"lock":false,"pos":{"x":-17.12,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9998,"z":180.0169}},"9e9ff6":{"lock":false,"pos":{"x":-36.7733001708984,"y":1.64407503604889,"z":-7.69999980926514},"rot":{"x":359.920104980469,"y":269.99951171875,"z":180.016830444336}},"9f9e79":{"lock":false,"pos":{"x":-3.9275,"y":1.7504,"z":5.7571},"rot":{"x":359.9197,"y":269.9856,"z":180.0168}},"9fac8b":{"lock":false,"pos":{"x":-3.9277,"y":1.7557,"z":5.7571},"rot":{"x":359.9197,"y":269.9771,"z":180.0169}},"a06ab2":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":270.0002,"z":180.0169}},"a08d45":{"lock":false,"pos":{"x":-26.798,"y":1.6211,"z":7.6211},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"a08daa":{"lock":false,"pos":{"x":-2.6884,"y":1.6535,"z":-5.0485},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"a08fa0":{"lock":false,"pos":{"x":-3.9277,"y":1.7237,"z":5.7571},"rot":{"x":359.9197,"y":269.9998,"z":180.0168}},"a0d2b1":{"lock":false,"pos":{"x":10.5681,"y":1.4641,"z":-8.947},"rot":{"x":359.9201,"y":270.0628,"z":0.0168}},"a137d8":{"lock":false,"pos":{"x":-23.6764,"y":1.6863,"z":-0.0301},"rot":{"x":359.921,"y":269.9989,"z":0.019}},"a1514c":{"lock":false,"pos":{"x":-3.9277,"y":1.7184,"z":5.7572},"rot":{"x":359.9197,"y":269.9999,"z":180.0168}},"a19bdb":{"lock":false,"pos":{"x":-30.2243,"y":1.627,"z":11.46},"rot":{"x":0.0169,"y":180.0077,"z":0.0799}},"a1b852":{"lock":false,"pos":{"x":-11.2981,"y":1.7087,"z":10.3332},"rot":{"x":359.9201,"y":269.9856,"z":180.0169}},"a1dbf2":{"lock":false,"pos":{"x":-9.5286,"y":1.6602,"z":-1.2349},"rot":{"x":359.9201,"y":269.997,"z":180.0169}},"a3dc2f":{"lock":false,"pos":{"x":-4.4458,"y":1.663,"z":14.3162},"rot":{"x":359.9197,"y":269.9745,"z":180.0169}},"a41e13":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9998,"z":180.0169}},"a45247":{"lock":false,"pos":{"x":1.6967,"y":1.5583,"z":14.2787},"rot":{"x":359.9551,"y":224.998,"z":0.0687}},"a4612b":{"lock":false,"pos":{"x":-17.12,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":269.9962,"z":180.0169}},"a492bc":{"lock":false,"pos":{"x":12.2499017715454,"y":1.45853817462921,"z":-20.013801574707},"rot":{"x":359.920104980469,"y":270.022186279297,"z":0.0168431103229523}},"a4e5e9":{"lock":false,"pos":{"x":-2.6884,"y":1.655,"z":-5.0486},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"a57738":{"lock":false,"pos":{"x":-0.0937998443841934,"y":1.61096239089966,"z":-10.4820022583008},"rot":{"x":359.919738769531,"y":269.986755371094,"z":0.0168364308774471}},"a5891b":{"lock":false,"pos":{"x":-3.5539,"y":1.5821,"z":-14.78},"rot":{"x":359.9197,"y":270.0027,"z":0.0168}},"a5b019":{"lock":false,"pos":{"x":-17.12,"y":1.602,"z":-11.51},"rot":{"x":359.9831,"y":0.0002,"z":359.92}},"a68851":{"lock":false,"pos":{"x":-23.6765,"y":1.6868,"z":-7.7},"rot":{"x":359.9201,"y":269.9972,"z":180.0169}},"a69955":{"lock":false,"pos":{"x":-30.2242,"y":1.6949,"z":-0.03},"rot":{"x":359.9201,"y":270.0005,"z":0.0169}},"a751fe":{"lock":false,"pos":{"x":-4.1944,"y":1.583,"z":-14.6164},"rot":{"x":359.9197,"y":270.0002,"z":0.0168}},"a7f7c7":{"lock":false,"pos":{"x":-36.7733001708984,"y":1.63160741329193,"z":-3.83000016212463},"rot":{"x":0.0167816318571568,"y":180.041229248047,"z":0.0799519121646881}},"a8a4b1":{"lock":false,"pos":{"x":-30.2243,"y":1.6931,"z":-7.7},"rot":{"x":359.9201,"y":269.9951,"z":0.0169}},"a8f47c":{"lock":false,"pos":{"x":1.6965,"y":1.6368,"z":14.2789},"rot":{"x":359.9552,"y":224.9986,"z":0.0687}},"a96e74":{"lock":false,"pos":{"x":-17.12,"y":1.681,"z":3.86},"rot":{"x":359.9201,"y":269.9844,"z":180.0169}},"a9c518":{"lock":false,"pos":{"x":-11.5089,"y":1.6766,"z":1.4197},"rot":{"x":359.9201,"y":269.999,"z":0.0169}},"aa3bc3":{"lock":false,"pos":{"x":-30.2243,"y":1.6982,"z":-0.03},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"aae2b1":{"lock":false,"pos":{"x":-3.566,"y":1.582,"z":-15.0714},"rot":{"x":359.9197,"y":270.0002,"z":0.0168}},"ab0576":{"lock":false,"pos":{"x":-20.6238,"y":1.6124,"z":7.2554},"rot":{"x":359.9201,"y":270,"z":0.0169}},"ab12bb":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9852,"z":0.0169}},"ab39b9":{"lock":false,"pos":{"x":-17.1201,"y":1.6234,"z":15.1897},"rot":{"x":359.9201,"y":269.988,"z":0.0169}},"ab51fa":{"lock":false,"pos":{"x":-20.3744,"y":1.6099,"z":0.0842},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"abb407":{"lock":false,"pos":{"x":-8.80510139465332,"y":1.602130651474,"z":-17.8170013427734},"rot":{"x":359.921813964844,"y":269.953735351563,"z":0.0167792495340109}},"abd037":{"lock":false,"pos":{"x":-23.6766,"y":1.6913,"z":7.57},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"acac22":{"lock":false,"pos":{"x":1.6967,"y":1.6368,"z":14.2788},"rot":{"x":359.9552,"y":225,"z":0.0687}},"ad56f2":{"lock":false,"pos":{"x":12.2499,"y":1.4703,"z":19.9864},"rot":{"x":359.9201,"y":269.9646,"z":0.0169}},"ad6736":{"lock":false,"pos":{"x":-1.1127,"y":1.7619,"z":-27.6436},"rot":{"x":359.9201,"y":269.9693,"z":0.0169}},"ade1bd":{"lock":false,"pos":{"x":-3.956,"y":1.6585,"z":-10.4412},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"ae20a4":{"lock":false,"pos":{"x":-17.1199,"y":1.6765,"z":-11.51},"rot":{"x":359.9201,"y":270,"z":180.0169}},"af4e73":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"afc427":{"lock":false,"pos":{"x":-23.6764,"y":1.6874,"z":3.86},"rot":{"x":359.9201,"y":269.9971,"z":0.0169}},"b04a1a":{"lock":false,"pos":{"x":-20.2608,"y":1.6098,"z":0.0434},"rot":{"x":0.0799,"y":90.0006,"z":359.9831}},"b11646":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9929,"z":0.0169}},"b149b1":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":359.9831,"y":0.0001,"z":359.92}},"b1bc62":{"lock":false,"pos":{"x":10.2009,"y":1.2817,"z":-2.161},"rot":{"x":0.0799,"y":89.9964,"z":359.9831}},"b1d40e":{"lock":false,"pos":{"x":-2.7247,"y":1.664,"z":0.3733},"rot":{"x":0.0168,"y":180.0068,"z":0.0803}},"b21de6":{"lock":false,"pos":{"x":-13.3172,"y":1.6804,"z":7.5859},"rot":{"x":359.9201,"y":269.9856,"z":180.0169}},"b2b842":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9855,"z":0.0169}},"b2bd25":{"lock":false,"pos":{"x":-1.177,"y":1.5467,"z":-27.5609},"rot":{"x":359.9201,"y":269.9994,"z":0.0169}},"b310b9":{"lock":false,"pos":{"x":8.6044,"y":1.2859,"z":4.9796},"rot":{"x":0.08,"y":89.9997,"z":359.9831}},"b34bec":{"lock":false,"pos":{"x":12.2503,"y":1.4538,"z":-36.0138},"rot":{"x":359.9201,"y":269.992,"z":0.0169}},"b3bfc4":{"lock":false,"pos":{"x":-1.4651,"y":1.4756,"z":-26.9305},"rot":{"x":359.9201,"y":270.0049,"z":0.0169}},"b3cbc1":{"lock":false,"pos":{"x":-3.8937,"y":1.5826,"z":-14.6014},"rot":{"x":359.9197,"y":270.0009,"z":0.0168}},"b3ec68":{"lock":false,"pos":{"x":-12.7351,"y":1.6676,"z":-7.6861},"rot":{"x":359.9201,"y":270.0001,"z":0.0169}},"b4a135":{"lock":false,"pos":{"x":-26.9258,"y":1.6168,"z":-7.7032},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"b4cf5a":{"lock":false,"pos":{"x":3.9877,"y":1.4679,"z":-27.2649},"rot":{"x":359.9201,"y":269.9991,"z":0.0169}},"b5096d":{"lock":false,"pos":{"x":-13.5542,"y":1.6749,"z":-0.1164},"rot":{"x":359.9201,"y":270.0067,"z":180.0168}},"b57f89":{"lock":false,"pos":{"x":1.6965,"y":1.6368,"z":14.2789},"rot":{"x":359.9552,"y":224.998,"z":0.0687}},"b5928a":{"lock":false,"pos":{"x":-3.6897,"y":1.5822,"z":-15.0619},"rot":{"x":359.9198,"y":269.9669,"z":0.0169}},"b5a46b":{"lock":false,"pos":{"x":-23.6764984130859,"y":1.62694978713989,"z":-3.82989978790283},"rot":{"x":359.920104980469,"y":269.999938964844,"z":180.016830444336}},"b5ceb0":{"lock":false,"pos":{"x":-26.8548,"y":1.6211,"z":7.3881},"rot":{"x":359.9201,"y":270.0042,"z":0.0169}},"b676d8":{"lock":false,"pos":{"x":-20.6237,"y":1.608,"z":-7.5965},"rot":{"x":0.0799,"y":89.9992,"z":359.9831}},"b6a235":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":0.0168,"y":180.0349,"z":0.08}},"b6d48a":{"lock":false,"pos":{"x":-26.9756,"y":1.6157,"z":-11.6402},"rot":{"x":0.0446,"y":45,"z":359.9316}},"b6da68":{"lock":false,"pos":{"x":1.6955,"y":1.5583,"z":14.2792},"rot":{"x":359.9552,"y":224.9335,"z":0.0687}},"b756c0":{"lock":false,"pos":{"x":-3.92760014533997,"y":1.72512221336365,"z":5.75710153579712},"rot":{"x":359.919738769531,"y":270.00439453125,"z":180.016815185547}},"b7e3ad":{"lock":false,"pos":{"x":-20.2216,"y":1.6119,"z":7.3408},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"b81937":{"lock":false,"pos":{"x":-26.6804,"y":1.6176,"z":-3.8413},"rot":{"x":0.0684,"y":135.0054,"z":0.0446}},"b83079":{"lock":false,"pos":{"x":-3.9275,"y":1.7184,"z":5.7571},"rot":{"x":359.9197,"y":269.9856,"z":180.0168}},"b8480f":{"lock":false,"pos":{"x":-3.9559,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"b86938":{"lock":false,"pos":{"x":12.2499,"y":1.4609,"z":-12.0136},"rot":{"x":359.9202,"y":269.7148,"z":0.0173}},"b874a8":{"lock":false,"pos":{"x":-17.1199,"y":1.6042,"z":-3.83},"rot":{"x":0.0169,"y":179.9998,"z":0.0799}},"b8ca38":{"lock":false,"pos":{"x":-23.6765,"y":1.6885,"z":7.5699},"rot":{"x":359.9201,"y":269.9985,"z":0.0169}},"b93ec9":{"lock":false,"pos":{"x":-17.1199,"y":1.6771,"z":-0.03},"rot":{"x":359.9201,"y":269.9976,"z":0.0169}},"b99de3":{"lock":false,"pos":{"x":12.2498,"y":1.4656,"z":3.9864},"rot":{"x":359.9201,"y":269.922,"z":0.017}},"ba2ded":{"lock":false,"pos":{"x":12.2492,"y":1.2759,"z":-12.0135},"rot":{"x":0.08,"y":89.9973,"z":359.9831}},"bab1d6":{"lock":false,"pos":{"x":-17.1199,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.997,"z":180.0169}},"baff62":{"lock":false,"pos":{"x":-23.6765,"y":1.6868,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"bb43b8":{"lock":false,"pos":{"x":-11.5593,"y":1.6557,"z":11.8573},"rot":{"x":359.9201,"y":269.9891,"z":0.0169}},"bb506e":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"bbb70a":{"lock":false,"pos":{"x":-3.8848,"y":1.5826,"z":-14.7351},"rot":{"x":359.9197,"y":270.0318,"z":0.0168}},"bbb99f":{"lock":false,"pos":{"x":-20.5275,"y":1.6078,"z":-7.7916},"rot":{"x":0.0799,"y":89.9999,"z":359.9831}},"bbe4b0":{"lock":false,"pos":{"x":-30.2242,"y":1.6954,"z":-0.0301},"rot":{"x":359.9201,"y":269.9937,"z":0.0169}},"bc7323":{"lock":false,"pos":{"x":-30.2242,"y":1.6225,"z":-3.83},"rot":{"x":359.9831,"y":0,"z":359.9201}},"bc825a":{"lock":false,"pos":{"x":-4.1331,"y":1.5829,"z":-14.6606},"rot":{"x":359.9197,"y":270.0001,"z":0.0168}},"bd069f":{"lock":false,"pos":{"x":9.3965,"y":1.2827,"z":-2.4823},"rot":{"x":0.0799,"y":89.9951,"z":359.9831}},"bd556e":{"lock":false,"pos":{"x":12.2509,"y":1.4585,"z":-20.0165},"rot":{"x":359.9201,"y":270.0553,"z":0.0168}},"bdd422":{"lock":false,"pos":{"x":-9.2986,"y":1.667,"z":0.0118},"rot":{"x":359.9202,"y":269.9846,"z":0.017}},"be3ac9":{"lock":false,"pos":{"x":-36.7732,"y":1.7073,"z":-0.03},"rot":{"x":359.9201,"y":269.9733,"z":180.0169}},"be5b52":{"lock":false,"pos":{"x":1.6968,"y":1.5583,"z":14.2787},"rot":{"x":359.9551,"y":224.9981,"z":0.0687}},"be5d2b":{"lock":false,"pos":{"x":-10.0804,"y":1.5953,"z":-1.0163},"rot":{"x":359.9201,"y":269.9913,"z":0.0169}},"be6abb":{"lock":false,"pos":{"x":-30.2243,"y":1.6203,"z":-11.51},"rot":{"x":359.9831,"y":0.0072,"z":359.92}},"bf0eaa":{"lock":false,"pos":{"x":-30.2261,"y":1.6983,"z":10.1027},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"bf5d39":{"lock":false,"pos":{"x":-5.9411,"y":1.5569,"z":-25.3389},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"bfa2a2":{"lock":false,"pos":{"x":-8.80050086975098,"y":1.60343933105469,"z":-13.3184013366699},"rot":{"x":359.921997070313,"y":270.002410888672,"z":0.0167618654668331}},"bfb121":{"lock":false,"pos":{"x":-17.12,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":269.9953,"z":180.0169}},"bfeb71":{"lock":false,"pos":{"x":-9.6538,"y":1.6654,"z":-0.6313},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"c0897e":{"lock":false,"pos":{"x":10.4203,"y":1.2811,"z":-2.9799},"rot":{"x":0.0799,"y":89.9995,"z":359.9831}},"c11ba5":{"lock":false,"pos":{"x":-2.6884,"y":1.6535,"z":-5.0485},"rot":{"x":359.9197,"y":269.997,"z":0.0168}},"c1aad0":{"lock":false,"pos":{"x":9.6318,"y":1.285,"z":6.3703},"rot":{"x":0.0799,"y":89.9923,"z":359.9831}},"c210e3":{"lock":false,"pos":{"x":-30.2243,"y":1.6954,"z":-0.03},"rot":{"x":359.9201,"y":269.9935,"z":0.0169}},"c29a78":{"lock":false,"pos":{"x":12.2518005371094,"y":1.46795845031738,"z":11.9862012863159},"rot":{"x":359.920135498047,"y":270.000366210938,"z":0.0168725159019232}},"c29eac":{"lock":false,"pos":{"x":-17.12,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"c2a55d":{"lock":false,"pos":{"x":8.6023,"y":1.2838,"z":-2.2398},"rot":{"x":0.08,"y":89.9987,"z":359.9831}},"c2da92":{"lock":false,"pos":{"x":-20.9563,"y":1.61,"z":-2.6211},"rot":{"x":0.0253,"y":29.9999,"z":359.9224}},"c2fe44":{"lock":false,"pos":{"x":-0.4614,"y":1.7617,"z":-25.2014},"rot":{"x":359.9201,"y":269.9758,"z":0.0169}},"c3031b":{"lock":false,"pos":{"x":-2.7228,"y":1.6208,"z":0.3589},"rot":{"x":359.9197,"y":269.9689,"z":0.0169}},"c34f49":{"lock":false,"pos":{"x":-2.6886,"y":1.6535,"z":-5.0485},"rot":{"x":0.0168,"y":180,"z":0.0803}},"c35463":{"lock":false,"pos":{"x":-30.2243,"y":1.7004,"z":7.57},"rot":{"x":359.9201,"y":269.9971,"z":180.0169}},"c37bc0":{"lock":false,"pos":{"x":-23.6764,"y":1.6879,"z":-3.83},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"c41b7b":{"lock":false,"pos":{"x":-30.2243,"y":1.6248,"z":3.86},"rot":{"x":359.9831,"y":359.9757,"z":359.9201}},"c5008a":{"lock":false,"pos":{"x":-3.5702,"y":1.5821,"z":-14.9068},"rot":{"x":359.9197,"y":270.0005,"z":0.0168}},"c51bff":{"lock":false,"pos":{"x":-17.12,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"c56f66":{"lock":false,"pos":{"x":8.2949,"y":1.2857,"z":2.5561},"rot":{"x":0.0799,"y":89.9962,"z":359.9831}},"c582af":{"lock":false,"pos":{"x":-26.9427,"y":1.6213,"z":7.6022},"rot":{"x":359.9201,"y":270.0272,"z":0.0168}},"c5a4bf":{"lock":false,"pos":{"x":-36.7731,"y":1.709,"z":15.19},"rot":{"x":359.9201,"y":270,"z":0.0169}},"c606a1":{"lock":false,"pos":{"x":-4.0681,"y":1.5827,"z":-15.3226},"rot":{"x":359.9197,"y":270.0012,"z":0.0168}},"c627fc":{"lock":false,"pos":{"x":17.8328266143799,"y":1.45285880565643,"z":-12.8706102371216},"rot":{"x":359.920104980469,"y":270.017272949219,"z":0.0168486014008522}},"c6305b":{"lock":false,"pos":{"x":-2.7247,"y":1.6551,"z":0.3733},"rot":{"x":0.0168,"y":179.9938,"z":0.0803}},"c6995b":{"lock":false,"pos":{"x":-21.6704,"y":1.6106,"z":-3.7228},"rot":{"x":359.9316,"y":315.0002,"z":359.9554}},"c6a2ab":{"lock":false,"pos":{"x":-27.6254,"y":1.6167,"z":-11.1322},"rot":{"x":359.9316,"y":314.9959,"z":359.9554}},"c6a9ae":{"lock":false,"pos":{"x":-3.9274,"y":1.7611,"z":5.7572},"rot":{"x":359.9197,"y":269.9857,"z":180.0168}},"c7c0a9":{"lock":false,"pos":{"x":-2.7247,"y":1.6208,"z":0.3733},"rot":{"x":359.9197,"y":270.0151,"z":0.0168}},"c99e9d":{"lock":false,"pos":{"x":-2.6886,"y":1.6623,"z":-5.0485},"rot":{"x":359.9197,"y":269.9824,"z":0.0169}},"c9d140":{"lock":false,"pos":{"x":-12.2295,"y":1.5215,"z":31.5404},"rot":{"x":359.9201,"y":269.9884,"z":0.0169}},"c9e9ad":{"lock":false,"pos":{"x":-5.3818,"y":1.4082,"z":14.423},"rot":{"x":359.9832,"y":-0.0034,"z":359.9196}},"ca0e9b":{"lock":false,"pos":{"x":-23.6765,"y":1.684,"z":-7.7},"rot":{"x":359.9201,"y":269.9952,"z":0.0169}},"cb2e63":{"lock":false,"pos":{"x":-23.6775,"y":1.689,"z":-0.0357},"rot":{"x":359.92,"y":270.3729,"z":180.0163}},"cca4ce":{"lock":false,"pos":{"x":-23.6764,"y":1.684,"z":-7.6884},"rot":{"x":359.9201,"y":270.0044,"z":0.0167}},"cce0e0":{"lock":false,"pos":{"x":-12.0115,"y":1.671,"z":7.4502},"rot":{"x":359.9201,"y":270.0065,"z":0.0169}},"cd676c":{"lock":false,"pos":{"x":-2.6885,"y":1.6623,"z":-5.0486},"rot":{"x":0.0168,"y":180.0007,"z":0.0803}},"cde2d1":{"lock":false,"pos":{"x":-2.6885,"y":1.6459,"z":-5.0485},"rot":{"x":359.9197,"y":270.0159,"z":0.0168}},"ce2091":{"lock":false,"pos":{"x":-17.12,"y":1.6778,"z":3.86},"rot":{"x":359.9201,"y":269.9993,"z":0.0169}},"ce35ae":{"lock":false,"pos":{"x":-2.7247,"y":1.6551,"z":0.3733},"rot":{"x":0.0168,"y":180.0006,"z":0.0803}},"d0c475":{"lock":false,"pos":{"x":-17.12,"y":1.6844,"z":15.19},"rot":{"x":359.9201,"y":270.0072,"z":180.0168}},"d14543":{"lock":false,"pos":{"x":-12.2221,"y":1.4168,"z":11.1913},"rot":{"x":0.08,"y":89.9905,"z":359.9831}},"d166f2":{"lock":false,"pos":{"x":9.8646,"y":1.2814,"z":-4.5878},"rot":{"x":0.0799,"y":89.9959,"z":359.9831}},"d1bab1":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"d26316":{"lock":false,"pos":{"x":-26.8215,"y":1.6154,"z":-11.8145},"rot":{"x":0.045,"y":45.3509,"z":359.9319}},"d2cb13":{"lock":false,"pos":{"x":-12.0254,"y":1.614,"z":7.5293},"rot":{"x":359.9201,"y":269.995,"z":0.0168}},"d306b8":{"lock":false,"pos":{"x":-12.4062,"y":1.679,"z":12.7949},"rot":{"x":359.9201,"y":269.9857,"z":180.0169}},"d33de6":{"lock":false,"pos":{"x":-20.3424,"y":1.6076,"z":-7.7619},"rot":{"x":359.9201,"y":270.002,"z":0.0169}},"d37670":{"lock":false,"pos":{"x":-3.9277,"y":1.6705,"z":5.7572},"rot":{"x":359.9197,"y":270.0103,"z":180.0168}},"d46b84":{"lock":false,"pos":{"x":-11.4019,"y":1.6887,"z":15.8439},"rot":{"x":359.9274,"y":269.9868,"z":180.3533}},"d54710":{"lock":false,"pos":{"x":-4.0215,"y":1.5826,"z":-15.2289},"rot":{"x":359.9197,"y":269.9984,"z":0.0168}},"d5b06c":{"lock":false,"pos":{"x":-4.3545,"y":1.5833,"z":-14.5586},"rot":{"x":359.9197,"y":270.0016,"z":0.0168}},"d5b604":{"lock":false,"pos":{"x":12.2505,"y":1.2731,"z":-21.3052},"rot":{"x":359.9554,"y":225.0007,"z":0.0685}},"d60ed8":{"lock":false,"pos":{"x":-30.2242,"y":1.6954,"z":-0.03},"rot":{"x":359.9201,"y":269.9992,"z":0.0169}},"d63331":{"lock":false,"pos":{"x":-50.9244,"y":1.7294,"z":8.1784},"rot":{"x":359.9201,"y":270.0003,"z":180.0169}},"d778ee":{"lock":false,"pos":{"x":-26.967,"y":1.6168,"z":-7.7901},"rot":{"x":359.9201,"y":270.0042,"z":0.0169}},"d7eb78":{"lock":false,"pos":{"x":-19.5006,"y":1.612,"z":11.2137},"rot":{"x":0.0685,"y":134.9717,"z":0.0445}},"d7fc4c":{"lock":false,"pos":{"x":-30.2198,"y":1.7004,"z":7.5731},"rot":{"x":359.9201,"y":270.0274,"z":180.0168}},"d807d4":{"lock":false,"pos":{"x":-26.8814,"y":1.619,"z":-0.0326},"rot":{"x":0.0799,"y":90.0005,"z":359.9831}},"d82996":{"lock":false,"pos":{"x":-20.2633,"y":1.6053,"z":-15.0852},"rot":{"x":0.0799,"y":90,"z":359.9831}},"d90311":{"lock":false,"pos":{"x":-30.2242,"y":1.6931,"z":-7.7001},"rot":{"x":359.9201,"y":269.9952,"z":0.0169}},"da1f25":{"lock":false,"pos":{"x":-17.1199,"y":1.6054,"z":-0.03},"rot":{"x":359.9201,"y":270.0272,"z":0.0169}},"da2cbd":{"lock":false,"pos":{"x":-17.1196,"y":1.6155,"z":-11.5093},"rot":{"x":359.9201,"y":270.0104,"z":0.0168}},"da3aed":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9855,"z":0.0169}},"da6072":{"lock":false,"pos":{"x":1.6965,"y":1.6585,"z":14.2788},"rot":{"x":359.9552,"y":224.998,"z":0.0687}},"daa95d":{"lock":false,"pos":{"x":-27.1008,"y":1.6199,"z":2.1469},"rot":{"x":359.9554,"y":224.9999,"z":0.0684}},"daef01":{"lock":false,"pos":{"x":-30.2243,"y":1.6248,"z":3.86},"rot":{"x":359.9831,"y":0.007,"z":359.92}},"db443b":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9998,"z":0.0168}},"db49f3":{"lock":false,"pos":{"x":-21.1809,"y":1.6117,"z":2.132},"rot":{"x":0.0684,"y":134.9832,"z":0.0445}},"db7039":{"lock":false,"pos":{"x":12.2519588470459,"y":1.46795845031738,"z":11.9863872528076},"rot":{"x":359.920135498047,"y":269.999938964844,"z":0.0168740916997194}},"dbbfa0":{"lock":false,"pos":{"x":-30.2243,"y":1.6959,"z":-7.7},"rot":{"x":359.9201,"y":269.9789,"z":180.0169}},"dc50b3":{"lock":false,"pos":{"x":-3.9555,"y":1.6556,"z":-10.4413},"rot":{"x":359.9197,"y":269.9999,"z":0.0168}},"dda3d5":{"lock":false,"pos":{"x":-30.2242,"y":1.6225,"z":-3.83},"rot":{"x":0.0168,"y":180.0349,"z":0.08}},"ddc104":{"lock":false,"pos":{"x":-2.6884,"y":1.6336,"z":-5.0485},"rot":{"x":359.9197,"y":269.9859,"z":0.0169}},"ddd10b":{"lock":false,"pos":{"x":8.3252,"y":1.283,"z":-6.4267},"rot":{"x":0.0799,"y":89.996,"z":359.9831}},"dde586":{"lock":false,"pos":{"x":-3.9275,"y":1.7237,"z":5.7571},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"de583f":{"lock":false,"pos":{"x":-3.956,"y":1.5975,"z":-10.4413},"rot":{"x":359.9197,"y":270.002,"z":0.0168}},"def2f5":{"lock":false,"pos":{"x":-2.7248,"y":1.664,"z":0.3734},"rot":{"x":359.9197,"y":270.001,"z":180.0168}},"df5156":{"lock":false,"pos":{"x":9.2722,"y":1.2819,"z":-6.0997},"rot":{"x":0.0799,"y":89.9909,"z":359.9831}},"df8dff":{"lock":false,"pos":{"x":-31.957,"y":1.8293,"z":-0.0662},"rot":{"x":4.7643,"y":270.0184,"z":0.017}},"dfff72":{"lock":false,"pos":{"x":-23.6764,"y":1.6913,"z":7.57},"rot":{"x":359.9201,"y":270,"z":180.0169}},"e02060":{"lock":false,"pos":{"x":-2.6886,"y":1.655,"z":-5.0485},"rot":{"x":0.0168,"y":180.0001,"z":0.0803}},"e04c21":{"lock":false,"pos":{"x":12.2493028640747,"y":1.45618331432343,"z":-28.0139045715332},"rot":{"x":359.920135498047,"y":270.002471923828,"z":0.0168705992400646}},"e0e56d":{"lock":false,"pos":{"x":-30.2243,"y":1.6993,"z":3.86},"rot":{"x":359.9201,"y":269.9972,"z":180.0169}},"e10b7c":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":359.9831,"y":0,"z":359.9201}},"e1bf6b":{"lock":false,"pos":{"x":-26.9599,"y":1.6203,"z":3.9439},"rot":{"x":359.9316,"y":315.0001,"z":359.9554}},"e1caf1":{"lock":false,"pos":{"x":12.1709051132202,"y":1.28772139549255,"z":27.8930072784424},"rot":{"x":0.0799488052725792,"y":89.9712753295898,"z":359.983062744141}},"e22a64":{"lock":false,"pos":{"x":-27.6267,"y":1.6188,"z":-4.0757},"rot":{"x":359.9316,"y":314.9999,"z":359.9554}},"e28e5b":{"lock":false,"pos":{"x":-17.1199,"y":1.6782,"z":3.86},"rot":{"x":359.9201,"y":269.9969,"z":0.0169}},"e3aa6a":{"lock":false,"pos":{"x":-17.1199,"y":1.6065,"z":3.86},"rot":{"x":359.9831,"y":-0.0033,"z":359.92}},"e413cc":{"lock":false,"pos":{"x":-23.6765,"y":1.6179,"z":11.46},"rot":{"x":359.9832,"y":0.0153,"z":359.9201}},"e47eca":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":0.0168,"y":180.0349,"z":0.08}},"e54f2a":{"lock":false,"pos":{"x":9.5041,"y":1.2855,"z":7.3849},"rot":{"x":0.0799,"y":89.9936,"z":359.9831}},"e67855":{"lock":false,"pos":{"x":-17.1201,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":269.9982,"z":180.0169}},"e6bb63":{"lock":false,"pos":{"x":12.2493,"y":1.4562,"z":-28.0157},"rot":{"x":359.9201,"y":270.0376,"z":0.0168}},"e78e52":{"lock":false,"pos":{"x":-20.229,"y":1.6108,"z":3.6702},"rot":{"x":359.9316,"y":315.0001,"z":359.9554}},"e7b998":{"lock":false,"pos":{"x":-17.1199,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":270.0052,"z":180.0169}},"e90dde":{"lock":false,"pos":{"x":-24.7567,"y":1.6149,"z":-3.8971},"rot":{"x":359.9832,"y":0.0096,"z":359.92}},"e9ae84":{"lock":false,"pos":{"x":-4.2177,"y":1.6697,"z":14.5874},"rot":{"x":359.9197,"y":269.9857,"z":180.0168}},"e9cc5a":{"lock":false,"pos":{"x":-30.2243003845215,"y":1.63719701766968,"z":-0.0299998205155134},"rot":{"x":359.920104980469,"y":269.99951171875,"z":180.016830444336}},"e9d947":{"lock":false,"pos":{"x":-2.6895,"y":1.3987,"z":-5.0483},"rot":{"x":359.9832,"y":0.0002,"z":359.9197}},"e9f3b1":{"lock":false,"pos":{"x":9.0726,"y":1.2773,"z":-22.1196},"rot":{"x":359.9831,"y":0.001,"z":359.92}},"ea0896":{"lock":false,"pos":{"x":-3.3332,"y":1.5816,"z":-15.257},"rot":{"x":359.9197,"y":270.0002,"z":0.0168}},"ea8211":{"lock":false,"pos":{"x":-30.2241,"y":1.6931,"z":-7.6998},"rot":{"x":359.9202,"y":269.9836,"z":0.0165}},"eb22de":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":359.9831,"y":359.9921,"z":359.9201}},"eb5dd9":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"eb6cf0":{"lock":false,"pos":{"x":-23.6765,"y":1.6862,"z":-0.03},"rot":{"x":359.9201,"y":269.9966,"z":0.0169}},"ec7842":{"lock":false,"pos":{"x":-16.0300998687744,"y":1.63047182559967,"z":-2.20079970359802},"rot":{"x":359.920104980469,"y":269.998748779297,"z":0.734870731830597}},"ec7a73":{"lock":false,"pos":{"x":-4.9066,"y":1.684,"z":-14.5418},"rot":{"x":359.9195,"y":270.04,"z":0.0161}},"ecbf8f":{"lock":false,"pos":{"x":-17.1201,"y":1.6754,"z":-15.2799},"rot":{"x":359.9201,"y":270.0269,"z":180.0168}},"ed48d8":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":359.9832,"y":0.0096,"z":359.92}},"eda22b":{"lock":false,"pos":{"x":-1.471,"y":1.5756,"z":-26.9334},"rot":{"x":359.9201,"y":270.107,"z":0.0167}},"edb80f":{"lock":false,"pos":{"x":-20.4959,"y":1.61,"z":-0.1873},"rot":{"x":0.0799,"y":89.9999,"z":359.9831}},"edcae4":{"lock":false,"pos":{"x":-30.2242,"y":1.6934,"z":-0.0301},"rot":{"x":359.9201,"y":270.0021,"z":0.0169}},"edd0d4":{"lock":false,"pos":{"x":-17.12,"y":1.6189,"z":-0.03},"rot":{"x":359.9201,"y":270.0099,"z":180.0168}},"ee673a":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":359.9832,"y":0.0096,"z":359.92}},"ee987d":{"lock":false,"pos":{"x":12.2499341964722,"y":1.46089422702789,"z":-12.0136156082153},"rot":{"x":359.920135498047,"y":269.999969482422,"z":0.0168737880885601}},"eea51b":{"lock":false,"pos":{"x":8.0856,"y":1.2853,"z":0.187},"rot":{"x":0.0799,"y":89.9983,"z":359.9831}},"ef067f":{"lock":false,"pos":{"x":-27.2278,"y":1.6207,"z":4.0347},"rot":{"x":0.0684,"y":135.0052,"z":0.0446}},"efba6c":{"lock":false,"pos":{"x":-50.9244,"y":1.7294,"z":8.1784},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"efe8d6":{"lock":false,"pos":{"x":-17.1201,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"f040a6":{"lock":false,"pos":{"x":12.1407060623169,"y":1.28064227104187,"z":3.70839309692383},"rot":{"x":0.0799626931548119,"y":89.9970016479492,"z":359.983093261719}},"f051fc":{"lock":false,"pos":{"x":12.2492,"y":1.475,"z":35.9864},"rot":{"x":359.9201,"y":270.0028,"z":0.0169}},"f0d16a":{"lock":false,"pos":{"x":-23.6765,"y":1.6935,"z":15.19},"rot":{"x":359.9201,"y":270.011,"z":180.0168}},"f0dbb0":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":359.9832,"y":0.0155,"z":359.92}},"f0e2dc":{"lock":false,"pos":{"x":-17.12,"y":1.6765,"z":-0.03},"rot":{"x":359.9201,"y":269.9836,"z":180.0169}},"f108e3":{"lock":false,"pos":{"x":-27.3214,"y":1.6189,"z":-2.4573},"rot":{"x":359.9316,"y":315.0002,"z":359.9554}},"f305a2":{"lock":false,"pos":{"x":-2.6885,"y":1.6535,"z":-5.0485},"rot":{"x":0.0168,"y":179.9978,"z":0.0803}},"f39e68":{"lock":false,"pos":{"x":10.161,"y":1.2842,"z":6.4667},"rot":{"x":0.0799,"y":89.9954,"z":359.9831}},"f4c93e":{"lock":false,"pos":{"x":-3.9584,"y":1.5827,"z":-14.7436},"rot":{"x":359.9197,"y":270.0297,"z":0.0168}},"f591c7":{"lock":false,"pos":{"x":-26.9568,"y":1.6207,"z":5.6374},"rot":{"x":0.0684,"y":134.9882,"z":0.0445}},"f5db25":{"lock":false,"pos":{"x":-3.6762,"y":1.5823,"z":-14.5355},"rot":{"x":359.9197,"y":270.0002,"z":0.0168}},"f5f35d":{"lock":false,"pos":{"x":-9.207,"y":1.5169,"z":30.3654},"rot":{"x":0.0169,"y":180,"z":0.0799}},"f6d6d8":{"lock":false,"pos":{"x":-17.12,"y":1.6793,"z":7.57},"rot":{"x":359.9201,"y":269.978,"z":0.0169}},"f70a0d":{"lock":false,"pos":{"x":10.9036,"y":1.4689,"z":8.8896},"rot":{"x":359.9201,"y":269.999,"z":0.0169}},"f7c15e":{"lock":false,"pos":{"x":-30.2242,"y":1.6976,"z":7.57},"rot":{"x":359.9201,"y":269.9958,"z":0.0169}},"f8005d":{"lock":false,"pos":{"x":-3.9558,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":270,"z":0.0168}},"f86867":{"lock":false,"pos":{"x":-0.7656,"y":1.4707,"z":-43.8939},"rot":{"x":0.0001,"y":269.9959,"z":1.576}},"f90f84":{"lock":false,"pos":{"x":-23.6765,"y":1.6111,"z":-11.51},"rot":{"x":359.9831,"y":0,"z":359.9201}},"f9ae22":{"lock":false,"pos":{"x":-2.7251,"y":1.6566,"z":0.3733},"rot":{"x":359.9198,"y":269.9414,"z":0.0169}},"f9fc71":{"lock":false,"pos":{"x":-50.9244,"y":1.7294,"z":8.1784},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"fa8210":{"lock":false,"pos":{"x":1.6965,"y":1.6545,"z":14.2788},"rot":{"x":359.9552,"y":224.9979,"z":0.0687}},"fadb67":{"lock":false,"pos":{"x":-23.6763,"y":1.6948,"z":7.57},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"fb280a":{"lock":false,"pos":{"x":-3.95589995384216,"y":1.59753930568695,"z":-10.441201210022},"rot":{"x":359.919738769531,"y":270.000091552734,"z":0.0168370883911848}},"fba392":{"lock":false,"pos":{"x":12.2494,"y":1.4562,"z":-28.0136},"rot":{"x":359.9201,"y":269.9914,"z":0.0169}},"fbe9fd":{"lock":false,"pos":{"x":-24.8778991699219,"y":1.61609935760498,"z":-0.15740005671978},"rot":{"x":0.0166492201387882,"y":180.136245727539,"z":0.0799793377518654}},"fbf157":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":359.9831,"y":0.0072,"z":359.92}},"fcfbbe":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":0.0169,"y":180,"z":0.0799}},"fda256":{"lock":false,"pos":{"x":-27.7376,"y":1.619,"z":-4.1724},"rot":{"x":359.9316,"y":315.0002,"z":359.9554}},"fdd75d":{"lock":false,"pos":{"x":-2.72470021247864,"y":1.62076044082642,"z":0.37329962849617},"rot":{"x":359.919738769531,"y":269.999389648438,"z":0.0168378036469221}},"fde05d":{"lock":false,"pos":{"x":-27.0646,"y":1.6215,"z":7.5852},"rot":{"x":359.9201,"y":269.9991,"z":0.0169}},"fe4e96":{"lock":false,"pos":{"x":-12.0018,"y":1.7668,"z":11.1085},"rot":{"x":359.9201,"y":270.0005,"z":180.0168}},"fed65c":{"lock":false,"pos":{"x":-2.7247,"y":1.6571,"z":0.3733},"rot":{"x":0.0169,"y":179.9893,"z":0.0803}},"ff4d6f":{"lock":false,"pos":{"x":-17.12,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":269.996,"z":180.0169}},"ffeff3":{"lock":false,"pos":{"x":-27.1788,"y":1.6183,"z":-3.7526},"rot":{"x":359.9315,"y":314.8558,"z":359.9556}}}}' +LuaScriptState: '{"ml":{"00688d":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":270,"z":0.0169}},"00dc67":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9995,"z":0.0168}},"010d85":{"lock":false,"pos":{"x":-3.9274,"y":1.7344,"z":5.7571},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"011e57":{"lock":false,"pos":{"x":7.4136,"y":1.5493,"z":-1.6503},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"01d780":{"lock":false,"pos":{"x":12.2503719329834,"y":1.45853734016418,"z":-20.013650894165},"rot":{"x":359.920135498047,"y":270,"z":0.0168738067150116}},"023e21":{"lock":false,"pos":{"x":-3.9277,"y":1.6752,"z":5.7572},"rot":{"x":359.9197,"y":269.9987,"z":180.0168}},"0251e6":{"lock":false,"pos":{"x":-58.7691,"y":1.7417,"z":22.2313},"rot":{"x":359.9201,"y":269.9973,"z":0.0169}},"025ede":{"lock":false,"pos":{"x":-2.7253,"y":1.6208,"z":0.3733},"rot":{"x":0.0168,"y":180.0004,"z":0.0803}},"02e7d2":{"lock":false,"pos":{"x":11.9735,"y":1.5323,"z":-8.617},"rot":{"x":0.0799,"y":90.0284,"z":359.9832}},"033daa":{"lock":false,"pos":{"x":-8.17570114135742,"y":1.60660123825073,"z":0.348499983549118},"rot":{"x":359.921447753906,"y":269.999481201172,"z":0.0163932610303164}},"0368c1":{"lock":false,"pos":{"x":-17.1201,"y":1.619,"z":-0.03},"rot":{"x":359.9202,"y":270.0046,"z":0.0167}},"03fc1c":{"lock":false,"pos":{"x":-2.7246,"y":1.6551,"z":0.3733},"rot":{"x":359.9197,"y":269.9996,"z":0.0168}},"042d44":{"lock":false,"pos":{"x":-2.6885,"y":1.6239,"z":-5.0485},"rot":{"x":359.9197,"y":270.0006,"z":0.0168}},"0488ba":{"lock":false,"pos":{"x":-30.2242,"y":1.7004,"z":7.57},"rot":{"x":359.9201,"y":270,"z":180.0169}},"04fdb8":{"lock":false,"pos":{"x":-2.7247,"y":1.6551,"z":0.3733},"rot":{"x":359.9197,"y":270.0046,"z":0.0168}},"05109d":{"lock":false,"pos":{"x":-3.12649917602539,"y":1.12493538856506,"z":-50.2695999145508},"rot":{"x":359.979156494141,"y":89.9994506835938,"z":359.983215332031}},"057b7e":{"lock":false,"pos":{"x":-23.6764,"y":1.6111,"z":-11.51},"rot":{"x":359.9831,"y":-0.0008,"z":359.9201}},"058b91":{"lock":false,"pos":{"x":-3.9559,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9998,"z":0.0168}},"05dd0a":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9998,"z":0.0168}},"0679c6":{"lock":false,"pos":{"x":-11.8399,"y":1.6678,"z":0.2602},"rot":{"x":359.9201,"y":269.988,"z":0.0169}},"06d29e":{"lock":false,"pos":{"x":-2.7248,"y":1.6551,"z":0.3733},"rot":{"x":0.0168,"y":179.9995,"z":0.0803}},"06f882":{"lock":true,"pos":{"x":-3.769,"y":4.1352,"z":5.6708},"rot":{"x":0,"y":90,"z":0}},"070048":{"lock":false,"pos":{"x":-30.2247867584229,"y":2.87769269943237,"z":-3.83003091812134},"rot":{"x":0.0109544377774,"y":179.998519897461,"z":1.12633097171783}},"07bfca":{"lock":false,"pos":{"x":-11.1535,"y":1.6509,"z":1.3602},"rot":{"x":359.9201,"y":269.9977,"z":0.0169}},"0916b6":{"lock":false,"pos":{"x":12.2515,"y":1.4609,"z":-12.0147},"rot":{"x":359.9201,"y":270.0068,"z":0.0169}},"0967ea":{"lock":false,"pos":{"x":-23.6765,"y":1.6885,"z":7.57},"rot":{"x":359.9201,"y":269.9941,"z":0.0169}},"0a7a51":{"lock":false,"pos":{"x":-17.1199,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":270,"z":180.0169}},"0aa185":{"lock":false,"pos":{"x":-1.46660375595093,"y":1.47562384605408,"z":-26.9305057525635},"rot":{"x":359.920135498047,"y":269.996429443359,"z":0.0168766714632511}},"0acbd8":{"lock":false,"pos":{"x":-30.2243,"y":1.6959,"z":-7.7},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"0b6540":{"lock":false,"pos":{"x":-3.9276,"y":1.7299,"z":5.7571},"rot":{"x":359.9197,"y":270,"z":180.0168}},"0c01a1":{"lock":false,"pos":{"x":1.2422,"y":1.3947,"z":0.1206},"rot":{"x":359.9832,"y":0.0007,"z":359.9197}},"0ce6bb":{"lock":false,"pos":{"x":-12.6932,"y":1.6812,"z":6.9294},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"0d0ca8":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.6292097568512,"z":3.86000061035156},"rot":{"x":359.920104980469,"y":269.999908447266,"z":180.016830444336}},"0d7898":{"lock":false,"pos":{"x":-23.6765,"y":1.6868,"z":-7.7},"rot":{"x":359.9201,"y":269.9998,"z":180.0169}},"0d9dc2":{"lock":false,"pos":{"x":-20.7379,"y":1.6093,"z":-3.7735},"rot":{"x":359.9747,"y":209.9999,"z":0.0776}},"0df520":{"lock":false,"pos":{"x":-11.4769,"y":1.6694,"z":7.3277},"rot":{"x":359.9201,"y":269.9876,"z":0.0169}},"0e52c8":{"lock":false,"pos":{"x":-36.7731,"y":1.7045,"z":-0.03},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"0e6c8c":{"lock":false,"pos":{"x":-3.9277,"y":1.6971,"z":5.7571},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"0eb577":{"lock":false,"pos":{"x":-3.9275,"y":1.7611,"z":5.7571},"rot":{"x":359.9197,"y":269.9856,"z":180.0168}},"0f2ffc":{"lock":false,"pos":{"x":-2.6886,"y":1.6555,"z":-5.0485},"rot":{"x":0.0169,"y":179.9837,"z":0.0803}},"0f3e93":{"lock":false,"pos":{"x":-26.9859,"y":1.6191,"z":-0.0135},"rot":{"x":359.9201,"y":269.994,"z":0.0169}},"0f6d69":{"lock":false,"pos":{"x":-20.4015,"y":1.6099,"z":-0.1772},"rot":{"x":0.0799,"y":90.0005,"z":359.9831}},"102272":{"lock":false,"pos":{"x":-10.2894,"y":1.6717,"z":2.0208},"rot":{"x":359.9201,"y":270.0023,"z":0.0169}},"1078c7":{"lock":false,"pos":{"x":1.6964,"y":1.6699,"z":14.2788},"rot":{"x":359.9552,"y":224.998,"z":180.0686}},"109907":{"lock":false,"pos":{"x":-17.12,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":269.9846,"z":180.0169}},"11429d":{"lock":false,"pos":{"x":9.5267,"y":1.2845,"z":4.5868},"rot":{"x":0.0799,"y":89.9987,"z":359.9831}},"11a797":{"lock":false,"pos":{"x":-17.12,"y":1.6793,"z":7.57},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"12d492":{"lock":false,"pos":{"x":-30.2242,"y":1.6225,"z":-3.83},"rot":{"x":0.0169,"y":179.9998,"z":0.0799}},"13bc7d":{"lock":true,"pos":{"x":-33.1967010498047,"y":1.61310005187988,"z":30.128999710083},"rot":{"x":359.983093261719,"y":0,"z":359.920104980469}},"13c965":{"lock":false,"pos":{"x":-3.9276,"y":1.7504,"z":5.7571},"rot":{"x":359.9197,"y":269.9855,"z":180.0168}},"13ed7d":{"lock":false,"pos":{"x":12.2512035369873,"y":1.28292536735535,"z":11.9865989685059},"rot":{"x":0.0799588114023209,"y":89.9949340820313,"z":359.983093261719}},"13f15a":{"lock":false,"pos":{"x":3.8578,"y":1.414,"z":50.4456},"rot":{"x":0.0002,"y":270.0157,"z":359.3563}},"141409":{"lock":false,"pos":{"x":-30.2241,"y":1.6982,"z":-0.03},"rot":{"x":359.9201,"y":269.9963,"z":180.0169}},"147dea":{"lock":false,"pos":{"x":9.4431,"y":1.2854,"z":7.085},"rot":{"x":0.0799,"y":89.9987,"z":359.9831}},"149816":{"lock":false,"pos":{"x":-30.2241,"y":1.6225,"z":-3.83},"rot":{"x":359.9831,"y":-0.0009,"z":359.9201}},"149deb":{"lock":false,"pos":{"x":-17.1199,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"14fd91":{"lock":false,"pos":{"x":-2.7248,"y":1.6551,"z":0.3733},"rot":{"x":0.0168,"y":180.0145,"z":0.0803}},"150603":{"lock":false,"pos":{"x":-4.4609,"y":1.5834,"z":-14.7893},"rot":{"x":359.9197,"y":269.9951,"z":0.0168}},"15b639":{"lock":false,"pos":{"x":-2.68849968910217,"y":1.61911654472351,"z":-5.04850006103516},"rot":{"x":0.01681237667799,"y":180.0166015625,"z":0.0802607834339142}},"16ceab":{"lock":false,"pos":{"x":12.2508,"y":1.4684,"z":13.4375},"rot":{"x":359.9201,"y":269.9978,"z":0.0169}},"1708ee":{"lock":false,"pos":{"x":8.985,"y":1.2765,"z":-25.4264},"rot":{"x":359.9767,"y":355.3276,"z":359.9217}},"17807e":{"lock":false,"pos":{"x":-23.6766,"y":1.6314,"z":11.46},"rot":{"x":359.9201,"y":269.9978,"z":180.0168}},"18aa54":{"lock":false,"pos":{"x":12.2496,"y":1.4727,"z":27.9865},"rot":{"x":359.9201,"y":270.0681,"z":0.0168}},"1a3caf":{"lock":false,"pos":{"x":-3.9559,"y":1.5975,"z":-10.4412},"rot":{"x":359.9197,"y":269.9996,"z":0.0168}},"1a4e64":{"lock":false,"pos":{"x":-23.6766,"y":1.6862,"z":-0.03},"rot":{"x":359.9201,"y":269.9746,"z":0.0169}},"1aa87a":{"lock":false,"pos":{"x":-30.2245,"y":1.704,"z":7.5705},"rot":{"x":359.9201,"y":269.9915,"z":180.0169}},"1ac3ac":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":270.0313,"z":0.0168}},"1ae75c":{"lock":false,"pos":{"x":-23.6765,"y":1.684,"z":-7.7},"rot":{"x":359.9201,"y":269.9961,"z":0.0169}},"1ae977":{"lock":false,"pos":{"x":-33.4282,"y":1.6258,"z":-7.7062},"rot":{"x":0.0799,"y":90.0006,"z":359.9831}},"1af6e8":{"lock":false,"pos":{"x":-30.2241,"y":1.6976,"z":7.57},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"1c6049":{"lock":false,"pos":{"x":-2.7315,"y":1.6551,"z":0.3733},"rot":{"x":359.9197,"y":269.9742,"z":0.0169}},"1cc5a6":{"lock":false,"pos":{"x":12.2487,"y":1.29,"z":35.9869},"rot":{"x":359.9831,"y":0.0021,"z":359.92}},"1d2e12":{"lock":false,"pos":{"x":-3.956,"y":1.6585,"z":-10.4412},"rot":{"x":359.9197,"y":270.0003,"z":180.0168}},"1d53b9":{"lock":false,"pos":{"x":-27.1699,"y":1.6203,"z":3.4176},"rot":{"x":359.9316,"y":315.0006,"z":359.9554}},"1dd120":{"lock":false,"pos":{"x":-23.6766,"y":1.6913,"z":7.57},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"1e00a9":{"lock":false,"pos":{"x":9.3117,"y":1.285,"z":4.9883},"rot":{"x":0.0799,"y":89.9803,"z":359.9831}},"1e3806":{"lock":false,"pos":{"x":-30.2242,"y":1.6225,"z":-3.83},"rot":{"x":359.9832,"y":0.0096,"z":359.92}},"1e3988":{"lock":false,"pos":{"x":-30.2243,"y":1.6959,"z":-7.7},"rot":{"x":359.9201,"y":270.0014,"z":180.0169}},"1e7961":{"lock":false,"pos":{"x":-17.12,"y":1.6771,"z":-0.03},"rot":{"x":359.9203,"y":270,"z":0.016}},"1e7f1b":{"lock":false,"pos":{"x":-14.3835,"y":1.6303,"z":-0.2141},"rot":{"x":359.3509,"y":269.9973,"z":0.0169}},"1e99b2":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9852,"z":0.0169}},"1ee2a5":{"lock":false,"pos":{"x":-33.3772,"y":1.628,"z":-0.0078},"rot":{"x":0.0799,"y":90.0005,"z":359.9831}},"1f45da":{"lock":false,"pos":{"x":-3.95600032806396,"y":1.59753942489624,"z":-10.441201210022},"rot":{"x":359.919738769531,"y":269.981781005859,"z":0.016862727701664}},"1f4db7":{"lock":false,"pos":{"x":-7.7139,"y":1.7478,"z":15.225},"rot":{"x":359.92,"y":270.0018,"z":180.0169}},"1fae15":{"lock":false,"pos":{"x":12.1805038452148,"y":1.27355456352234,"z":-20.1693019866943},"rot":{"x":0.0799674317240715,"y":89.9949417114258,"z":359.983062744141}},"1ffbbd":{"lock":false,"pos":{"x":-36.7734832763672,"y":3.01985335350037,"z":-0.0297832433134317},"rot":{"x":358.875793457031,"y":269.999938964844,"z":180.011093139648}},"201524":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":0.0168,"y":180.0351,"z":0.08}},"20314c":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":0.0169,"y":180,"z":0.0799}},"20323b":{"lock":false,"pos":{"x":-33.9124870300293,"y":2.95169687271118,"z":11.2223796844482},"rot":{"x":359.212371826172,"y":225.002655029297,"z":0.790325880050659}},"20982e":{"lock":false,"pos":{"x":8.3104,"y":1.2871,"z":7.5999},"rot":{"x":0.08,"y":89.9985,"z":359.9831}},"21c977":{"lock":false,"pos":{"x":-21.0584,"y":1.6119,"z":3.505},"rot":{"x":359.9554,"y":225,"z":0.0684}},"21f7a4":{"lock":false,"pos":{"x":-26.8493995666504,"y":1.61939942836761,"z":1.71710026264191},"rot":{"x":359.939239501953,"y":239.997482299805,"z":0.0545193664729595}},"222582":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"225690":{"lock":false,"pos":{"x":-17.1199,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"2261a5":{"lock":false,"pos":{"x":-4.7182,"y":1.5837,"z":-14.7432},"rot":{"x":359.9197,"y":270.0041,"z":0.0168}},"22cf16":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9969,"z":0.0168}},"22e3f2":{"lock":false,"pos":{"x":-2.6904,"y":1.655,"z":-5.0485},"rot":{"x":359.9197,"y":270.0118,"z":0.0168}},"239c56":{"lock":false,"pos":{"x":-36.7733,"y":1.7022,"z":-7.7},"rot":{"x":359.9201,"y":269.9961,"z":0.0169}},"23bbd8":{"lock":false,"pos":{"x":-27.2865,"y":1.6195,"z":-0.0152},"rot":{"x":0.0799,"y":89.9999,"z":359.9831}},"23d608":{"lock":false,"pos":{"x":-2.6884,"y":1.6535,"z":-5.0486},"rot":{"x":359.9197,"y":269.9854,"z":0.0169}},"23dd51":{"lock":false,"pos":{"x":12.2498617172241,"y":1.46560561656952,"z":3.98638486862183},"rot":{"x":359.920135498047,"y":269.999877929688,"z":0.0168739203363657}},"245765":{"lock":false,"pos":{"x":-11.097,"y":1.6708,"z":13.7077},"rot":{"x":359.9201,"y":269.9857,"z":0.0169}},"245b8d":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9964,"z":180.0169}},"24c385":{"lock":false,"pos":{"x":11.813,"y":1.4648,"z":-0.6861},"rot":{"x":359.9201,"y":270.0074,"z":0.0169}},"24e5eb":{"lock":false,"pos":{"x":-5.6029,"y":1.5487,"z":23.9983},"rot":{"x":359.9201,"y":270.0043,"z":359.5229}},"256aa6":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":270.0001,"z":0.0168}},"259b7b":{"lock":false,"pos":{"x":-20.746,"y":1.685,"z":-0.0446},"rot":{"x":359.9201,"y":270.0016,"z":180.0169}},"261874":{"lock":false,"pos":{"x":-17.1201,"y":1.6144,"z":-15.28},"rot":{"x":359.9201,"y":269.9753,"z":0.0169}},"266dcb":{"lock":false,"pos":{"x":8.1241,"y":1.2846,"z":-1.7036},"rot":{"x":0.08,"y":89.9962,"z":359.9831}},"267216":{"lock":false,"pos":{"x":-12.2715015411377,"y":1.49063980579376,"z":-27.0919055938721},"rot":{"x":359.920135498047,"y":270.001373291016,"z":0.0168702155351639}},"268bd8":{"lock":false,"pos":{"x":-30.2243,"y":1.6937,"z":-15.28},"rot":{"x":359.9201,"y":269.996,"z":180.0169}},"26b589":{"lock":false,"pos":{"x":-2.7247,"y":1.658,"z":0.3733},"rot":{"x":359.9198,"y":269.9589,"z":0.0169}},"270525":{"lock":false,"pos":{"x":-30.2248439788818,"y":2.88017082214355,"z":11.4600009918213},"rot":{"x":0.0131171345710754,"y":179.956344604492,"z":1.11745476722717}},"271ce2":{"lock":false,"pos":{"x":-4.3628,"y":1.5831,"z":-15.1267},"rot":{"x":359.9197,"y":270.0001,"z":0.0168}},"27bf6a":{"lock":false,"pos":{"x":-10.5675,"y":1.6537,"z":13.5759},"rot":{"x":359.9201,"y":270.0211,"z":0.0168}},"27dc65":{"lock":false,"pos":{"x":-20.5971,"y":1.6123,"z":7.2097},"rot":{"x":359.9201,"y":269.993,"z":0.0169}},"28272f":{"lock":false,"pos":{"x":-27.0195,"y":1.6235,"z":14.5832},"rot":{"x":359.9201,"y":270.0063,"z":0.0169}},"286579":{"lock":false,"pos":{"x":12.2487,"y":1.2782,"z":-4.0135},"rot":{"x":0.08,"y":90.0003,"z":359.9831}},"2875cc":{"lock":false,"pos":{"x":-27.2150421142578,"y":2.82016277313232,"z":3.97477722167969},"rot":{"x":359.195709228516,"y":315.014129638672,"z":359.2021484375}},"2889f0":{"lock":false,"pos":{"x":9.5686,"y":1.2858,"z":9.0951},"rot":{"x":0.0799,"y":89.9924,"z":359.9831}},"28c5d1":{"lock":false,"pos":{"x":-23.6767616271973,"y":2.76340007781982,"z":-0.0299726445227861},"rot":{"x":358.873657226563,"y":269.999298095703,"z":180.013748168945}},"28cca1":{"lock":false,"pos":{"x":-2.6882,"y":1.6191,"z":-5.0485},"rot":{"x":0.0168,"y":179.9995,"z":0.0803}},"299ea1":{"lock":false,"pos":{"x":-30.223,"y":1.6982,"z":-0.0301},"rot":{"x":359.9201,"y":270.024,"z":180.0168}},"29a427":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":359.9831,"y":-0.0032,"z":359.9201}},"29d7e2":{"lock":false,"pos":{"x":-15.5985,"y":1.8209,"z":0.017},"rot":{"x":359.8887,"y":269.9785,"z":0.0184}},"2ab9ac":{"lock":false,"pos":{"x":-17.12,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":269.9964,"z":180.0169}},"2bd90b":{"lock":false,"pos":{"x":12.2499008178711,"y":1.47031700611115,"z":19.9864044189453},"rot":{"x":359.920135498047,"y":269.998413085938,"z":0.0168759748339653}},"2c792a":{"lock":false,"pos":{"x":-34.0171,"y":1.6278,"z":-3.8093},"rot":{"x":0.0684,"y":134.9883,"z":0.0445}},"2cea4e":{"lock":false,"pos":{"x":66.0026016235352,"y":1.11109709739685,"z":-58.8017997741699},"rot":{"x":359.979156494141,"y":89.9906921386719,"z":359.983215332031}},"2d17c9":{"lock":false,"pos":{"x":-23.6765,"y":1.6913,"z":7.57},"rot":{"x":359.9201,"y":269.9958,"z":180.0169}},"2d9794":{"lock":false,"pos":{"x":-4.7969,"y":1.5838,"z":-15.0746},"rot":{"x":359.9197,"y":270.0009,"z":0.0168}},"2e4956":{"lock":false,"pos":{"x":-11.6656,"y":1.6551,"z":9.0735},"rot":{"x":359.9201,"y":269.9792,"z":0.0169}},"2e887e":{"lock":false,"pos":{"x":-3.9083,"y":1.5825,"z":-15.1234},"rot":{"x":359.9197,"y":269.9998,"z":0.0168}},"2e8f0a":{"lock":false,"pos":{"x":-2.7247,"y":1.6566,"z":0.3733},"rot":{"x":359.9197,"y":269.9843,"z":0.0169}},"2ebcda":{"lock":false,"pos":{"x":12.2489032745361,"y":1.46325099468231,"z":-4.01340055465698},"rot":{"x":359.920104980469,"y":270.041198730469,"z":0.0168166663497686}},"2ec188":{"lock":false,"pos":{"x":12.2495,"y":1.2688,"z":-36.0139},"rot":{"x":359.9831,"y":-0.0057,"z":359.92}},"2ec534":{"lock":false,"pos":{"x":-12.3654,"y":1.6721,"z":11.366},"rot":{"x":0.0799,"y":90,"z":359.9831}},"2f12bf":{"lock":false,"pos":{"x":-8.79560089111328,"y":1.60410356521606,"z":-11.0351009368896},"rot":{"x":359.921997070313,"y":270.050109863281,"z":0.0166930817067623}},"2f4093":{"lock":false,"pos":{"x":-30.2242,"y":1.6976,"z":7.57},"rot":{"x":359.9201,"y":269.9995,"z":0.0169}},"2fe933":{"lock":false,"pos":{"x":-3.9273,"y":1.7877,"z":5.7571},"rot":{"x":359.9197,"y":269.986,"z":180.0168}},"309b74":{"lock":false,"pos":{"x":-12.4322,"y":1.6796,"z":7.3153},"rot":{"x":359.9201,"y":270.0005,"z":0.0169}},"30c8b6":{"lock":false,"pos":{"x":-20.4245,"y":1.6099,"z":-0.3109},"rot":{"x":359.9201,"y":270.0001,"z":0.0169}},"3106e6":{"lock":false,"pos":{"x":1.6965,"y":1.6368,"z":14.2788},"rot":{"x":359.9552,"y":224.998,"z":0.0687}},"313523":{"lock":false,"pos":{"x":10.762,"y":1.4665,"z":-0.0039},"rot":{"x":359.9201,"y":270.0055,"z":0.0169}},"31a93a":{"lock":false,"pos":{"x":8.9743,"y":1.2844,"z":1.3267},"rot":{"x":0.0799,"y":89.9966,"z":359.9831}},"32039e":{"lock":false,"pos":{"x":12.2498016357422,"y":1.4608941078186,"z":-12.0138006210327},"rot":{"x":359.920135498047,"y":270.007476806641,"z":0.0168635416775942}},"3210d6":{"lock":false,"pos":{"x":-27.0934,"y":1.6172,"z":-7.2278},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"3296c9":{"lock":false,"pos":{"x":-2.689,"y":1.6535,"z":-5.0428},"rot":{"x":359.9197,"y":270.0282,"z":0.0168}},"33116d":{"lock":false,"pos":{"x":-27.119,"y":1.6184,"z":-3.2752},"rot":{"x":0.0446,"y":44.9999,"z":359.9316}},"336335":{"lock":false,"pos":{"x":-23.6765,"y":1.6828,"z":-11.51},"rot":{"x":359.9201,"y":269.9848,"z":0.0169}},"33b200":{"lock":false,"pos":{"x":-2.6885,"y":1.6535,"z":-5.0485},"rot":{"x":359.9197,"y":269.9997,"z":0.0168}},"35c492":{"lock":false,"pos":{"x":-17.1199,"y":1.6042,"z":-3.83},"rot":{"x":0.0169,"y":179.9977,"z":0.0799}},"3671bf":{"lock":false,"pos":{"x":9.0068,"y":1.2755,"z":-28.7444},"rot":{"x":359.9831,"y":0.001,"z":359.92}},"368ca7":{"lock":false,"pos":{"x":-2.6886,"y":1.6623,"z":-5.0485},"rot":{"x":359.9832,"y":-0.0001,"z":359.9197}},"370ae5":{"lock":false,"pos":{"x":7.3549,"y":1.5428,"z":0.9084},"rot":{"x":359.9201,"y":270,"z":0.0169}},"37c889":{"lock":false,"pos":{"x":-3.9559,"y":1.6585,"z":-10.4409},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"37ec51":{"lock":false,"pos":{"x":-17.12,"y":1.6771,"z":-0.03},"rot":{"x":359.9201,"y":269.9792,"z":0.0169}},"383672":{"lock":false,"pos":{"x":-23.6765,"y":1.6851,"z":-3.83},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"38fcc6":{"lock":false,"pos":{"x":9.0367,"y":1.2744,"z":-32.2131},"rot":{"x":359.9832,"y":0.0001,"z":359.92}},"3a3b5a":{"lock":false,"pos":{"x":8.159,"y":1.286,"z":2.9166},"rot":{"x":0.08,"y":89.9925,"z":359.9831}},"3b1e55":{"lock":false,"pos":{"x":-9.6032,"y":1.5034,"z":28.8126},"rot":{"x":359.9201,"y":269.9945,"z":0.0169}},"3b6690":{"lock":false,"pos":{"x":-20.3057,"y":1.6086,"z":-3.9972},"rot":{"x":359.9554,"y":224.9999,"z":0.0684}},"3b6978":{"lock":false,"pos":{"x":-33.4783477783203,"y":2.94206881523132,"z":-0.0188747961074114},"rot":{"x":358.874603271484,"y":270.0166015625,"z":0.00106352684088051}},"3ba2fb":{"lock":false,"pos":{"x":-30.2244,"y":1.6909,"z":-15.28},"rot":{"x":359.9201,"y":269.9962,"z":0.0169}},"3ba881":{"lock":false,"pos":{"x":-23.6766,"y":1.6885,"z":7.57},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"3bc61d":{"lock":false,"pos":{"x":-27.0076789855957,"y":2.81503510475159,"z":0.0779311880469322},"rot":{"x":358.874084472656,"y":270.011535644531,"z":0.00231566792353988}},"3be6e8":{"lock":false,"pos":{"x":-10.0797,"y":1.674,"z":-0.4023},"rot":{"x":359.9201,"y":269.9863,"z":0.0169}},"3c18ed":{"lock":false,"pos":{"x":-2.6885,"y":1.655,"z":-5.0482},"rot":{"x":359.9197,"y":269.9865,"z":0.0169}},"3c4300":{"lock":false,"pos":{"x":-23.6766,"y":1.6862,"z":-0.03},"rot":{"x":359.9201,"y":269.9987,"z":0.0169}},"3c6d68":{"lock":false,"pos":{"x":-11.7638,"y":1.6337,"z":-14.9715},"rot":{"x":359.9201,"y":270.0002,"z":0.0169}},"3cf9b8":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9969,"z":0.0169}},"3d2a1a":{"lock":false,"pos":{"x":-3.9275,"y":1.7504,"z":5.7571},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"3d9a8b":{"lock":false,"pos":{"x":-22.2198,"y":1.7339,"z":-7.7092},"rot":{"x":0.0792,"y":269.9715,"z":359.9832}},"3da6dd":{"lock":false,"pos":{"x":12.2621040344238,"y":1.27820038795471,"z":-4.00930261611938},"rot":{"x":0.0799657329916954,"y":89.9984359741211,"z":359.983093261719}},"3dc34f":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9974,"z":0.0168}},"3eef2e":{"lock":false,"pos":{"x":-9.6732,"y":1.6648,"z":0.0646},"rot":{"x":359.9201,"y":269.9858,"z":0.0169}},"3fb8ed":{"lock":false,"pos":{"x":-2.68849992752075,"y":1.62393057346344,"z":-5.04850149154663},"rot":{"x":359.919738769531,"y":270.000061035156,"z":0.0168369449675083}},"4011a5":{"lock":false,"pos":{"x":-17.1199,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9961,"z":180.0169}},"4027ed":{"lock":false,"pos":{"x":-30.2245006561279,"y":1.62473559379578,"z":3.86010050773621},"rot":{"x":0.0168600361794233,"y":179.98503112793,"z":0.0799304693937302}},"4076cd":{"lock":false,"pos":{"x":12.2501,"y":1.4727,"z":27.9864},"rot":{"x":359.9201,"y":269.9268,"z":0.017}},"407732":{"lock":false,"pos":{"x":-9.7271,"y":1.6676,"z":-0.255},"rot":{"x":359.9201,"y":269.9876,"z":0.0169}},"40f354":{"lock":false,"pos":{"x":-17.12,"y":1.6771,"z":-0.03},"rot":{"x":359.9201,"y":270.0001,"z":0.0169}},"43390e":{"lock":false,"pos":{"x":-25.129,"y":1.809,"z":-1.3516},"rot":{"x":359.9271,"y":270.0207,"z":6.3789}},"4339b6":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":270.0055,"z":0.0168}},"4369ca":{"lock":false,"pos":{"x":-20.9201,"y":1.6118,"z":3.8653},"rot":{"x":359.9747,"y":210,"z":0.0776}},"43d027":{"lock":false,"pos":{"x":-23.6765,"y":1.6862,"z":-0.0301},"rot":{"x":359.9201,"y":269.9807,"z":0.0169}},"447fd2":{"lock":false,"pos":{"x":-34.1668,"y":1.6303,"z":3.8209},"rot":{"x":0.0253,"y":29.9808,"z":359.9224}},"44b0c5":{"lock":false,"pos":{"x":-17.12,"y":1.6042,"z":-3.83},"rot":{"x":359.9831,"y":0.0002,"z":359.9201}},"4591d4":{"lock":false,"pos":{"x":-20.7985,"y":1.615,"z":15.1153},"rot":{"x":359.9201,"y":270.0109,"z":0.0169}},"4595ad":{"lock":false,"pos":{"x":-23.6765,"y":1.684,"z":-7.7},"rot":{"x":359.9201,"y":269.9967,"z":0.0169}},"45a6ec":{"lock":false,"pos":{"x":-17.1199,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":269.9998,"z":180.0169}},"45ae28":{"lock":false,"pos":{"x":-9.3921,"y":1.5611,"z":-27.1341},"rot":{"x":359.9201,"y":270,"z":180.0169}},"4667f1":{"lock":false,"pos":{"x":-27.2752,"y":1.6209,"z":4.5605},"rot":{"x":359.9316,"y":315,"z":359.9554}},"469d58":{"lock":false,"pos":{"x":-11.9576,"y":1.6717,"z":3.1538},"rot":{"x":359.9201,"y":269.9781,"z":0.0169}},"46b65b":{"lock":false,"pos":{"x":-10.4494,"y":1.5959,"z":-0.6855},"rot":{"x":359.9201,"y":270,"z":0.0169}},"46ead9":{"lock":false,"pos":{"x":-31.7026,"y":1.743,"z":-7.7614},"rot":{"x":0.081,"y":270.0021,"z":359.9834}},"4736d9":{"lock":false,"pos":{"x":-10.0405,"y":1.5945,"z":-3.243},"rot":{"x":359.9201,"y":270.0059,"z":0.0169}},"479a5a":{"lock":false,"pos":{"x":-2.7247,"y":1.656,"z":0.3733},"rot":{"x":359.9197,"y":270,"z":0.0168}},"480533":{"lock":false,"pos":{"x":-50.9243,"y":1.7294,"z":8.1784},"rot":{"x":359.9201,"y":269.931,"z":180.017}},"480756":{"lock":false,"pos":{"x":12.2534,"y":1.4727,"z":28.0062},"rot":{"x":359.9201,"y":269.9944,"z":0.0169}},"491279":{"lock":false,"pos":{"x":-3.9277,"y":1.7131,"z":5.7571},"rot":{"x":359.9197,"y":269.9995,"z":180.0168}},"49232a":{"lock":false,"pos":{"x":-26.9264,"y":1.619,"z":-0.0365},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"492628":{"lock":false,"pos":{"x":-36.7734832763672,"y":3.02086758613586,"z":7.57011699676514},"rot":{"x":358.876129150391,"y":269.999450683594,"z":180.012710571289}},"49dfb9":{"lock":false,"pos":{"x":12.2508,"y":1.4633,"z":-3.9202},"rot":{"x":359.9201,"y":269.9943,"z":0.0169}},"4a7540":{"lock":false,"pos":{"x":-3.9273,"y":1.7925,"z":5.7571},"rot":{"x":359.9197,"y":270.0006,"z":180.0168}},"4aaa9f":{"lock":false,"pos":{"x":-30.2242,"y":1.6248,"z":3.86},"rot":{"x":359.9832,"y":0.0095,"z":359.92}},"4add31":{"lock":false,"pos":{"x":-23.6765022277832,"y":1.65464842319489,"z":-0.0299997963011265},"rot":{"x":359.920104980469,"y":270.000030517578,"z":0.0168411564081907}},"4b81f6":{"lock":false,"pos":{"x":-3.8815,"y":1.5826,"z":-14.612},"rot":{"x":359.9197,"y":270.0021,"z":0.0168}},"4c07bf":{"lock":false,"pos":{"x":12.2919034957886,"y":1.27108502388,"z":-28.030704498291},"rot":{"x":0.0799620524048805,"y":90.0000457763672,"z":359.983093261719}},"4c173f":{"lock":false,"pos":{"x":12.2495946884155,"y":1.463250041008,"z":-4.01365184783936},"rot":{"x":359.920135498047,"y":269.999877929688,"z":0.0168724227696657}},"4c2b84":{"lock":false,"pos":{"x":-30.2242,"y":1.6248,"z":3.86},"rot":{"x":359.9831,"y":0,"z":359.92}},"4c5c55":{"lock":false,"pos":{"x":8.0489,"y":1.2874,"z":7.1029},"rot":{"x":0.0799,"y":89.9962,"z":359.9831}},"4c7aff":{"lock":false,"pos":{"x":1.6966,"y":1.6584,"z":14.2788},"rot":{"x":359.9552,"y":224.998,"z":0.0687}},"4cc43d":{"lock":false,"pos":{"x":-3.9274,"y":1.7925,"z":5.7571},"rot":{"x":359.9197,"y":269.9698,"z":180.0169}},"4d3553":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":359.9831,"y":359.9847,"z":359.9201}},"4d5e5f":{"lock":false,"pos":{"x":-2.6885,"y":1.6143,"z":-5.0485},"rot":{"x":359.9197,"y":269.9982,"z":0.0168}},"4d6544":{"lock":false,"pos":{"x":7.9998,"y":1.282,"z":-11.3677},"rot":{"x":359.92,"y":270.0005,"z":0.0169}},"4dc9bc":{"lock":false,"pos":{"x":-23.6766,"y":1.6303,"z":7.57},"rot":{"x":359.9201,"y":270.0023,"z":180.0168}},"4dee5a":{"lock":false,"pos":{"x":12.2494716644287,"y":1.45618319511414,"z":-28.0136451721191},"rot":{"x":359.920135498047,"y":269.999969482422,"z":0.0168727971613407}},"4e3390":{"lock":false,"pos":{"x":-13.0308,"y":1.6899,"z":7.2677},"rot":{"x":359.9201,"y":269.9855,"z":0.0169}},"4e82c5":{"lock":false,"pos":{"x":-36.7735,"y":1.7131,"z":7.5705},"rot":{"x":359.9201,"y":269.993,"z":180.0169}},"4ed173":{"lock":false,"pos":{"x":-3.9276,"y":1.7237,"z":5.7571},"rot":{"x":359.9197,"y":269.9888,"z":180.0168}},"4eeeb3":{"lock":false,"pos":{"x":-17.12,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":270,"z":180.0169}},"4f0a6b":{"lock":false,"pos":{"x":-19.6594,"y":1.61,"z":3.6336},"rot":{"x":0.0446,"y":45,"z":359.9316}},"4f944f":{"lock":false,"pos":{"x":12.2503,"y":1.4658,"z":4.6877},"rot":{"x":359.9201,"y":270.0047,"z":0.0169}},"4f9d72":{"lock":false,"pos":{"x":-2.72469973564148,"y":1.59899258613586,"z":0.37330025434494},"rot":{"x":0.0168360415846109,"y":180,"z":0.0802551060914993}},"4fa9f9":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"505e6c":{"lock":false,"pos":{"x":1.6965,"y":1.5583,"z":14.2788},"rot":{"x":359.9551,"y":224.998,"z":0.0687}},"50caf4":{"lock":false,"pos":{"x":-3.9559,"y":1.5975,"z":-10.4412},"rot":{"x":359.9197,"y":269.9998,"z":0.0168}},"50d3bc":{"lock":false,"pos":{"x":-17.12,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":269.9998,"z":180.0169}},"50ffd3":{"lock":false,"pos":{"x":-23.6765,"y":1.6902,"z":3.8601},"rot":{"x":359.9201,"y":270.0026,"z":180.0169}},"5127f6":{"lock":false,"pos":{"x":1.6965,"y":1.6662,"z":14.2788},"rot":{"x":359.9551,"y":224.9998,"z":180.0686}},"51527f":{"lock":false,"pos":{"x":-30.2243,"y":1.6954,"z":-0.03},"rot":{"x":359.9201,"y":269.9985,"z":0.0169}},"515e9e":{"lock":false,"pos":{"x":1.6965,"y":1.6368,"z":14.2789},"rot":{"x":359.9552,"y":224.9984,"z":0.0687}},"51fbbc":{"lock":false,"pos":{"x":12.2501020431519,"y":1.4726722240448,"z":27.9864044189453},"rot":{"x":359.920135498047,"y":269.995666503906,"z":0.0168801005929708}},"520889":{"lock":false,"pos":{"x":-3.8323,"y":1.5826,"z":-14.4151},"rot":{"x":359.9197,"y":270.0049,"z":0.0168}},"526ff9":{"lock":false,"pos":{"x":9.7361,"y":1.2851,"z":7.604},"rot":{"x":0.0799,"y":89.999,"z":359.9831}},"5287f3":{"lock":false,"pos":{"x":-17.1200389862061,"y":2.63471126556396,"z":-0.0299513209611177},"rot":{"x":358.874053955078,"y":269.998779296875,"z":180.014038085938}},"52d102":{"lock":false,"pos":{"x":12.2132043838501,"y":1.27584600448608,"z":-12.2319049835205},"rot":{"x":0.0799582898616791,"y":89.9938659667969,"z":359.983093261719}},"54707a":{"lock":false,"pos":{"x":-4.0348,"y":1.5826,"z":-15.3238},"rot":{"x":359.9197,"y":270.0002,"z":0.0168}},"5660ef":{"lock":false,"pos":{"x":-30.2242183685303,"y":1.64166986942291,"z":15.1899843215942},"rot":{"x":359.920104980469,"y":270.001068115234,"z":0.0168381482362747}},"567db0":{"lock":false,"pos":{"x":-3.974,"y":1.5826,"z":-15.0374},"rot":{"x":359.9197,"y":270.0023,"z":0.0168}},"56a08b":{"lock":false,"pos":{"x":-4.1,"y":1.5829,"z":-14.7352},"rot":{"x":359.9197,"y":270.0026,"z":0.0168}},"57318a":{"lock":false,"pos":{"x":-2.6886,"y":1.6543,"z":-5.0515},"rot":{"x":0.0169,"y":179.9818,"z":0.0803}},"5942b3":{"lock":false,"pos":{"x":-23.6766,"y":1.6874,"z":3.86},"rot":{"x":359.9201,"y":269.9991,"z":0.0169}},"5a9b00":{"lock":false,"pos":{"x":-17.1198,"y":1.6754,"z":-15.2785},"rot":{"x":359.9201,"y":270.0052,"z":180.0169}},"5abb04":{"lock":false,"pos":{"x":-23.6766,"y":1.6156,"z":3.86},"rot":{"x":359.9832,"y":-0.0044,"z":359.92}},"5b3ac7":{"lock":false,"pos":{"x":9.9267,"y":1.2833,"z":1.7477},"rot":{"x":0.0799,"y":89.9971,"z":359.9831}},"5bb7d0":{"lock":false,"pos":{"x":-23.6765,"y":1.6868,"z":-7.7},"rot":{"x":359.9201,"y":269.9953,"z":180.0169}},"5bd64c":{"lock":false,"pos":{"x":-30.2243,"y":1.6394,"z":7.5702},"rot":{"x":359.9201,"y":270.0232,"z":180.0168}},"5ca1a9":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":359.9831,"y":359.9848,"z":359.9201}},"5d070a":{"lock":false,"pos":{"x":-30.2242,"y":1.6203,"z":-11.51},"rot":{"x":359.9832,"y":0.0096,"z":359.9201}},"5d0fdd":{"lock":false,"pos":{"x":-23.6766,"y":1.6846,"z":-15.28},"rot":{"x":359.9201,"y":270.005,"z":180.0169}},"5d637f":{"lock":false,"pos":{"x":-2.1685,"y":1.493,"z":28.7958},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"5e4e43":{"lock":false,"pos":{"x":-13.2968,"y":1.6723,"z":-7.7574},"rot":{"x":359.9201,"y":270.028,"z":180.0168}},"5e7e07":{"lock":false,"pos":{"x":-23.6766,"y":1.6935,"z":15.19},"rot":{"x":359.9201,"y":270.0272,"z":180.0168}},"5ee55d":{"lock":false,"pos":{"x":-17.12,"y":1.6771,"z":-0.03},"rot":{"x":359.9201,"y":269.9988,"z":0.0169}},"5f0185":{"lock":false,"pos":{"x":-36.7732,"y":1.7045,"z":-0.03},"rot":{"x":359.9201,"y":269.9952,"z":0.0169}},"5f661f":{"lock":false,"pos":{"x":-2.6885,"y":1.655,"z":-5.0485},"rot":{"x":359.9197,"y":270.0056,"z":0.0168}},"60ad05":{"lock":false,"pos":{"x":-36.7731,"y":1.6317,"z":-3.83},"rot":{"x":0.0168,"y":180.0349,"z":0.0799}},"616612":{"lock":false,"pos":{"x":-33.8841,"y":1.6275,"z":-4.2381},"rot":{"x":0.0446,"y":45,"z":359.9316}},"61801e":{"lock":false,"pos":{"x":12.1700048446655,"y":1.28535795211792,"z":19.8675079345703},"rot":{"x":0.0799623876810074,"y":89.996826171875,"z":359.983093261719}},"61a21b":{"lock":false,"pos":{"x":-20.5245,"y":1.6101,"z":-0.2141},"rot":{"x":359.9201,"y":269.8899,"z":0.0171}},"61b186":{"lock":false,"pos":{"x":-11.155,"y":1.6791,"z":7.1548},"rot":{"x":359.9201,"y":269.9855,"z":180.0169}},"62b3ab":{"lock":false,"pos":{"x":-2.7247,"y":1.6566,"z":0.3733},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"631549":{"lock":false,"pos":{"x":-23.6766,"y":1.6157,"z":3.86},"rot":{"x":359.9832,"y":0.0089,"z":359.92}},"634aa3":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9964,"z":180.0169}},"641bdb":{"lock":false,"pos":{"x":-17.12,"y":1.6771,"z":-0.03},"rot":{"x":359.9201,"y":270,"z":0.0169}},"643870":{"lock":false,"pos":{"x":-20.1546,"y":1.6096,"z":0.0507},"rot":{"x":359.9201,"y":269.9931,"z":0.0169}},"64ad17":{"lock":false,"pos":{"x":12.2503,"y":1.4585,"z":-20.0136},"rot":{"x":359.9201,"y":269.9914,"z":0.0169}},"64b00f":{"lock":false,"pos":{"x":-17.1199,"y":1.6223,"z":11.4595},"rot":{"x":359.9201,"y":269.9901,"z":0.0169}},"64f279":{"lock":false,"pos":{"x":-17.1197,"y":1.889,"z":-11.5094},"rot":{"x":359.9201,"y":269.9996,"z":0.0169}},"65aae9":{"lock":false,"pos":{"x":-17.12,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9969,"z":180.0169}},"6645cd":{"lock":false,"pos":{"x":-23.6764,"y":1.6134,"z":-3.83},"rot":{"x":0.0169,"y":179.9981,"z":0.0799}},"668f68":{"lock":false,"pos":{"x":-26.9665,"y":1.6168,"z":-7.7199},"rot":{"x":0.0799,"y":90.0006,"z":359.9831}},"66dad0":{"lock":true,"pos":{"x":-58.557300567627,"y":1.69340002536774,"z":-18.8325004577637},"rot":{"x":359.920104980469,"y":269.999908447266,"z":0.0169000010937452}},"6791fd":{"lock":false,"pos":{"x":1.6969,"y":1.5583,"z":14.2784},"rot":{"x":359.9551,"y":224.9981,"z":0.0687}},"67cf63":{"lock":false,"pos":{"x":-12.1989,"y":1.522,"z":33.707},"rot":{"x":359.9201,"y":269.9902,"z":0.0169}},"67d524":{"lock":false,"pos":{"x":8.0606,"y":1.2899,"z":15.9247},"rot":{"x":0.08,"y":89.9808,"z":359.9831}},"686672":{"lock":false,"pos":{"x":-36.7732,"y":1.7067,"z":7.57},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"68ba2e":{"lock":false,"pos":{"x":-26.8859,"y":1.6172,"z":-6.0034},"rot":{"x":359.9554,"y":224.9895,"z":0.0684}},"68ca42":{"lock":false,"pos":{"x":-3.3874,"y":1.3969,"z":-14.6273},"rot":{"x":359.9832,"y":-0.0008,"z":359.9196}},"68e1d9":{"lock":false,"pos":{"x":-10.0449,"y":1.5965,"z":3.4829},"rot":{"x":359.9201,"y":269.9974,"z":0.0169}},"6950d2":{"lock":false,"pos":{"x":-33.7138,"y":1.6263,"z":-7.6781},"rot":{"x":0.0799,"y":89.9999,"z":359.9831}},"69c26d":{"lock":false,"pos":{"x":-4.3001,"y":1.4068,"z":14.6571},"rot":{"x":359.9832,"y":0.0007,"z":359.9197}},"6a72fc":{"lock":false,"pos":{"x":-30.2243,"y":1.6976,"z":7.57},"rot":{"x":359.9201,"y":269.9945,"z":0.0169}},"6a9431":{"lock":false,"pos":{"x":-2.7247,"y":1.664,"z":0.3733},"rot":{"x":0.0168,"y":180.0034,"z":0.0803}},"6aa57e":{"lock":false,"pos":{"x":-30.2244,"y":1.6954,"z":-0.0298},"rot":{"x":359.9207,"y":269.989,"z":0.0183}},"6bbd29":{"lock":false,"pos":{"x":-9.9085,"y":1.6664,"z":1.7308},"rot":{"x":359.9201,"y":269.9864,"z":0.0169}},"6bc393":{"lock":false,"pos":{"x":-30.2243,"y":1.7027,"z":15.19},"rot":{"x":359.9201,"y":270.0014,"z":180.0169}},"6c3b6c":{"lock":false,"pos":{"x":-17.120002746582,"y":1.6189227104187,"z":-0.0298999939113855},"rot":{"x":359.920104980469,"y":269.9970703125,"z":0.0167545769363642}},"6ca52c":{"lock":false,"pos":{"x":10.1258,"y":1.283,"z":1.8531},"rot":{"x":0.0799,"y":89.9977,"z":359.9831}},"6cb6e7":{"lock":false,"pos":{"x":-23.6764,"y":1.6134,"z":-3.83},"rot":{"x":359.9831,"y":-0.0006,"z":359.9201}},"6d8dad":{"lock":false,"pos":{"x":9.7158,"y":1.2818,"z":-4.1308},"rot":{"x":0.0799,"y":89.9964,"z":359.9831}},"6dca3e":{"lock":false,"pos":{"x":-2.7246,"y":1.6551,"z":0.3736},"rot":{"x":359.9197,"y":269.9846,"z":0.0169}},"6e0236":{"lock":false,"pos":{"x":9.3625,"y":1.284,"z":1.3791},"rot":{"x":0.0799,"y":89.9956,"z":359.9831}},"6e4a78":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":359.9831,"y":0.0003,"z":359.9201}},"6f1e9e":{"lock":false,"pos":{"x":-2.6885,"y":1.6535,"z":-5.0485},"rot":{"x":0.0169,"y":179.9695,"z":0.0802}},"6f1efa":{"lock":false,"pos":{"x":-36.7733,"y":1.705,"z":-7.7},"rot":{"x":359.9201,"y":269.996,"z":180.0169}},"6f2827":{"lock":false,"pos":{"x":-3.9277,"y":1.7664,"z":5.7571},"rot":{"x":359.9197,"y":269.9933,"z":180.0168}},"6f54e2":{"lock":false,"pos":{"x":-11.3147,"y":1.6797,"z":13.0979},"rot":{"x":359.9201,"y":269.9855,"z":180.0169}},"6f9258":{"lock":false,"pos":{"x":-20.9414,"y":1.6117,"z":3.308},"rot":{"x":0.0776,"y":120,"z":0.0253}},"709830":{"lock":false,"pos":{"x":-30.2243,"y":1.6225,"z":-3.83},"rot":{"x":359.9831,"y":-0.0046,"z":359.9201}},"7112e4":{"lock":false,"pos":{"x":-36.7732009887695,"y":1.64632904529572,"z":-0.0299993120133877},"rot":{"x":359.920104980469,"y":269.999664306641,"z":180.016830444336}},"713671":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9929,"z":0.0169}},"7234af":{"lock":false,"pos":{"x":-36.7731,"y":1.6339,"z":3.86},"rot":{"x":0.0168,"y":180.0342,"z":0.0799}},"72ab92":{"lock":false,"pos":{"x":12.2492752075195,"y":1.4750292301178,"z":35.9863815307617},"rot":{"x":359.920135498047,"y":269.999938964844,"z":0.0168751291930676}},"7521a9":{"lock":false,"pos":{"x":-3.5895,"y":1.5822,"z":-14.7357},"rot":{"x":359.9197,"y":270.0013,"z":0.0168}},"759ab6":{"lock":false,"pos":{"x":-20.2426,"y":1.6075,"z":-7.7066},"rot":{"x":0.0799,"y":90.0007,"z":359.9831}},"75a1d7":{"lock":false,"pos":{"x":-3.92820000648499,"y":1.76844918727875,"z":5.75600099563599},"rot":{"x":359.919738769531,"y":270.007110595703,"z":180.016815185547}},"767864":{"lock":false,"pos":{"x":-6.91008472442627,"y":1.61784970760345,"z":-13.1002960205078},"rot":{"x":359.919738769531,"y":269.999938964844,"z":0.0168399773538113}},"770eca":{"lock":false,"pos":{"x":-17.12,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9958,"z":180.0169}},"776283":{"lock":false,"pos":{"x":-34.0345497131348,"y":2.95323395729065,"z":3.60239624977112},"rot":{"x":0.803940832614899,"y":135.01399230957,"z":0.77769273519516}},"789378":{"lock":false,"pos":{"x":-1.9242,"y":1.4772,"z":-23.8097},"rot":{"x":359.9201,"y":270,"z":0.0169}},"79090a":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":0.0169,"y":180,"z":0.0799}},"794376":{"lock":true,"pos":{"x":-22.7847995758057,"y":1.64330005645752,"z":-30.1574001312256},"rot":{"x":0.0169000010937452,"y":180,"z":0.0798999965190887}},"7a167a":{"lock":false,"pos":{"x":1.69940054416656,"y":1.55831527709961,"z":14.2875022888184},"rot":{"x":359.955474853516,"y":224.731384277344,"z":0.0688812211155891}},"7a4949":{"lock":false,"pos":{"x":-11.176,"y":1.6668,"z":-0.012},"rot":{"x":359.9201,"y":270.0181,"z":0.0169}},"7a4b8e":{"lock":false,"pos":{"x":-20.0769,"y":1.6117,"z":7.4094},"rot":{"x":359.9201,"y":270.0001,"z":0.0169}},"7b0f48":{"lock":false,"pos":{"x":-10.0533,"y":1.5959,"z":1.2614},"rot":{"x":359.9201,"y":269.9979,"z":0.0169}},"7b28eb":{"lock":false,"pos":{"x":12.2495,"y":1.2806,"z":3.9864},"rot":{"x":0.08,"y":89.9949,"z":359.9831}},"7b5228":{"lock":false,"pos":{"x":-17.12,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":270,"z":180.0169}},"7b57ad":{"lock":false,"pos":{"x":16.2712059020996,"y":1.27489864826202,"z":3.76080012321472},"rot":{"x":0.0799572914838791,"y":89.9929580688477,"z":359.983093261719}},"7b91a3":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.996,"z":180.0169}},"7b9e37":{"lock":false,"pos":{"x":-30.2243,"y":1.6225,"z":-3.83},"rot":{"x":0.0169,"y":179.9999,"z":0.0799}},"7ba738":{"lock":false,"pos":{"x":-3.946,"y":1.4062,"z":14.5235},"rot":{"x":359.9832,"y":-0.0016,"z":359.9197}},"7bdc6b":{"lock":false,"pos":{"x":-23.6765,"y":1.6879,"z":-3.83},"rot":{"x":359.9201,"y":270.0012,"z":180.0169}},"7cda3f":{"lock":false,"pos":{"x":12.2512,"y":1.2829,"z":11.9866},"rot":{"x":0.08,"y":89.9997,"z":359.9831}},"7d6343":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9982,"z":0.0169}},"7d8fed":{"lock":false,"pos":{"x":-30.2243003845215,"y":1.63271510601044,"z":-15.2799978256226},"rot":{"x":359.920104980469,"y":269.999938964844,"z":0.0168397836387157}},"7dcc93":{"lock":false,"pos":{"x":1.6965,"y":1.6545,"z":14.2788},"rot":{"x":359.9552,"y":224.998,"z":0.0687}},"7f9f0d":{"lock":false,"pos":{"x":9.3077,"y":1.2837,"z":0.2819},"rot":{"x":0.0799,"y":89.9984,"z":359.9831}},"7fb809":{"lock":false,"pos":{"x":-8.80660057067871,"y":1.60278069972992,"z":-15.5880012512207},"rot":{"x":359.921997070313,"y":269.999633789063,"z":0.0167620945721865}},"8075b9":{"lock":false,"pos":{"x":-2.7246,"y":1.6566,"z":0.3733},"rot":{"x":359.9197,"y":269.9854,"z":0.0169}},"8077a1":{"lock":false,"pos":{"x":9.1666,"y":1.2836,"z":-0.8205},"rot":{"x":0.0799,"y":89.9944,"z":359.9831}},"80fb47":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9855,"z":180.0169}},"81a6f5":{"lock":false,"pos":{"x":-26.8136,"y":1.6167,"z":-7.5513},"rot":{"x":0.0799,"y":90.0001,"z":359.9831}},"8221db":{"lock":false,"pos":{"x":12.2519,"y":1.468,"z":11.9864},"rot":{"x":359.9201,"y":269.9925,"z":0.0169}},"82e02f":{"lock":false,"pos":{"x":-26.575,"y":1.6185,"z":-0.1012},"rot":{"x":359.9201,"y":269.9947,"z":0.0169}},"82e1ed":{"lock":false,"pos":{"x":-4.0012,"y":1.5828,"z":-14.59},"rot":{"x":359.9197,"y":269.9926,"z":0.0168}},"8385c4":{"lock":false,"pos":{"x":-8.80050086975098,"y":1.60478103160858,"z":-8.75300121307373},"rot":{"x":359.921997070313,"y":270.004516601563,"z":180.016906738281}},"83b781":{"lock":false,"pos":{"x":-4.3576,"y":1.5832,"z":-14.9888},"rot":{"x":359.9197,"y":270.0004,"z":0.0168}},"845074":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":270,"z":0.0168}},"8480f8":{"lock":false,"pos":{"x":-3.956,"y":1.6585,"z":-10.4412},"rot":{"x":359.9197,"y":270,"z":180.0168}},"84cdaf":{"lock":false,"pos":{"x":8.0379,"y":1.2834,"z":-6.2152},"rot":{"x":0.08,"y":89.9981,"z":359.9831}},"8578ad":{"lock":false,"pos":{"x":-4.4263,"y":1.6455,"z":14.8008},"rot":{"x":359.9197,"y":269.9995,"z":0.0168}},"86cbee":{"lock":false,"pos":{"x":-17.12,"y":1.6042,"z":-3.83},"rot":{"x":0.0168,"y":180.0349,"z":0.08}},"88005c":{"lock":false,"pos":{"x":-27.1056,"y":1.6193,"z":0.044},"rot":{"x":359.9201,"y":269.9936,"z":0.0169}},"884951":{"lock":false,"pos":{"x":-23.6766,"y":1.6913,"z":7.57},"rot":{"x":359.9201,"y":269.9958,"z":180.0169}},"88a1cf":{"lock":false,"pos":{"x":-36.7732,"y":1.7022,"z":-7.7},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"893557":{"lock":false,"pos":{"x":-23.6765,"y":1.6885,"z":7.5699},"rot":{"x":359.9201,"y":269.9939,"z":0.0169}},"893c58":{"lock":false,"pos":{"x":-30.2243,"y":1.6982,"z":-0.03},"rot":{"x":359.9201,"y":269.9956,"z":180.0169}},"8944d1":{"lock":false,"pos":{"x":-3.9275,"y":1.7237,"z":5.7573},"rot":{"x":359.9197,"y":270.0005,"z":180.0168}},"8a689d":{"lock":false,"pos":{"x":-17.1197,"y":1.6503,"z":-0.0295},"rot":{"x":359.9201,"y":269.9999,"z":0.0168}},"8bae65":{"lock":false,"pos":{"x":-3.9277,"y":1.7344,"z":5.7572},"rot":{"x":359.9197,"y":269.9998,"z":180.0168}},"8ce0e1":{"lock":false,"pos":{"x":-23.6765,"y":1.6868,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"8ce4d8":{"lock":false,"pos":{"x":-2.6885,"y":1.6535,"z":-5.0485},"rot":{"x":0.0168,"y":179.9982,"z":0.0803}},"8cf84a":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":0.0169,"y":180.0001,"z":0.0799}},"8cfe99":{"lock":false,"pos":{"x":12.2498025894165,"y":1.46560561656952,"z":3.98629999160767},"rot":{"x":359.920135498047,"y":270.006072998047,"z":0.0168650802224875}},"8d88c8":{"lock":false,"pos":{"x":12.252,"y":1.468,"z":11.9863},"rot":{"x":359.9201,"y":270.0267,"z":0.0168}},"8eb793":{"lock":false,"pos":{"x":12.2504,"y":1.4656,"z":3.9856},"rot":{"x":359.9201,"y":270.0055,"z":0.0169}},"8ed50d":{"lock":false,"pos":{"x":-23.6766,"y":1.6935,"z":15.19},"rot":{"x":359.9201,"y":270.0014,"z":180.0169}},"8f0718":{"lock":false,"pos":{"x":-3.9275,"y":1.7504,"z":5.757},"rot":{"x":359.9197,"y":269.9868,"z":180.0168}},"8f297e":{"lock":false,"pos":{"x":12.2494,"y":1.4633,"z":-4.0136},"rot":{"x":359.9201,"y":269.9993,"z":0.0169}},"8f2b3d":{"lock":false,"pos":{"x":-33.341,"y":1.6301,"z":7.293},"rot":{"x":359.9201,"y":270.0001,"z":0.0169}},"8f569e":{"lock":false,"pos":{"x":-2.7247,"y":1.6566,"z":0.3733},"rot":{"x":0.0168,"y":180.027,"z":0.0803}},"905ad3":{"lock":false,"pos":{"x":8.4268,"y":1.2838,"z":-3.1101},"rot":{"x":0.0799,"y":89.9894,"z":359.9831}},"909b6f":{"lock":false,"pos":{"x":-2.6885,"y":1.6535,"z":-5.0485},"rot":{"x":359.9197,"y":270.0029,"z":0.0168}},"90aab1":{"lock":false,"pos":{"x":8.0656,"y":1.2886,"z":11.2954},"rot":{"x":0.08,"y":89.983,"z":359.9831}},"90ad8b":{"lock":false,"pos":{"x":-23.6765,"y":1.6281,"z":-0.03},"rot":{"x":359.9201,"y":269.9854,"z":180.0168}},"917494":{"lock":false,"pos":{"x":-2.7246,"y":1.664,"z":0.3733},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"92ed37":{"lock":false,"pos":{"x":-26.8628997802734,"y":1.61833643913269,"z":-1.96460044384003},"rot":{"x":359.922393798828,"y":300.005889892578,"z":359.974670410156}},"93a112":{"lock":false,"pos":{"x":-30.2243003845215,"y":1.63943076133728,"z":7.57079982757568},"rot":{"x":359.920104980469,"y":269.999206542969,"z":180.016830444336}},"949c7d":{"lock":false,"pos":{"x":-30.2242,"y":1.6248,"z":3.86},"rot":{"x":0.0169,"y":179.9995,"z":0.0799}},"952572":{"lock":false,"pos":{"x":12.2499,"y":1.4703,"z":19.9865},"rot":{"x":359.9201,"y":270.0185,"z":0.0168}},"95dc3d":{"lock":false,"pos":{"x":-12.1893,"y":1.5207,"z":29.2011},"rot":{"x":359.9201,"y":269.9885,"z":0.0169}},"961940":{"lock":false,"pos":{"x":8.4723,"y":1.2866,"z":6.7132},"rot":{"x":0.0799,"y":89.9989,"z":359.9831}},"963cfe":{"lock":false,"pos":{"x":-10.715,"y":1.6678,"z":0.2579},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"970ac8":{"lock":false,"pos":{"x":-23.6770782470703,"y":2.75072813034058,"z":3.86010193824768},"rot":{"x":0.0133172627538443,"y":179.990371704102,"z":1.1208598613739}},"971f55":{"lock":false,"pos":{"x":-8.70073795318604,"y":2.53563070297241,"z":5.78840923309326},"rot":{"x":358.874694824219,"y":269.995788574219,"z":180.013748168945}},"98b377":{"lock":false,"pos":{"x":-2.7248,"y":1.6566,"z":0.3733},"rot":{"x":359.9832,"y":-0.0021,"z":359.9197}},"98b72e":{"lock":false,"pos":{"x":-3.9559,"y":1.6585,"z":-10.4431},"rot":{"x":359.9197,"y":269.9995,"z":180.0168}},"98cfeb":{"lock":false,"pos":{"x":-3.95600056648254,"y":1.59753930568695,"z":-10.4416007995605},"rot":{"x":359.919738769531,"y":269.999572753906,"z":0.0168377906084061}},"98d4a2":{"lock":false,"pos":{"x":-50.9244,"y":1.7294,"z":8.1784},"rot":{"x":359.9201,"y":270,"z":180.0169}},"99db87":{"lock":true,"pos":{"x":-58.5584983825684,"y":1.69739997386932,"z":8.3577995300293},"rot":{"x":359.920104980469,"y":270.000061035156,"z":0.0169000010937452}},"9ae382":{"lock":false,"pos":{"x":-3.3515,"y":1.4052,"z":13.818},"rot":{"x":359.9832,"y":-0.0001,"z":359.9197}},"9af38c":{"lock":false,"pos":{"x":12.2501535415649,"y":1.48254573345184,"z":-36.0138473510742},"rot":{"x":-0.000153532513650134,"y":269.96923828125,"z":359.721130371094}},"9b0cf5":{"lock":false,"pos":{"x":-17.12,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9857,"z":180.0169}},"9b26d0":{"lock":false,"pos":{"x":-20.3391780853271,"y":2.68434476852417,"z":-0.0743502750992775},"rot":{"x":358.874267578125,"y":270.015747070313,"z":0.00952445436269045}},"9bcafb":{"lock":false,"pos":{"x":-23.6764,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"9c6ccd":{"lock":false,"pos":{"x":-23.6765,"y":1.684,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"9caa1f":{"lock":false,"pos":{"x":-30.2242,"y":1.6248,"z":3.86},"rot":{"x":0.0168,"y":180.0349,"z":0.08}},"9cd1ad":{"lock":false,"pos":{"x":-4.0559,"y":1.5827,"z":-15.1513},"rot":{"x":359.9197,"y":270,"z":0.0168}},"9d4e42":{"lock":false,"pos":{"x":-3.9274,"y":1.7397,"z":5.7571},"rot":{"x":359.9197,"y":269.9857,"z":180.0169}},"9dab73":{"lock":false,"pos":{"x":-2.7245,"y":1.6159,"z":0.3733},"rot":{"x":359.9197,"y":269.9865,"z":0.0169}},"9e02de":{"lock":false,"pos":{"x":-3.92760014533997,"y":1.7347503900528,"z":5.75730037689209},"rot":{"x":359.919738769531,"y":269.973602294922,"z":180.016860961914}},"9e33a0":{"lock":false,"pos":{"x":12.2497,"y":1.4632,"z":-4.014},"rot":{"x":359.9201,"y":270.0055,"z":0.0169}},"9e701d":{"lock":false,"pos":{"x":-2.7247,"y":1.6566,"z":0.3733},"rot":{"x":359.9197,"y":269.9826,"z":0.0169}},"9e71b4":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4402},"rot":{"x":359.9197,"y":269.9982,"z":0.0168}},"9e73fa":{"lock":false,"pos":{"x":12.2499332427979,"y":1.47031688690186,"z":19.9864273071289},"rot":{"x":359.920135498047,"y":270,"z":0.0168725661933422}},"9e9bdd":{"lock":false,"pos":{"x":-17.12,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.9998,"z":180.0169}},"9e9ff6":{"lock":false,"pos":{"x":-36.7733001708984,"y":1.64407503604889,"z":-7.69999980926514},"rot":{"x":359.920104980469,"y":269.99951171875,"z":180.016830444336}},"9f9e79":{"lock":false,"pos":{"x":-3.9275,"y":1.7504,"z":5.7571},"rot":{"x":359.9197,"y":269.9856,"z":180.0168}},"9fac8b":{"lock":false,"pos":{"x":-3.9277,"y":1.7557,"z":5.7571},"rot":{"x":359.9197,"y":269.9771,"z":180.0169}},"a06ab2":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":270.0002,"z":180.0169}},"a08d45":{"lock":false,"pos":{"x":-26.798,"y":1.6211,"z":7.6211},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"a08daa":{"lock":false,"pos":{"x":-2.6884,"y":1.6535,"z":-5.0485},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"a08fa0":{"lock":false,"pos":{"x":-3.9277,"y":1.7237,"z":5.7571},"rot":{"x":359.9197,"y":269.9998,"z":180.0168}},"a0d2b1":{"lock":false,"pos":{"x":10.5681,"y":1.4641,"z":-8.947},"rot":{"x":359.9201,"y":270.0628,"z":0.0168}},"a137d8":{"lock":false,"pos":{"x":-23.6764,"y":1.6863,"z":-0.0301},"rot":{"x":359.921,"y":269.9989,"z":0.019}},"a1514c":{"lock":false,"pos":{"x":-3.9277,"y":1.7184,"z":5.7572},"rot":{"x":359.9197,"y":269.9999,"z":180.0168}},"a19bdb":{"lock":false,"pos":{"x":-30.2243,"y":1.627,"z":11.46},"rot":{"x":0.0169,"y":180.0077,"z":0.0799}},"a1b852":{"lock":false,"pos":{"x":-11.2981,"y":1.7087,"z":10.3332},"rot":{"x":359.9201,"y":269.9856,"z":180.0169}},"a1dbf2":{"lock":false,"pos":{"x":-9.5286,"y":1.6602,"z":-1.2349},"rot":{"x":359.9201,"y":269.997,"z":180.0169}},"a3dc2f":{"lock":false,"pos":{"x":-4.4458,"y":1.663,"z":14.3162},"rot":{"x":359.9197,"y":269.9745,"z":180.0169}},"a41e13":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9998,"z":180.0169}},"a45247":{"lock":false,"pos":{"x":1.6967,"y":1.5583,"z":14.2787},"rot":{"x":359.9551,"y":224.998,"z":0.0687}},"a4612b":{"lock":false,"pos":{"x":-17.12,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":269.9962,"z":180.0169}},"a492bc":{"lock":false,"pos":{"x":12.2499017715454,"y":1.45853817462921,"z":-20.013801574707},"rot":{"x":359.920104980469,"y":270.022186279297,"z":0.0168431103229523}},"a4e5e9":{"lock":false,"pos":{"x":-2.6884,"y":1.655,"z":-5.0486},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"a57738":{"lock":false,"pos":{"x":-0.0937998443841934,"y":1.61096239089966,"z":-10.4820022583008},"rot":{"x":359.919738769531,"y":269.986755371094,"z":0.0168364308774471}},"a5891b":{"lock":false,"pos":{"x":-3.5539,"y":1.5821,"z":-14.78},"rot":{"x":359.9197,"y":270.0027,"z":0.0168}},"a5b019":{"lock":false,"pos":{"x":-17.12,"y":1.602,"z":-11.51},"rot":{"x":359.9831,"y":0.0002,"z":359.92}},"a68851":{"lock":false,"pos":{"x":-23.6765,"y":1.6868,"z":-7.7},"rot":{"x":359.9201,"y":269.9972,"z":180.0169}},"a69955":{"lock":false,"pos":{"x":-30.2242,"y":1.6949,"z":-0.03},"rot":{"x":359.9201,"y":270.0005,"z":0.0169}},"a751fe":{"lock":false,"pos":{"x":-4.1944,"y":1.583,"z":-14.6164},"rot":{"x":359.9197,"y":270.0002,"z":0.0168}},"a7f7c7":{"lock":false,"pos":{"x":-36.7733001708984,"y":1.63160741329193,"z":-3.83000016212463},"rot":{"x":0.0167816318571568,"y":180.041229248047,"z":0.0799519121646881}},"a8a4b1":{"lock":false,"pos":{"x":-30.2243,"y":1.6931,"z":-7.7},"rot":{"x":359.9201,"y":269.9951,"z":0.0169}},"a8f47c":{"lock":false,"pos":{"x":1.6965,"y":1.6368,"z":14.2789},"rot":{"x":359.9552,"y":224.9986,"z":0.0687}},"a96e74":{"lock":false,"pos":{"x":-17.12,"y":1.681,"z":3.86},"rot":{"x":359.9201,"y":269.9844,"z":180.0169}},"a9c518":{"lock":false,"pos":{"x":-11.5089,"y":1.6766,"z":1.4197},"rot":{"x":359.9201,"y":269.999,"z":0.0169}},"aa3bc3":{"lock":false,"pos":{"x":-30.2243,"y":1.6982,"z":-0.03},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"aa3d8a":{"lock":false,"pos":{"x":-9.3567,"y":1.6442,"z":-0.6578},"rot":{"x":359.9201,"y":270.0177,"z":0.0168}},"aae2b1":{"lock":false,"pos":{"x":-3.566,"y":1.582,"z":-15.0714},"rot":{"x":359.9197,"y":270.0002,"z":0.0168}},"ab0576":{"lock":false,"pos":{"x":-20.6238,"y":1.6124,"z":7.2554},"rot":{"x":359.9201,"y":270,"z":0.0169}},"ab12bb":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9852,"z":0.0169}},"ab39b9":{"lock":false,"pos":{"x":-17.1201,"y":1.6234,"z":15.1897},"rot":{"x":359.9201,"y":269.988,"z":0.0169}},"ab51fa":{"lock":false,"pos":{"x":-20.3744,"y":1.6099,"z":0.0842},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"abb407":{"lock":false,"pos":{"x":-8.80510139465332,"y":1.602130651474,"z":-17.8170013427734},"rot":{"x":359.921813964844,"y":269.953735351563,"z":0.0167792495340109}},"abd037":{"lock":false,"pos":{"x":-23.6766,"y":1.6913,"z":7.57},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"acac22":{"lock":false,"pos":{"x":1.6967,"y":1.6368,"z":14.2788},"rot":{"x":359.9552,"y":225,"z":0.0687}},"acef56":{"lock":false,"pos":{"x":-30.2245655059814,"y":2.89300179481506,"z":7.56995344161987},"rot":{"x":358.874542236328,"y":269.999206542969,"z":180.01448059082}},"ad56f2":{"lock":false,"pos":{"x":12.2499,"y":1.4703,"z":19.9864},"rot":{"x":359.9201,"y":269.9646,"z":0.0169}},"ad6736":{"lock":false,"pos":{"x":-1.1127,"y":1.7619,"z":-27.6436},"rot":{"x":359.9201,"y":269.9693,"z":0.0169}},"ade1bd":{"lock":false,"pos":{"x":-3.956,"y":1.6585,"z":-10.4412},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"ae20a4":{"lock":false,"pos":{"x":-17.1199,"y":1.6765,"z":-11.51},"rot":{"x":359.9201,"y":270,"z":180.0169}},"af4e73":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9997,"z":0.0169}},"afc427":{"lock":false,"pos":{"x":-23.6764,"y":1.6874,"z":3.86},"rot":{"x":359.9201,"y":269.9971,"z":0.0169}},"afed94":{"lock":false,"pos":{"x":-26.1753253936768,"y":2.79806017875671,"z":-4.41148853302002},"rot":{"x":359.212493896484,"y":224.999404907227,"z":0.804533779621124}},"b04a1a":{"lock":false,"pos":{"x":-20.2608,"y":1.6098,"z":0.0434},"rot":{"x":0.0799,"y":90.0006,"z":359.9831}},"b11646":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9929,"z":0.0169}},"b149b1":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":359.9831,"y":0.0001,"z":359.92}},"b1bc62":{"lock":false,"pos":{"x":10.2009,"y":1.2817,"z":-2.161},"rot":{"x":0.0799,"y":89.9964,"z":359.9831}},"b1d40e":{"lock":false,"pos":{"x":-2.7247,"y":1.664,"z":0.3733},"rot":{"x":0.0168,"y":180.0068,"z":0.0803}},"b1d640":{"lock":false,"pos":{"x":-30.22487449646,"y":2.87907934188843,"z":3.85999584197998},"rot":{"x":0.0110347494482994,"y":180.008544921875,"z":1.119105219841}},"b21de6":{"lock":false,"pos":{"x":-13.3172,"y":1.6804,"z":7.5859},"rot":{"x":359.9201,"y":269.9856,"z":180.0169}},"b2b842":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9855,"z":0.0169}},"b2bd25":{"lock":false,"pos":{"x":-1.177,"y":1.5467,"z":-27.5609},"rot":{"x":359.9201,"y":269.9994,"z":0.0169}},"b310b9":{"lock":false,"pos":{"x":8.6044,"y":1.2859,"z":4.9796},"rot":{"x":0.08,"y":89.9997,"z":359.9831}},"b34bec":{"lock":false,"pos":{"x":12.2503,"y":1.4538,"z":-36.0138},"rot":{"x":359.9201,"y":269.992,"z":0.0169}},"b3bfc4":{"lock":false,"pos":{"x":-1.4651,"y":1.4756,"z":-26.9305},"rot":{"x":359.9201,"y":270.0049,"z":0.0169}},"b3cbc1":{"lock":false,"pos":{"x":-3.8937,"y":1.5826,"z":-14.6014},"rot":{"x":359.9197,"y":270.0009,"z":0.0168}},"b3ec68":{"lock":false,"pos":{"x":-12.7351,"y":1.6676,"z":-7.6861},"rot":{"x":359.9201,"y":270.0001,"z":0.0169}},"b4a135":{"lock":false,"pos":{"x":-26.9258,"y":1.6168,"z":-7.7032},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"b4cf5a":{"lock":false,"pos":{"x":3.9877,"y":1.4679,"z":-27.2649},"rot":{"x":359.9201,"y":269.9991,"z":0.0169}},"b5096d":{"lock":false,"pos":{"x":-13.5542,"y":1.6749,"z":-0.1164},"rot":{"x":359.9201,"y":270.0067,"z":180.0168}},"b57f89":{"lock":false,"pos":{"x":1.6965,"y":1.6368,"z":14.2789},"rot":{"x":359.9552,"y":224.998,"z":0.0687}},"b5928a":{"lock":false,"pos":{"x":-3.6897,"y":1.5822,"z":-15.0619},"rot":{"x":359.9198,"y":269.9669,"z":0.0169}},"b5a46b":{"lock":false,"pos":{"x":-23.6764984130859,"y":1.62694978713989,"z":-3.82989978790283},"rot":{"x":359.920104980469,"y":269.999938964844,"z":180.016830444336}},"b5ceb0":{"lock":false,"pos":{"x":-26.8548,"y":1.6211,"z":7.3881},"rot":{"x":359.9201,"y":270.0042,"z":0.0169}},"b676d8":{"lock":false,"pos":{"x":-20.6237,"y":1.608,"z":-7.5965},"rot":{"x":0.0799,"y":89.9992,"z":359.9831}},"b6a235":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":0.0168,"y":180.0349,"z":0.08}},"b6d48a":{"lock":false,"pos":{"x":-26.9756,"y":1.6157,"z":-11.6402},"rot":{"x":0.0446,"y":45,"z":359.9316}},"b6da68":{"lock":false,"pos":{"x":1.6955,"y":1.5583,"z":14.2792},"rot":{"x":359.9552,"y":224.9335,"z":0.0687}},"b756c0":{"lock":false,"pos":{"x":-3.92760014533997,"y":1.72512221336365,"z":5.75710153579712},"rot":{"x":359.919738769531,"y":270.00439453125,"z":180.016815185547}},"b7e3ad":{"lock":false,"pos":{"x":-20.2216,"y":1.6119,"z":7.3408},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"b81937":{"lock":false,"pos":{"x":-26.6804,"y":1.6176,"z":-3.8413},"rot":{"x":0.0684,"y":135.0054,"z":0.0446}},"b83079":{"lock":false,"pos":{"x":-3.9275,"y":1.7184,"z":5.7571},"rot":{"x":359.9197,"y":269.9856,"z":180.0168}},"b8480f":{"lock":false,"pos":{"x":-3.9559,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"b86938":{"lock":false,"pos":{"x":12.2499,"y":1.4609,"z":-12.0136},"rot":{"x":359.9202,"y":269.7148,"z":0.0173}},"b874a8":{"lock":false,"pos":{"x":-17.1199,"y":1.6042,"z":-3.83},"rot":{"x":0.0169,"y":179.9998,"z":0.0799}},"b8ca38":{"lock":false,"pos":{"x":-23.6765,"y":1.6885,"z":7.5699},"rot":{"x":359.9201,"y":269.9985,"z":0.0169}},"b93ec9":{"lock":false,"pos":{"x":-17.1199,"y":1.6771,"z":-0.03},"rot":{"x":359.9201,"y":269.9976,"z":0.0169}},"b99de3":{"lock":false,"pos":{"x":12.2498,"y":1.4656,"z":3.9864},"rot":{"x":359.9201,"y":269.922,"z":0.017}},"ba2ded":{"lock":false,"pos":{"x":12.2492,"y":1.2759,"z":-12.0135},"rot":{"x":0.08,"y":89.9973,"z":359.9831}},"bab1d6":{"lock":false,"pos":{"x":-17.1199,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":269.997,"z":180.0169}},"baff62":{"lock":false,"pos":{"x":-23.6765,"y":1.6868,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"bb43b8":{"lock":false,"pos":{"x":-11.5593,"y":1.6557,"z":11.8573},"rot":{"x":359.9201,"y":269.9891,"z":0.0169}},"bb506e":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9855,"z":0.0169}},"bbb70a":{"lock":false,"pos":{"x":-3.8848,"y":1.5826,"z":-14.7351},"rot":{"x":359.9197,"y":270.0318,"z":0.0168}},"bbb99f":{"lock":false,"pos":{"x":-20.5275,"y":1.6078,"z":-7.7916},"rot":{"x":0.0799,"y":89.9999,"z":359.9831}},"bbe4b0":{"lock":false,"pos":{"x":-30.2242,"y":1.6954,"z":-0.0301},"rot":{"x":359.9201,"y":269.9937,"z":0.0169}},"bc7323":{"lock":false,"pos":{"x":-30.2242,"y":1.6225,"z":-3.83},"rot":{"x":359.9831,"y":0,"z":359.9201}},"bc825a":{"lock":false,"pos":{"x":-4.1331,"y":1.5829,"z":-14.6606},"rot":{"x":359.9197,"y":270.0001,"z":0.0168}},"bd069f":{"lock":false,"pos":{"x":9.3965,"y":1.2827,"z":-2.4823},"rot":{"x":0.0799,"y":89.9951,"z":359.9831}},"bd556e":{"lock":false,"pos":{"x":12.2509,"y":1.4585,"z":-20.0165},"rot":{"x":359.9201,"y":270.0553,"z":0.0168}},"bda9a9":{"lock":false,"pos":{"x":-1.4655,"y":1.4756,"z":-26.9304},"rot":{"x":359.9201,"y":269.9913,"z":0.0169}},"bdd422":{"lock":false,"pos":{"x":-9.2986,"y":1.667,"z":0.0118},"rot":{"x":359.9202,"y":269.9846,"z":0.017}},"be3ac9":{"lock":false,"pos":{"x":-36.7732,"y":1.7073,"z":-0.03},"rot":{"x":359.9201,"y":269.9733,"z":180.0169}},"be5b52":{"lock":false,"pos":{"x":1.6968,"y":1.5583,"z":14.2787},"rot":{"x":359.9551,"y":224.9981,"z":0.0687}},"be5d2b":{"lock":false,"pos":{"x":-10.0804,"y":1.5953,"z":-1.0163},"rot":{"x":359.9201,"y":269.9913,"z":0.0169}},"be6abb":{"lock":false,"pos":{"x":-30.2243,"y":1.6203,"z":-11.51},"rot":{"x":359.9831,"y":0.0072,"z":359.92}},"bf0eaa":{"lock":false,"pos":{"x":-30.2261,"y":1.6983,"z":10.1027},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"bf5d39":{"lock":false,"pos":{"x":-5.9411,"y":1.5569,"z":-25.3389},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"bfa2a2":{"lock":false,"pos":{"x":-8.80050086975098,"y":1.60343933105469,"z":-13.3184013366699},"rot":{"x":359.921997070313,"y":270.002410888672,"z":0.0167618654668331}},"bfb121":{"lock":false,"pos":{"x":-17.12,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":269.9953,"z":180.0169}},"bfeb71":{"lock":false,"pos":{"x":-9.6538,"y":1.6654,"z":-0.6313},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"c0897e":{"lock":false,"pos":{"x":10.4203,"y":1.2811,"z":-2.9799},"rot":{"x":0.0799,"y":89.9995,"z":359.9831}},"c11ba5":{"lock":false,"pos":{"x":-2.6884,"y":1.6535,"z":-5.0485},"rot":{"x":359.9197,"y":269.997,"z":0.0168}},"c1aad0":{"lock":false,"pos":{"x":9.6318,"y":1.285,"z":6.3703},"rot":{"x":0.0799,"y":89.9923,"z":359.9831}},"c210e3":{"lock":false,"pos":{"x":-30.2243,"y":1.6954,"z":-0.03},"rot":{"x":359.9201,"y":269.9935,"z":0.0169}},"c29a78":{"lock":false,"pos":{"x":12.2518005371094,"y":1.46795845031738,"z":11.9862012863159},"rot":{"x":359.920135498047,"y":270.000366210938,"z":0.0168725159019232}},"c29eac":{"lock":false,"pos":{"x":-17.12,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"c2a55d":{"lock":false,"pos":{"x":8.6023,"y":1.2838,"z":-2.2398},"rot":{"x":0.08,"y":89.9987,"z":359.9831}},"c2da92":{"lock":false,"pos":{"x":-20.9563,"y":1.61,"z":-2.6211},"rot":{"x":0.0253,"y":29.9999,"z":359.9224}},"c2fe44":{"lock":false,"pos":{"x":-0.4614,"y":1.7617,"z":-25.2014},"rot":{"x":359.9201,"y":269.9758,"z":0.0169}},"c3031b":{"lock":false,"pos":{"x":-2.7228,"y":1.6208,"z":0.3589},"rot":{"x":359.9197,"y":269.9689,"z":0.0169}},"c34f49":{"lock":false,"pos":{"x":-2.6886,"y":1.6535,"z":-5.0485},"rot":{"x":0.0168,"y":180,"z":0.0803}},"c35463":{"lock":false,"pos":{"x":-30.2243,"y":1.7004,"z":7.57},"rot":{"x":359.9201,"y":269.9971,"z":180.0169}},"c37bc0":{"lock":false,"pos":{"x":-23.6764,"y":1.6879,"z":-3.83},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"c41b7b":{"lock":false,"pos":{"x":-30.2243,"y":1.6248,"z":3.86},"rot":{"x":359.9831,"y":359.9757,"z":359.9201}},"c5008a":{"lock":false,"pos":{"x":-3.5702,"y":1.5821,"z":-14.9068},"rot":{"x":359.9197,"y":270.0005,"z":0.0168}},"c51bff":{"lock":false,"pos":{"x":-17.12,"y":1.6821,"z":7.57},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"c56f66":{"lock":false,"pos":{"x":8.2949,"y":1.2857,"z":2.5561},"rot":{"x":0.0799,"y":89.9962,"z":359.9831}},"c582af":{"lock":false,"pos":{"x":-26.9427,"y":1.6213,"z":7.6022},"rot":{"x":359.9201,"y":270.0272,"z":0.0168}},"c5a4bf":{"lock":false,"pos":{"x":-36.7731,"y":1.709,"z":15.19},"rot":{"x":359.9201,"y":270,"z":0.0169}},"c606a1":{"lock":false,"pos":{"x":-4.0681,"y":1.5827,"z":-15.3226},"rot":{"x":359.9197,"y":270.0012,"z":0.0168}},"c627fc":{"lock":false,"pos":{"x":17.8328266143799,"y":1.45285880565643,"z":-12.8706102371216},"rot":{"x":359.920104980469,"y":270.017272949219,"z":0.0168486014008522}},"c62fb5":{"lock":false,"pos":{"x":-23.677173614502,"y":2.75242376327515,"z":11.4600696563721},"rot":{"x":0.0137052861973643,"y":180.005645751953,"z":1.12122356891632}},"c6305b":{"lock":false,"pos":{"x":-2.7247,"y":1.6551,"z":0.3733},"rot":{"x":0.0168,"y":179.9938,"z":0.0803}},"c63130":{"lock":false,"pos":{"x":-30.224458694458,"y":2.89153170585632,"z":-0.0299496054649353},"rot":{"x":358.874664306641,"y":269.999969482422,"z":180.01318359375}},"c6995b":{"lock":false,"pos":{"x":-21.6704,"y":1.6106,"z":-3.7228},"rot":{"x":359.9316,"y":315.0002,"z":359.9554}},"c6a2ab":{"lock":false,"pos":{"x":-27.6254,"y":1.6167,"z":-11.1322},"rot":{"x":359.9316,"y":314.9959,"z":359.9554}},"c6a9ae":{"lock":false,"pos":{"x":-3.9274,"y":1.7611,"z":5.7572},"rot":{"x":359.9197,"y":269.9857,"z":180.0168}},"c7c0a9":{"lock":false,"pos":{"x":-2.7247,"y":1.6208,"z":0.3733},"rot":{"x":359.9197,"y":270.0151,"z":0.0168}},"c907e9":{"lock":false,"pos":{"x":-33.5388374328613,"y":2.94438004493713,"z":7.56042194366455},"rot":{"x":358.875640869141,"y":270.01416015625,"z":-0.00510153220966458}},"c99e9d":{"lock":false,"pos":{"x":-2.6886,"y":1.6623,"z":-5.0485},"rot":{"x":359.9197,"y":269.9824,"z":0.0169}},"c9d140":{"lock":false,"pos":{"x":-12.2295,"y":1.5215,"z":31.5404},"rot":{"x":359.9201,"y":269.9884,"z":0.0169}},"c9e9ad":{"lock":false,"pos":{"x":-5.3818,"y":1.4082,"z":14.423},"rot":{"x":359.9832,"y":-0.0034,"z":359.9196}},"ca0e9b":{"lock":false,"pos":{"x":-23.6765,"y":1.684,"z":-7.7},"rot":{"x":359.9201,"y":269.9952,"z":0.0169}},"ca86be":{"lock":false,"pos":{"x":-30.2245311737061,"y":2.89382982254028,"z":15.1901578903198},"rot":{"x":358.871704101563,"y":270.000610351563,"z":180.012786865234}},"cb2e63":{"lock":false,"pos":{"x":-23.6775,"y":1.689,"z":-0.0357},"rot":{"x":359.92,"y":270.3729,"z":180.0163}},"cc7eb3":{"lock":false,"pos":{"x":12.2503061294556,"y":1.4726722240448,"z":27.9863758087158},"rot":{"x":359.920135498047,"y":269.999938964844,"z":0.0168737210333347}},"cca4ce":{"lock":false,"pos":{"x":-23.6764,"y":1.684,"z":-7.6884},"rot":{"x":359.9201,"y":270.0044,"z":0.0167}},"cce0e0":{"lock":false,"pos":{"x":-12.0115,"y":1.671,"z":7.4502},"rot":{"x":359.9201,"y":270.0065,"z":0.0169}},"cd676c":{"lock":false,"pos":{"x":-2.6885,"y":1.6623,"z":-5.0486},"rot":{"x":0.0168,"y":180.0007,"z":0.0803}},"cde2d1":{"lock":false,"pos":{"x":-2.6885,"y":1.6459,"z":-5.0485},"rot":{"x":359.9197,"y":270.0159,"z":0.0168}},"ce2091":{"lock":false,"pos":{"x":-17.12,"y":1.6778,"z":3.86},"rot":{"x":359.9201,"y":269.9993,"z":0.0169}},"ce35ae":{"lock":false,"pos":{"x":-2.7247,"y":1.6551,"z":0.3733},"rot":{"x":0.0168,"y":180.0006,"z":0.0803}},"d0c475":{"lock":false,"pos":{"x":-17.12,"y":1.6844,"z":15.19},"rot":{"x":359.9201,"y":270.0072,"z":180.0168}},"d14543":{"lock":false,"pos":{"x":-12.2221,"y":1.4168,"z":11.1913},"rot":{"x":0.08,"y":89.9905,"z":359.9831}},"d166f2":{"lock":false,"pos":{"x":9.8646,"y":1.2814,"z":-4.5878},"rot":{"x":0.0799,"y":89.9959,"z":359.9831}},"d1bab1":{"lock":false,"pos":{"x":-23.6765,"y":1.689,"z":-0.03},"rot":{"x":359.9201,"y":269.9999,"z":180.0169}},"d26316":{"lock":false,"pos":{"x":-26.8215,"y":1.6154,"z":-11.8145},"rot":{"x":0.045,"y":45.3509,"z":359.9319}},"d2cb13":{"lock":false,"pos":{"x":-12.0254,"y":1.614,"z":7.5293},"rot":{"x":359.9201,"y":269.995,"z":0.0168}},"d306b8":{"lock":false,"pos":{"x":-12.4062,"y":1.679,"z":12.7949},"rot":{"x":359.9201,"y":269.9857,"z":180.0169}},"d33de6":{"lock":false,"pos":{"x":-20.3424,"y":1.6076,"z":-7.7619},"rot":{"x":359.9201,"y":270.002,"z":0.0169}},"d37670":{"lock":false,"pos":{"x":-3.9277,"y":1.6705,"z":5.7572},"rot":{"x":359.9197,"y":270.0103,"z":180.0168}},"d37681":{"lock":false,"pos":{"x":-27.0094223022461,"y":2.81653690338135,"z":7.4950737953186},"rot":{"x":358.874481201172,"y":270.008361816406,"z":-0.00200099125504494}},"d46b84":{"lock":false,"pos":{"x":-11.4019,"y":1.6887,"z":15.8439},"rot":{"x":359.9274,"y":269.9868,"z":180.3533}},"d54710":{"lock":false,"pos":{"x":-4.0215,"y":1.5826,"z":-15.2289},"rot":{"x":359.9197,"y":269.9984,"z":0.0168}},"d5b06c":{"lock":false,"pos":{"x":-4.3545,"y":1.5833,"z":-14.5586},"rot":{"x":359.9197,"y":270.0016,"z":0.0168}},"d5b604":{"lock":false,"pos":{"x":12.2505,"y":1.2731,"z":-21.3052},"rot":{"x":359.9554,"y":225.0007,"z":0.0685}},"d60ed8":{"lock":false,"pos":{"x":-30.2242,"y":1.6954,"z":-0.03},"rot":{"x":359.9201,"y":269.9992,"z":0.0169}},"d63331":{"lock":false,"pos":{"x":-50.9244,"y":1.7294,"z":8.1784},"rot":{"x":359.9201,"y":270.0003,"z":180.0169}},"d778ee":{"lock":false,"pos":{"x":-26.967,"y":1.6168,"z":-7.7901},"rot":{"x":359.9201,"y":270.0042,"z":0.0169}},"d7eb78":{"lock":false,"pos":{"x":-19.5006,"y":1.612,"z":11.2137},"rot":{"x":0.0685,"y":134.9717,"z":0.0445}},"d7fc4c":{"lock":false,"pos":{"x":-30.2198,"y":1.7004,"z":7.5731},"rot":{"x":359.9201,"y":270.0274,"z":180.0168}},"d807d4":{"lock":false,"pos":{"x":-26.8814,"y":1.619,"z":-0.0326},"rot":{"x":0.0799,"y":90.0005,"z":359.9831}},"d82996":{"lock":false,"pos":{"x":-20.2633,"y":1.6053,"z":-15.0852},"rot":{"x":0.0799,"y":90,"z":359.9831}},"d90311":{"lock":false,"pos":{"x":-30.2242,"y":1.6931,"z":-7.7001},"rot":{"x":359.9201,"y":269.9952,"z":0.0169}},"da1f25":{"lock":false,"pos":{"x":-17.1199,"y":1.6054,"z":-0.03},"rot":{"x":359.9201,"y":270.0272,"z":0.0169}},"da2cbd":{"lock":false,"pos":{"x":-17.1196,"y":1.6155,"z":-11.5093},"rot":{"x":359.9201,"y":270.0104,"z":0.0168}},"da3aed":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9855,"z":0.0169}},"da6072":{"lock":false,"pos":{"x":1.6965,"y":1.6585,"z":14.2788},"rot":{"x":359.9552,"y":224.998,"z":0.0687}},"daa421":{"lock":false,"pos":{"x":1.6966005563736,"y":1.55831670761108,"z":14.2781028747559},"rot":{"x":359.955139160156,"y":224.990615844727,"z":0.0686785653233528}},"daa95d":{"lock":false,"pos":{"x":-27.1008,"y":1.6199,"z":2.1469},"rot":{"x":359.9554,"y":224.9999,"z":0.0684}},"daef01":{"lock":false,"pos":{"x":-30.2243,"y":1.6248,"z":3.86},"rot":{"x":359.9831,"y":0.007,"z":359.92}},"db443b":{"lock":false,"pos":{"x":-3.956,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":269.9998,"z":0.0168}},"db49f3":{"lock":false,"pos":{"x":-21.1809,"y":1.6117,"z":2.132},"rot":{"x":0.0684,"y":134.9832,"z":0.0445}},"db7039":{"lock":false,"pos":{"x":12.2519655227661,"y":1.46795845031738,"z":11.9863920211792},"rot":{"x":359.920135498047,"y":269.999938964844,"z":0.0168742034584284}},"dbbfa0":{"lock":false,"pos":{"x":-30.2243,"y":1.6959,"z":-7.7},"rot":{"x":359.9201,"y":269.9789,"z":180.0169}},"dbdb0f":{"lock":false,"pos":{"x":-43.3700942993164,"y":3.14913988113403,"z":-0.0299615487456322},"rot":{"x":358.875915527344,"y":270.000518798828,"z":180.011703491211}},"dbe757":{"lock":false,"pos":{"x":-2.68850016593933,"y":1.62393057346344,"z":-5.04850149154663},"rot":{"x":359.919738769531,"y":269.990661621094,"z":0.0168507266789675}},"dc50b3":{"lock":false,"pos":{"x":-3.9555,"y":1.6556,"z":-10.4413},"rot":{"x":359.9197,"y":269.9999,"z":0.0168}},"dda3d5":{"lock":false,"pos":{"x":-30.2242,"y":1.6225,"z":-3.83},"rot":{"x":0.0168,"y":180.0349,"z":0.08}},"ddc104":{"lock":false,"pos":{"x":-2.6884,"y":1.6336,"z":-5.0485},"rot":{"x":359.9197,"y":269.9859,"z":0.0169}},"ddd10b":{"lock":false,"pos":{"x":8.3252,"y":1.283,"z":-6.4267},"rot":{"x":0.0799,"y":89.996,"z":359.9831}},"dde586":{"lock":false,"pos":{"x":-3.9275,"y":1.7237,"z":5.7571},"rot":{"x":359.9197,"y":270.0001,"z":180.0168}},"de583f":{"lock":false,"pos":{"x":-3.956,"y":1.5975,"z":-10.4413},"rot":{"x":359.9197,"y":270.002,"z":0.0168}},"def2f5":{"lock":false,"pos":{"x":-2.7248,"y":1.664,"z":0.3734},"rot":{"x":359.9197,"y":270.001,"z":180.0168}},"df5156":{"lock":false,"pos":{"x":9.2722,"y":1.2819,"z":-6.0997},"rot":{"x":0.0799,"y":89.9909,"z":359.9831}},"df8dff":{"lock":false,"pos":{"x":-31.957,"y":1.8293,"z":-0.0662},"rot":{"x":4.7643,"y":270.0184,"z":0.017}},"dfff72":{"lock":false,"pos":{"x":-23.6764,"y":1.6913,"z":7.57},"rot":{"x":359.9201,"y":270,"z":180.0169}},"e02060":{"lock":false,"pos":{"x":-2.6886,"y":1.655,"z":-5.0485},"rot":{"x":0.0168,"y":180.0001,"z":0.0803}},"e04c21":{"lock":false,"pos":{"x":12.2493028640747,"y":1.45618331432343,"z":-28.0139045715332},"rot":{"x":359.920135498047,"y":270.002471923828,"z":0.0168705992400646}},"e0e56d":{"lock":false,"pos":{"x":-30.2243,"y":1.6993,"z":3.86},"rot":{"x":359.9201,"y":269.9972,"z":180.0169}},"e10b7c":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":359.9831,"y":0,"z":359.9201}},"e1bf6b":{"lock":false,"pos":{"x":-26.9599,"y":1.6203,"z":3.9439},"rot":{"x":359.9316,"y":315.0001,"z":359.9554}},"e1caf1":{"lock":false,"pos":{"x":12.1709051132202,"y":1.28772139549255,"z":27.8930072784424},"rot":{"x":0.0799488052725792,"y":89.9712753295898,"z":359.983062744141}},"e22a64":{"lock":false,"pos":{"x":-27.6267,"y":1.6188,"z":-4.0757},"rot":{"x":359.9316,"y":314.9999,"z":359.9554}},"e28e5b":{"lock":false,"pos":{"x":-17.1199,"y":1.6782,"z":3.86},"rot":{"x":359.9201,"y":269.9969,"z":0.0169}},"e3aa6a":{"lock":false,"pos":{"x":-17.1199,"y":1.6065,"z":3.86},"rot":{"x":359.9831,"y":-0.0033,"z":359.92}},"e413cc":{"lock":false,"pos":{"x":-23.6765,"y":1.6179,"z":11.46},"rot":{"x":359.9832,"y":0.0153,"z":359.9201}},"e47eca":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":0.0168,"y":180.0349,"z":0.08}},"e54f2a":{"lock":false,"pos":{"x":9.5041,"y":1.2855,"z":7.3849},"rot":{"x":0.0799,"y":89.9936,"z":359.9831}},"e5c753":{"lock":false,"pos":{"x":-2.72470021247864,"y":1.62557446956635,"z":0.373300045728683},"rot":{"x":359.919738769531,"y":269.990661621094,"z":0.0168506167829037}},"e600d4":{"lock":false,"pos":{"x":-27.011043548584,"y":2.81816363334656,"z":15.3159799575806},"rot":{"x":358.876037597656,"y":270.010467529297,"z":0.00692319450899959}},"e67855":{"lock":false,"pos":{"x":-17.1201,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":269.9982,"z":180.0169}},"e6bb63":{"lock":false,"pos":{"x":12.2493,"y":1.4562,"z":-28.0157},"rot":{"x":359.9201,"y":270.0376,"z":0.0168}},"e78e52":{"lock":false,"pos":{"x":-20.229,"y":1.6108,"z":3.6702},"rot":{"x":359.9316,"y":315.0001,"z":359.9554}},"e7b998":{"lock":false,"pos":{"x":-17.1199,"y":1.6799,"z":-0.03},"rot":{"x":359.9201,"y":270.0052,"z":180.0169}},"e80a41":{"lock":false,"pos":{"x":-30.2246932983398,"y":2.89054799079895,"z":-7.70002698898315},"rot":{"x":358.873352050781,"y":269.997467041016,"z":180.009841918945}},"e90dde":{"lock":false,"pos":{"x":-24.7567,"y":1.6149,"z":-3.8971},"rot":{"x":359.9832,"y":0.0096,"z":359.92}},"e9ae84":{"lock":false,"pos":{"x":-4.2177,"y":1.6697,"z":14.5874},"rot":{"x":359.9197,"y":269.9857,"z":180.0168}},"e9cc5a":{"lock":false,"pos":{"x":-30.2243003845215,"y":1.63719701766968,"z":-0.0299998205155134},"rot":{"x":359.920104980469,"y":269.99951171875,"z":180.016830444336}},"e9d947":{"lock":false,"pos":{"x":-2.6895,"y":1.3987,"z":-5.0483},"rot":{"x":359.9832,"y":0.0002,"z":359.9197}},"e9f3b1":{"lock":false,"pos":{"x":9.0726,"y":1.2773,"z":-22.1196},"rot":{"x":359.9831,"y":0.001,"z":359.92}},"ea0896":{"lock":false,"pos":{"x":-3.3332,"y":1.5816,"z":-15.257},"rot":{"x":359.9197,"y":270.0002,"z":0.0168}},"ea8211":{"lock":false,"pos":{"x":-30.2241,"y":1.6931,"z":-7.6998},"rot":{"x":359.9202,"y":269.9836,"z":0.0165}},"eb22de":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":359.9831,"y":359.9921,"z":359.9201}},"eb5dd9":{"lock":false,"pos":{"x":-50.9244,"y":1.7266,"z":8.1784},"rot":{"x":359.9201,"y":269.9998,"z":0.0169}},"eb6cf0":{"lock":false,"pos":{"x":-23.6765,"y":1.6862,"z":-0.03},"rot":{"x":359.9201,"y":269.9966,"z":0.0169}},"ec7842":{"lock":false,"pos":{"x":-16.0300998687744,"y":1.63047182559967,"z":-2.20079970359802},"rot":{"x":359.920104980469,"y":269.998748779297,"z":0.734870731830597}},"ec7a73":{"lock":false,"pos":{"x":-4.9066,"y":1.684,"z":-14.5418},"rot":{"x":359.9195,"y":270.04,"z":0.0161}},"ecbf8f":{"lock":false,"pos":{"x":-17.1201,"y":1.6754,"z":-15.2799},"rot":{"x":359.9201,"y":270.0269,"z":180.0168}},"ed48d8":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":359.9832,"y":0.0096,"z":359.92}},"eda22b":{"lock":false,"pos":{"x":-1.471,"y":1.5756,"z":-26.9334},"rot":{"x":359.9201,"y":270.107,"z":0.0167}},"edb80f":{"lock":false,"pos":{"x":-20.4959,"y":1.61,"z":-0.1873},"rot":{"x":0.0799,"y":89.9999,"z":359.9831}},"edcae4":{"lock":false,"pos":{"x":-30.2242,"y":1.6934,"z":-0.0301},"rot":{"x":359.9201,"y":270.0021,"z":0.0169}},"edd0d4":{"lock":false,"pos":{"x":-17.12,"y":1.6189,"z":-0.03},"rot":{"x":359.9201,"y":270.0099,"z":180.0168}},"ee673a":{"lock":false,"pos":{"x":-17.12,"y":1.6065,"z":3.86},"rot":{"x":359.9832,"y":0.0096,"z":359.92}},"ee987d":{"lock":false,"pos":{"x":12.2499647140503,"y":1.46089422702789,"z":-12.0136232376099},"rot":{"x":359.920135498047,"y":269.999938964844,"z":0.0168740563094616}},"eea51b":{"lock":false,"pos":{"x":8.0856,"y":1.2853,"z":0.187},"rot":{"x":0.0799,"y":89.9983,"z":359.9831}},"eeedd1":{"lock":false,"pos":{"x":-23.6768798828125,"y":2.76657485961914,"z":15.1900329589844},"rot":{"x":358.871917724609,"y":269.999206542969,"z":180.014251708984}},"ef067f":{"lock":false,"pos":{"x":-27.2278,"y":1.6207,"z":4.0347},"rot":{"x":0.0684,"y":135.0052,"z":0.0446}},"efba6c":{"lock":false,"pos":{"x":-50.9244,"y":1.7294,"z":8.1784},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"efe8d6":{"lock":false,"pos":{"x":-17.1201,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"f040a6":{"lock":false,"pos":{"x":12.1407060623169,"y":1.28064227104187,"z":3.70839309692383},"rot":{"x":0.0799626931548119,"y":89.9970016479492,"z":359.983093261719}},"f051fc":{"lock":false,"pos":{"x":12.2492,"y":1.475,"z":35.9864},"rot":{"x":359.9201,"y":270.0028,"z":0.0169}},"f0d16a":{"lock":false,"pos":{"x":-23.6765,"y":1.6935,"z":15.19},"rot":{"x":359.9201,"y":270.011,"z":180.0168}},"f0dbb0":{"lock":false,"pos":{"x":-23.6765,"y":1.6134,"z":-3.83},"rot":{"x":359.9832,"y":0.0155,"z":359.92}},"f0e2dc":{"lock":false,"pos":{"x":-17.12,"y":1.6765,"z":-0.03},"rot":{"x":359.9201,"y":269.9836,"z":180.0169}},"f108e3":{"lock":false,"pos":{"x":-27.3214,"y":1.6189,"z":-2.4573},"rot":{"x":359.9316,"y":315.0002,"z":359.9554}},"f305a2":{"lock":false,"pos":{"x":-2.6885,"y":1.6535,"z":-5.0485},"rot":{"x":0.0168,"y":179.9978,"z":0.0803}},"f39e68":{"lock":false,"pos":{"x":10.161,"y":1.2842,"z":6.4667},"rot":{"x":0.0799,"y":89.9954,"z":359.9831}},"f4c93e":{"lock":false,"pos":{"x":-3.9584,"y":1.5827,"z":-14.7436},"rot":{"x":359.9197,"y":270.0297,"z":0.0168}},"f5106e":{"lock":false,"pos":{"x":-23.676778793335,"y":2.76506209373474,"z":7.57012939453125},"rot":{"x":358.8740234375,"y":270.000549316406,"z":180.015213012695}},"f591c7":{"lock":false,"pos":{"x":-26.9568,"y":1.6207,"z":5.6374},"rot":{"x":0.0684,"y":134.9882,"z":0.0445}},"f5db25":{"lock":false,"pos":{"x":-3.6762,"y":1.5823,"z":-14.5355},"rot":{"x":359.9197,"y":270.0002,"z":0.0168}},"f5f35d":{"lock":false,"pos":{"x":-9.207,"y":1.5169,"z":30.3654},"rot":{"x":0.0169,"y":180,"z":0.0799}},"f6d6d8":{"lock":false,"pos":{"x":-17.12,"y":1.6793,"z":7.57},"rot":{"x":359.9201,"y":269.978,"z":0.0169}},"f70a0d":{"lock":false,"pos":{"x":10.9036,"y":1.4689,"z":8.8896},"rot":{"x":359.9201,"y":269.999,"z":0.0169}},"f7c15e":{"lock":false,"pos":{"x":-30.2242,"y":1.6976,"z":7.57},"rot":{"x":359.9201,"y":269.9958,"z":0.0169}},"f8005d":{"lock":false,"pos":{"x":-3.9558,"y":1.6556,"z":-10.4412},"rot":{"x":359.9197,"y":270,"z":0.0168}},"f86867":{"lock":false,"pos":{"x":-0.7656,"y":1.4707,"z":-43.8939},"rot":{"x":0.0001,"y":269.9959,"z":1.576}},"f90f84":{"lock":false,"pos":{"x":-23.6765,"y":1.6111,"z":-11.51},"rot":{"x":359.9831,"y":0,"z":359.9201}},"f9ae22":{"lock":false,"pos":{"x":-2.7251,"y":1.6566,"z":0.3733},"rot":{"x":359.9198,"y":269.9414,"z":0.0169}},"f9fc71":{"lock":false,"pos":{"x":-50.9244,"y":1.7294,"z":8.1784},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"fa8210":{"lock":false,"pos":{"x":1.6965,"y":1.6545,"z":14.2788},"rot":{"x":359.9552,"y":224.9979,"z":0.0687}},"fadb67":{"lock":false,"pos":{"x":-23.6763,"y":1.6948,"z":7.57},"rot":{"x":359.9201,"y":270.0001,"z":180.0169}},"fb280a":{"lock":false,"pos":{"x":-3.95589995384216,"y":1.59753930568695,"z":-10.441201210022},"rot":{"x":359.919738769531,"y":270.000091552734,"z":0.0168370883911848}},"fba392":{"lock":false,"pos":{"x":12.2494,"y":1.4562,"z":-28.0136},"rot":{"x":359.9201,"y":269.9914,"z":0.0169}},"fbe9fd":{"lock":false,"pos":{"x":-24.8778991699219,"y":1.61609935760498,"z":-0.15740005671978},"rot":{"x":0.0166492201387882,"y":180.136245727539,"z":0.0799793377518654}},"fbf157":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":359.9831,"y":0.0072,"z":359.92}},"fc7674":{"lock":false,"pos":{"x":12.250449180603,"y":1.45382606983185,"z":-36.0138664245605},"rot":{"x":359.920135498047,"y":269.999938964844,"z":0.0168737173080444}},"fcfbbe":{"lock":false,"pos":{"x":-23.6765,"y":1.6157,"z":3.86},"rot":{"x":0.0169,"y":180,"z":0.0799}},"fda256":{"lock":false,"pos":{"x":-27.7376,"y":1.619,"z":-4.1724},"rot":{"x":359.9316,"y":315.0002,"z":359.9554}},"fdd75d":{"lock":false,"pos":{"x":-2.72470021247864,"y":1.62076044082642,"z":0.37329962849617},"rot":{"x":359.919738769531,"y":269.999389648438,"z":0.0168378036469221}},"fde05d":{"lock":false,"pos":{"x":-27.0646,"y":1.6215,"z":7.5852},"rot":{"x":359.9201,"y":269.9991,"z":0.0169}},"fe4e96":{"lock":false,"pos":{"x":-12.0018,"y":1.7668,"z":11.1085},"rot":{"x":359.9201,"y":270.0005,"z":180.0168}},"fed65c":{"lock":false,"pos":{"x":-2.7247,"y":1.6571,"z":0.3733},"rot":{"x":0.0169,"y":179.9893,"z":0.0803}},"ff4d6f":{"lock":false,"pos":{"x":-17.12,"y":1.6776,"z":-7.7},"rot":{"x":359.9201,"y":269.996,"z":180.0169}},"ffeff3":{"lock":false,"pos":{"x":-27.1788,"y":1.6183,"z":-3.7526},"rot":{"x":359.9315,"y":314.8558,"z":359.9556}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0/Custom_Tile Against the Wendigo 82e1ed.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0/Custom_Tile Against the Wendigo 82e1ed.ttslua index bd968c218..d47035472 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0/Custom_Tile Against the Wendigo 82e1ed.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0/Custom_Tile Against the Wendigo 82e1ed.ttslua @@ -1,21 +1,21 @@ -name = 'Bread and Circuses' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Bread and Circuses' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 1 Arkham in Wonderland 18aa54.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 1 Arkham in Wonderland 18aa54.ttslua index 013eb65ca..cae387265 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 1 Arkham in Wonderland 18aa54.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 1 Arkham in Wonderland 18aa54.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-A A Sea of Troubles 952572.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-A A Sea of Troubles 952572.ttslua index 013eb65ca..cae387265 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-A A Sea of Troubles 952572.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-A A Sea of Troubles 952572.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-B Tempest in a Teapot 8d88c8.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-B Tempest in a Teapot 8d88c8.ttslua index 013eb65ca..cae387265 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-B Tempest in a Teapot 8d88c8.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-B Tempest in a Teapot 8d88c8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-C Bleeding Hearts 8eb793.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-C Bleeding Hearts 8eb793.ttslua index 013eb65ca..cae387265 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-C Bleeding Hearts 8eb793.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-C Bleeding Hearts 8eb793.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-D Wild Snark Chase 9e33a0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-D Wild Snark Chase 9e33a0.ttslua index 013eb65ca..cae387265 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-D Wild Snark Chase 9e33a0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-D Wild Snark Chase 9e33a0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-E Sibling Rivalry 0916b6.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-E Sibling Rivalry 0916b6.ttslua index 013eb65ca..cae387265 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-E Sibling Rivalry 0916b6.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-E Sibling Rivalry 0916b6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-F Fool's Mate bd556e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-F Fool's Mate bd556e.ttslua index 013eb65ca..cae387265 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-F Fool's Mate bd556e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-F Fool's Mate bd556e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 3 Lucid Nightmare e6bb63.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 3 Lucid Nightmare e6bb63.ttslua index 013eb65ca..cae387265 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 3 Lucid Nightmare e6bb63.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 3 Lucid Nightmare e6bb63.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Tile Alice in Wonderland b5928a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Tile Alice in Wonderland b5928a.ttslua index 210076a48..db124ee3b 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Tile Alice in Wonderland b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Tile Alice in Wonderland b5928a.ttslua @@ -1,21 +1,21 @@ -name = 'Alice in Wonderland' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Alice in Wonderland' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Token Alice in Wonderland Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Token Alice in Wonderland Campaign Log eda22b.ttslua index b42812626..6b9789fb2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Token Alice in Wonderland Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Token Alice in Wonderland Campaign Log eda22b.ttslua @@ -1,651 +1,651 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.080,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.270,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.000,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.251,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.441,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.171,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {0.579,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {0.389,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {0.659,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {1.407,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {1.217,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {1.487,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.265,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.265,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.265,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.436,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.436,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.436,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {0.394,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {0.394,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {0.394,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {1.222,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {1.222,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {1.222,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.930,0.1,0.990}, - rows = 25, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.820,0.1,0.707}, - rows = 20, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {1.010,0.1,1.700}, - rows = 5, - width = 7400, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.080,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.270,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.000,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.251,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.441,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.171,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {0.579,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {0.389,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {0.659,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {1.407,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {1.217,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {1.487,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.265,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.265,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.265,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.436,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.436,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.436,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {0.394,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {0.394,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {0.394,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {1.222,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {1.222,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {1.222,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.930,0.1,0.990}, + rows = 25, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.820,0.1,0.707}, + rows = 20, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Killed and Insane Investigators + { + pos = {1.010,0.1,1.700}, + rows = 5, + width = 7400, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.yaml index 16bb65c44..4c620aa44 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.yaml @@ -19,6 +19,7 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: +- !include 'Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing 7c8eef.yaml' - !include 'Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.yaml' - !include 'Custom_Model_Bag All or Nothing 72ab92/CardCustom Eyes All Around You 29d606.yaml' @@ -32,7 +33,6 @@ ContainedObjects: - !include 'Custom_Model_Bag All or Nothing 72ab92/Card Darkened Hall 911f8c.yaml' - !include 'Custom_Model_Bag All or Nothing 72ab92/Card Clover Club Cardroom 9a3039.yaml' - !include 'Custom_Model_Bag All or Nothing 72ab92/CardCustom Scenario a2fcc1.yaml' -- !include 'Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing b5928a.yaml' - !include 'Custom_Model_Bag All or Nothing 72ab92/Custom_Tile b68edf.yaml' - !include 'Custom_Model_Bag All or Nothing 72ab92/Custom_Tile b8e732.yaml' - !include 'Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.yaml' @@ -77,8 +77,8 @@ Sticky: true Tooltip: true Transform: posX: 12.25 - posY: 1.47 - posZ: 27.99 + posY: 1.48 + posZ: 35.99 rotX: 359.92 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.ttslua index 512f2eed0..4d4017455 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.yaml index cc483dfa7..20ebbf3b8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.249999881 - g: 0.249999881 - r: 0.249999881 + b: 0.249999791 + g: 0.249999791 + r: 0.249999791 ContainedObjects: - !include 'Bag With Return Set 083fc2/Custom_Model_Bag Set-aside 016504.yaml' - !include 'Bag With Return Set 083fc2/Deck Encounter Deck 6cc567.yaml' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.ttslua index 512f2eed0..4d4017455 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.yaml index 3121eb9a5..70b165e0c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.167999864 + b: 0.167999774 g: 0.701 - r: 0.191999882 + r: 0.1919998 ContainedObjects: - !include 'Bag Without Return Set d14543/Card Clover Club Lounge 4b1874.yaml' - !include 'Bag Without Return Set d14543/Deck Encounter Deck 71f991.yaml' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile f797c9.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile f797c9.yaml index 7d343c845..85885dd19 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile f797c9.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile f797c9.yaml @@ -123,12 +123,12 @@ States: Sticky: true Tooltip: true Transform: - posX: 12.25 - posY: 1.93 - posZ: -28.01 - rotX: 359.99 + posX: -23.68 + posY: 1.62 + posZ: 3.86 + rotX: 359.98 rotY: 0.0 - rotZ: 359.93 + rotZ: 359.92 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing b5928a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing 7c8eef.ttslua similarity index 96% rename from unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing b5928a.ttslua rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing 7c8eef.ttslua index bc17232b9..b3e5ec0ed 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing 7c8eef.ttslua @@ -1,21 +1,21 @@ -name = 'All or Nothing' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'All or Nothing' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing b5928a.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing 7c8eef.yaml similarity index 86% rename from unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing b5928a.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing 7c8eef.yaml index 73cc0ca28..b1dfc79c7 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing b5928a.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing 7c8eef.yaml @@ -16,14 +16,14 @@ CustomImage: Description: click to set chaos token difficulty DragSelectable: true GMNotes: '' -GUID: b5928a +GUID: 7c8eef Grid: true GridProjection: false Hands: false HideWhenFaceDown: false IgnoreFoW: false Locked: false -LuaScript: !include 'Custom_Tile All or Nothing b5928a.ttslua' +LuaScript: !include 'Custom_Tile All or Nothing 7c8eef.ttslua' LuaScriptState: '' MeasureMovement: false Name: Custom_Tile @@ -32,9 +32,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: -4.15 - posY: 1.58 - posZ: -15.17 + posX: 14.81 + posY: 3.33 + posZ: -37.39 rotX: 359.92 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.ttslua new file mode 100644 index 000000000..5aa27be92 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.ttslua @@ -0,0 +1,503 @@ +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.yaml new file mode 100644 index 000000000..2ef29e0dd --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.yaml @@ -0,0 +1,103 @@ +AttachedDecals: +- CustomDecal: + ImageURL: http://cloud-3.steamusercontent.com/ugc/959719855119695911/931B9829687A20F4DEADB36DA57B7E6D76792231/ + Name: dunwich_back + Size: 7.4 + Transform: + posX: -0.0021877822 + posY: -0.08963572 + posZ: -0.00288731651 + rotX: 270.0 + rotY: 359.869568 + rotZ: 0.0 + scaleX: 2.00000215 + scaleY: 2.00000238 + scaleZ: 2.00000262 +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 25f3c2.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 30ed35.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory b5637e.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 88e9a0.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 3b4478.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory ef5528.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 00d19a.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 06d6fe.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card Miskatonic University 0678e8.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card Northside 73f813.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card Downtown 2a3c87.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card Town Hall c5f67a.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card Curiositie Shoppe f61f6c.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card Rivertown 377b20.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card Easttown 927692.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card Velma''s Diner 007d36.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 428e26.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card Elspeth Baudin 88a71f.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 061a07.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 3d7245.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 5789a0.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 7234af.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile adebd8.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 07f90c.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 99909c.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 34e74c.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Deck Encounter Deck b8619a.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card Hyperborean Blood a00323.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card A Walk Down Memory Lane 165dac.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Card Scenario 847357.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.yaml' +- !include 'Custom_Model_Bag Bad Blood cc7eb3/Custom_PDF Bad Blood Campaign Guide + d0aa0f.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1655599785039299268/52DB5C3A0E600D6AECB0B851ECF90C5B3D016421/ + MaterialIndex: 3 + MeshURL: https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj + NormalURL: '' + TypeIndex: 6 +Description: Challenge Scenario +DragSelectable: true +GMNotes: '' +GUID: cc7eb3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag Bad Blood cc7eb3.ttslua' +LuaScriptState: '{"ml":{"007d36":{"lock":false,"pos":{"x":-36.7731895446777,"y":1.64407479763031,"z":-7.70001554489136},"rot":{"x":359.920104980469,"y":269.999328613281,"z":0.0168409943580627}},"00d19a":{"lock":false,"pos":{"x":-38.7164535522461,"y":1.68264377117157,"z":-9.52374649047852},"rot":{"x":359.920104980469,"y":270.002807617188,"z":0.0168448258191347}},"061a07":{"lock":false,"pos":{"x":-20.4535999298096,"y":1.60994374752045,"z":-0.111300319433212},"rot":{"x":0.0798908993601799,"y":89.9882278442383,"z":359.983123779297}},"0678e8":{"lock":false,"pos":{"x":-23.6764717102051,"y":1.63030004501343,"z":7.56998538970947},"rot":{"x":359.920104980469,"y":269.999389648438,"z":0.0168406069278717}},"06d6fe":{"lock":false,"pos":{"x":-25.4280700683594,"y":1.68353700637817,"z":5.99185943603516},"rot":{"x":359.922698974609,"y":269.999755859375,"z":1.47544634342194}},"07f90c":{"lock":false,"pos":{"x":-27.1247005462646,"y":1.6170357465744,"z":-7.63210105895996},"rot":{"x":359.920104980469,"y":270.008087158203,"z":0.0168558973819017}},"165dac":{"lock":false,"pos":{"x":-2.68851804733276,"y":1.59734869003296,"z":-5.04851770401001},"rot":{"x":0.0168365500867367,"y":179.999603271484,"z":0.0802549868822098}},"25f3c2":{"lock":false,"pos":{"x":-18.6359195709229,"y":1.67094278335571,"z":-1.67357134819031},"rot":{"x":359.919982910156,"y":269.996643066406,"z":1.39543783664703}},"2a3c87":{"lock":false,"pos":{"x":-23.6765213012695,"y":1.62581241130829,"z":-7.70001459121704},"rot":{"x":359.920104980469,"y":269.999328613281,"z":0.0168407671153545}},"30ed35":{"lock":false,"pos":{"x":-18.5939636230469,"y":1.66943037509918,"z":-9.29181957244873},"rot":{"x":359.921173095703,"y":269.976348876953,"z":1.46869027614594}},"34e74c":{"lock":false,"pos":{"x":-33.5060005187988,"y":1.62598347663879,"z":-7.46410274505615},"rot":{"x":359.920104980469,"y":270.002014160156,"z":0.0168642066419125}},"377b20":{"lock":false,"pos":{"x":-30.2241649627686,"y":1.6371967792511,"z":-0.0300150476396084},"rot":{"x":359.920104980469,"y":269.999450683594,"z":0.0168403703719378}},"3b4478":{"lock":false,"pos":{"x":-32.1027717590332,"y":1.68981921672821,"z":-1.61117219924927},"rot":{"x":1.05327343940735,"y":269.993774414063,"z":0.784092843532562}},"3d7245":{"lock":false,"pos":{"x":-20.472448348999,"y":1.60774183273315,"z":-7.69286489486694},"rot":{"x":0.0798909068107605,"y":89.9881896972656,"z":359.983123779297}},"428e26":{"lock":false,"pos":{"x":-12.8403749465942,"y":1.65113496780396,"z":6.03833913803101},"rot":{"x":359.920104980469,"y":269.981506347656,"z":0.0168634727597237}},"510265":{"lock":false,"pos":{"x":-3.38745307922363,"y":1.58178853988647,"z":-15.034649848938},"rot":{"x":359.919738769531,"y":270.001312255859,"z":0.0168359484523535}},"5789a0":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.6133451461792,"z":-3.82999897003174},"rot":{"x":359.983184814453,"y":0.0180035475641489,"z":359.920043945313}},"7234af":{"lock":false,"pos":{"x":-23.6765003204346,"y":1.6156051158905,"z":3.86000037193298},"rot":{"x":359.983184814453,"y":0.0184735096991062,"z":359.920043945313}},"73f813":{"lock":false,"pos":{"x":-23.6764583587646,"y":1.6280665397644,"z":-0.0300134774297476},"rot":{"x":359.920104980469,"y":269.997406005859,"z":0.0168432109057903}},"847357":{"lock":false,"pos":{"x":-3.95591735839844,"y":1.59753930568695,"z":-10.4411735534668},"rot":{"x":359.919738769531,"y":269.999694824219,"z":0.0168375447392464}},"88a71f":{"lock":false,"pos":{"x":-15.3431625366211,"y":1.61713230609894,"z":2.30415105819702},"rot":{"x":359.920104980469,"y":269.991577148438,"z":0.0168513152748346}},"88e9a0":{"lock":false,"pos":{"x":-25.3403053283691,"y":1.68284678459167,"z":-1.50465857982636},"rot":{"x":359.922943115234,"y":269.98291015625,"z":1.63856101036072}},"927692":{"lock":false,"pos":{"x":-30.224235534668,"y":1.63494277000427,"z":-7.70001649856567},"rot":{"x":359.920104980469,"y":269.999450683594,"z":0.0168404299765825}},"99909c":{"lock":false,"pos":{"x":-30.2242984771729,"y":1.62247550487518,"z":-3.82999992370605},"rot":{"x":359.983184814453,"y":0.0181040540337563,"z":359.920043945313}},"9c1b91":{"lock":false,"pos":{"x":-11.84925365448,"y":1.4153037071228,"z":8.0305700302124},"rot":{"x":359.983154296875,"y":5.82942702749278E-05,"z":359.920043945313}},"a00323":{"lock":false,"pos":{"x":-2.72483348846436,"y":1.59899258613586,"z":0.372691959142685},"rot":{"x":0.0168312788009644,"y":180.003341674805,"z":0.0802560299634933}},"adebd8":{"lock":false,"pos":{"x":-27.4881000518799,"y":1.62100207805634,"z":4.13960027694702},"rot":{"x":359.955383300781,"y":225.012222290039,"z":0.0683689713478088}},"b5637e":{"lock":false,"pos":{"x":-25.1550369262695,"y":1.67983627319336,"z":-9.20204162597656},"rot":{"x":359.921356201172,"y":270.007080078125,"z":1.59127795696259}},"b8619a":{"lock":false,"pos":{"x":-3.9276659488678,"y":1.75400519371033,"z":5.75231170654297},"rot":{"x":359.919738769531,"y":269.999328613281,"z":180.016815185547}},"c5f67a":{"lock":false,"pos":{"x":-17.1200084686279,"y":1.61666977405548,"z":-7.70001411437988},"rot":{"x":359.920104980469,"y":269.999176025391,"z":0.0168416071683168}},"d0aa0f":{"lock":false,"pos":{"x":-1.46558129787445,"y":1.47562265396118,"z":-26.9304294586182},"rot":{"x":359.920135498047,"y":269.998718261719,"z":0.0168742313981056}},"ef5528":{"lock":false,"pos":{"x":-31.8565654754639,"y":1.68725693225861,"z":-9.34178924560547},"rot":{"x":359.925323486328,"y":269.992340087891,"z":1.40744805335999}},"f61f6c":{"lock":false,"pos":{"x":-17.1199321746826,"y":1.61892378330231,"z":-0.0300151035189629},"rot":{"x":359.920104980469,"y":269.999389648438,"z":0.0168404094874859}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Bad Blood +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 12.25 + posY: 1.47 + posZ: 27.99 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 2.21 + scaleY: 0.46 + scaleZ: 2.42 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91.yaml new file mode 100644 index 000000000..9be9e117e --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91.yaml @@ -0,0 +1,41 @@ +Autoraise: true +ColorDiffuse: + b: 0.0 + g: 0.366520882 + r: 0.7058823 +ContainedObjects: +- !include 'Bag Threads of Fate Locations 9c1b91/Card Missing Persons 9bec2d.yaml' +- !include 'Bag Threads of Fate Locations 9c1b91/Card At the Station f286ef.yaml' +- !include 'Bag Threads of Fate Locations 9c1b91/Card The Relic is Missing! b5a536.yaml' +- !include 'Bag Threads of Fate Locations 9c1b91/Card Trial of the Huntress 5611a1.yaml' +Description: Choose one randomly. Be sure to place the Memory as well! +DragSelectable: true +GMNotes: '' +GUID: 9c1b91 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Bag +Nickname: Threads of Fate Locations +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -11.85 + posY: 1.42 + posZ: 8.03 + rotX: 359.98 + rotY: 0.0 + rotZ: 359.92 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card At the Station f286ef.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card At the Station f286ef.yaml new file mode 100644 index 000000000..157063796 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card At the Station f286ef.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 234525 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2345': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1467561769777204414/069B45DA5FC54E05F7D416CA87A45E9FF478C840/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777202805/81C13FF317351E1956828A006E42B5F958402706/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Act 2c +DragSelectable: true +GMNotes: '' +GUID: f286ef +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: At the Station +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -5.02 + posY: 3.65 + posZ: 14.96 + rotX: 1.35 + rotY: 269.95 + rotZ: 176.63 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card Missing Persons 9bec2d.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card Missing Persons 9bec2d.yaml new file mode 100644 index 000000000..c340d500a --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card Missing Persons 9bec2d.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 234523 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2345': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1467561769777204414/069B45DA5FC54E05F7D416CA87A45E9FF478C840/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777202805/81C13FF317351E1956828A006E42B5F958402706/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Act 1c +DragSelectable: true +GMNotes: '' +GUID: 9bec2d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Missing Persons +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -4.88 + posY: 3.65 + posZ: 14.08 + rotX: 0.81 + rotY: 270.04 + rotZ: 183.78 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card The Relic is Missing! b5a536.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card The Relic is Missing! b5a536.yaml new file mode 100644 index 000000000..afc0ab907 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card The Relic is Missing! b5a536.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 234514 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2345': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1467561769777204414/069B45DA5FC54E05F7D416CA87A45E9FF478C840/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777202805/81C13FF317351E1956828A006E42B5F958402706/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Act 1a +DragSelectable: true +GMNotes: '' +GUID: b5a536 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Relic is Missing! +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -4.39 + posY: 3.67 + posZ: 14.66 + rotX: 358.3 + rotY: 270.03 + rotZ: 178.64 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card Trial of the Huntress 5611a1.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card Trial of the Huntress 5611a1.yaml new file mode 100644 index 000000000..a4677cce3 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Bag Threads of Fate Locations 9c1b91/Card Trial of the Huntress 5611a1.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 234530 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2345': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1467561769777204414/069B45DA5FC54E05F7D416CA87A45E9FF478C840/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777202805/81C13FF317351E1956828A006E42B5F958402706/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Act 1e +DragSelectable: true +GMNotes: '' +GUID: 5611a1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Trial of the Huntress +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -4.75 + posY: 3.66 + posZ: 14.17 + rotX: 0.31 + rotY: 270.01 + rotZ: 183.58 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card A Walk Down Memory Lane 165dac.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card A Walk Down Memory Lane 165dac.yaml new file mode 100644 index 000000000..5096a774c --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card A Walk Down Memory Lane 165dac.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266302 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true +Description: Act 1 +DragSelectable: true +GMNotes: '' +GUID: 165dac +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: A Walk Down Memory Lane +SidewaysCard: true +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -2.69 + posY: 1.6 + posZ: -5.05 + rotX: 0.02 + rotY: 180.0 + rotZ: 0.08 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Curiositie Shoppe f61f6c.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Curiositie Shoppe f61f6c.yaml new file mode 100644 index 000000000..d7e6efb9a --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Curiositie Shoppe f61f6c.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235506 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2355': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1467561769777261683/0D1AA3DD1777795A7A85C5891B15A2EC85BEDBD3/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777261131/3E6F9DF9591B05CCE2257F910B261776662220BF/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Arkham. +DragSelectable: true +GMNotes: '' +GUID: f61f6c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Curiositie Shoppe +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 1.62 + posZ: -0.03 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Downtown 2a3c87.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Downtown 2a3c87.yaml new file mode 100644 index 000000000..6b59e7801 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Downtown 2a3c87.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232311 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2323': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/775106514377430450/FDA37585F019D453CF383D975CF1AB631ECF64B7/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377431393/4752E394498B81694A370AA6BB05BC5A4E55FD30/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Arkham. +DragSelectable: true +GMNotes: '' +GUID: 2a3c87 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Downtown +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -23.68 + posY: 1.63 + posZ: -7.7 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Easttown 927692.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Easttown 927692.yaml new file mode 100644 index 000000000..08d401415 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Easttown 927692.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232313 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2323': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/775106514377430450/FDA37585F019D453CF383D975CF1AB631ECF64B7/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377431393/4752E394498B81694A370AA6BB05BC5A4E55FD30/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Arkham. +DragSelectable: true +GMNotes: '' +GUID: '927692' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Easttown +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -30.22 + posY: 1.63 + posZ: -7.7 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Elspeth Baudin 88a71f.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Elspeth Baudin 88a71f.yaml new file mode 100644 index 000000000..86e48e163 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Elspeth Baudin 88a71f.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266403 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2664': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true +Description: Hyperborean Sorceress +DragSelectable: true +GMNotes: '' +GUID: 88a71f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Elspeth Baudin +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -15.34 + posY: 1.62 + posZ: 2.3 + rotX: 359.92 + rotY: 269.99 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Hyperborean Blood a00323.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Hyperborean Blood a00323.yaml new file mode 100644 index 000000000..166da0fd8 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Hyperborean Blood a00323.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266301 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2663': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true +Description: Agenda 1 +DragSelectable: true +GMNotes: '' +GUID: a00323 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hyperborean Blood +SidewaysCard: true +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -2.72 + posY: 1.6 + posZ: 0.37 + rotX: 0.02 + rotY: 180.0 + rotZ: 0.08 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Miskatonic University 0678e8.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Miskatonic University 0678e8.yaml new file mode 100644 index 000000000..8d794ca00 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Miskatonic University 0678e8.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232310 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2323': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/775106514377430450/FDA37585F019D453CF383D975CF1AB631ECF64B7/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377431393/4752E394498B81694A370AA6BB05BC5A4E55FD30/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Arkham. +DragSelectable: true +GMNotes: '' +GUID: 0678e8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Miskatonic University +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -23.68 + posY: 1.63 + posZ: 7.57 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Northside 73f813.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Northside 73f813.yaml new file mode 100644 index 000000000..f8ff84699 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Northside 73f813.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232315 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2323': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/775106514377430450/FDA37585F019D453CF383D975CF1AB631ECF64B7/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377431393/4752E394498B81694A370AA6BB05BC5A4E55FD30/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Arkham. +DragSelectable: true +GMNotes: '' +GUID: 73f813 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Northside +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -23.68 + posY: 1.63 + posZ: -0.03 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Rivertown 377b20.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Rivertown 377b20.yaml new file mode 100644 index 000000000..390c6ee44 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Rivertown 377b20.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 232306 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2323': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/775106514377430450/FDA37585F019D453CF383D975CF1AB631ECF64B7/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377431393/4752E394498B81694A370AA6BB05BC5A4E55FD30/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Arkham. Central. +DragSelectable: true +GMNotes: '' +GUID: 377b20 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rivertown +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -30.22 + posY: 1.64 + posZ: -0.03 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Scenario 847357.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Scenario 847357.yaml new file mode 100644 index 000000000..434c214f8 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Scenario 847357.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 266400 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2664': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868958/4F366892FB57AF3841513790E41E15D85E9DC211/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038868372/5C2FC3F391C6D3B287C38B875F83629110163282/ + NumHeight: 2 + NumWidth: 4 + Type: 0 + UniqueBack: true +Description: Bad Blood +DragSelectable: true +GMNotes: '' +GUID: '847357' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scenario +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -3.96 + posY: 1.6 + posZ: -10.44 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Town Hall c5f67a.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Town Hall c5f67a.yaml new file mode 100644 index 000000000..128b74bf1 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Town Hall c5f67a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235507 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2355': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1467561769777261683/0D1AA3DD1777795A7A85C5891B15A2EC85BEDBD3/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777261131/3E6F9DF9591B05CCE2257F910B261776662220BF/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Arkham. +DragSelectable: true +GMNotes: '' +GUID: c5f67a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Town Hall +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 1.62 + posZ: -7.7 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Velma's Diner 007d36.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Velma's Diner 007d36.yaml new file mode 100644 index 000000000..adf192921 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Card Velma's Diner 007d36.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 235505 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2355': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1467561769777261683/0D1AA3DD1777795A7A85C5891B15A2EC85BEDBD3/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777261131/3E6F9DF9591B05CCE2257F910B261776662220BF/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: true +Description: Arkham. +DragSelectable: true +GMNotes: '' +GUID: 007d36 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Velma's Diner +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -36.77 + posY: 1.64 + posZ: -7.7 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_PDF Bad Blood Campaign Guide d0aa0f.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_PDF Bad Blood Campaign Guide d0aa0f.yaml new file mode 100644 index 000000000..bc132f279 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_PDF Bad Blood Campaign Guide d0aa0f.yaml @@ -0,0 +1,39 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomPDF: + PDFPage: 0 + PDFPageOffset: 0 + PDFPassword: '' + PDFUrl: http://cloud-3.steamusercontent.com/ugc/1655599785039320278/56CF5330DFBEE30583ACECC20CD61F95AEF29F6E/ +Description: '' +DragSelectable: true +GMNotes: '' +GUID: d0aa0f +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_PDF +Nickname: Bad Blood Campaign Guide +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -1.47 + posY: 1.48 + posZ: -26.93 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 2.48 + scaleY: 1.0 + scaleZ: 2.48 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 061a07.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 061a07.yaml new file mode 100644 index 000000000..6f57690db --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 061a07.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 061a07 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -20.45 + posY: 1.61 + posZ: -0.11 + rotX: 0.08 + rotY: 89.99 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 07f90c.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 07f90c.yaml new file mode 100644 index 000000000..d81e6927e --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 07f90c.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 07f90c +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -27.12 + posY: 1.62 + posZ: -7.63 + rotX: 359.92 + rotY: 270.01 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 34e74c.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 34e74c.yaml new file mode 100644 index 000000000..bbcb7697d --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 34e74c.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 34e74c +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -33.51 + posY: 1.63 + posZ: -7.46 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 3d7245.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 3d7245.yaml new file mode 100644 index 000000000..ab401376d --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 3d7245.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3d7245 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -20.47 + posY: 1.61 + posZ: -7.69 + rotX: 0.08 + rotY: 89.99 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 5789a0.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 5789a0.yaml new file mode 100644 index 000000000..4274aa55d --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 5789a0.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5789a0 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -23.68 + posY: 1.61 + posZ: -3.83 + rotX: 359.98 + rotY: 0.02 + rotZ: 359.92 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 7234af.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 7234af.yaml new file mode 100644 index 000000000..20b12f7cc --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 7234af.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7234af +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -23.68 + posY: 1.62 + posZ: 3.86 + rotX: 359.98 + rotY: 0.02 + rotZ: 359.92 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 99909c.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 99909c.yaml new file mode 100644 index 000000000..a43e9331c --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile 99909c.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 99909c +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -30.22 + posY: 1.62 + posZ: -3.83 + rotX: 359.98 + rotY: 0.02 + rotZ: 359.92 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile adebd8.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile adebd8.yaml new file mode 100644 index 000000000..5330b1c14 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile adebd8.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: adebd8 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -27.49 + posY: 1.62 + posZ: 4.14 + rotX: 359.96 + rotY: 225.01 + rotZ: 0.07 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.ttslua new file mode 100644 index 000000000..fea3e078a --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.ttslua @@ -0,0 +1,21 @@ +name = 'Bad Blood' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.yaml new file mode 100644 index 000000000..6155d18c9 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/EcbhVuh.jpg/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/965354846165100486/3DC8FCEF364B30758B09EF96AF9458F2B8E64D56/ + WidthScale: 0.0 +Description: click to set chaos token difficulty +DragSelectable: true +GMNotes: '' +GUID: '510265' +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Tile Bad Blood 510265.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Bad Blood +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -3.39 + posY: 1.58 + posZ: -15.03 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 2.2 + scaleY: 1.0 + scaleZ: 2.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 00d19a.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 00d19a.yaml new file mode 100644 index 000000000..e12983f5e --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 00d19a.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomToken: + MergeDistancePixels: 5.0 + Stackable: true + StandUp: false + Thickness: 0.1 + ImageScalar: 1.0 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/j5v5E3j.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 00d19a +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Token +Nickname: Memory +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -38.72 + posY: 1.68 + posZ: -9.52 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 0.33 + scaleY: 1.0 + scaleZ: 0.33 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 06d6fe.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 06d6fe.yaml new file mode 100644 index 000000000..f4bdbf565 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 06d6fe.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomToken: + MergeDistancePixels: 5.0 + Stackable: true + StandUp: false + Thickness: 0.1 + ImageScalar: 1.0 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/j5v5E3j.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 06d6fe +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Token +Nickname: Memory +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -25.43 + posY: 1.68 + posZ: 5.99 + rotX: 359.92 + rotY: 270.0 + rotZ: 1.48 + scaleX: 0.33 + scaleY: 1.0 + scaleZ: 0.33 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 25f3c2.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 25f3c2.yaml new file mode 100644 index 000000000..56e7c6502 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 25f3c2.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomToken: + MergeDistancePixels: 5.0 + Stackable: true + StandUp: false + Thickness: 0.1 + ImageScalar: 1.0 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/j5v5E3j.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 25f3c2 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Token +Nickname: Memory +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -18.64 + posY: 1.67 + posZ: -1.67 + rotX: 359.92 + rotY: 270.0 + rotZ: 1.4 + scaleX: 0.33 + scaleY: 1.0 + scaleZ: 0.33 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 30ed35.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 30ed35.yaml new file mode 100644 index 000000000..832e107c9 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 30ed35.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomToken: + MergeDistancePixels: 5.0 + Stackable: true + StandUp: false + Thickness: 0.1 + ImageScalar: 1.0 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/j5v5E3j.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 30ed35 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Token +Nickname: Memory +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -18.59 + posY: 1.67 + posZ: -9.29 + rotX: 359.92 + rotY: 269.98 + rotZ: 1.47 + scaleX: 0.33 + scaleY: 1.0 + scaleZ: 0.33 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 3b4478.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 3b4478.yaml new file mode 100644 index 000000000..39ca3401e --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 3b4478.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomToken: + MergeDistancePixels: 5.0 + Stackable: true + StandUp: false + Thickness: 0.1 + ImageScalar: 1.0 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/j5v5E3j.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3b4478 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Token +Nickname: Memory +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -32.1 + posY: 1.69 + posZ: -1.61 + rotX: 1.05 + rotY: 269.99 + rotZ: 0.78 + scaleX: 0.33 + scaleY: 1.0 + scaleZ: 0.33 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 428e26.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 428e26.yaml new file mode 100644 index 000000000..71ea72f01 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 428e26.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomToken: + MergeDistancePixels: 5.0 + Stackable: true + StandUp: false + Thickness: 0.1 + ImageScalar: 1.0 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/j5v5E3j.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 428e26 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Token +Nickname: Memory +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -12.84 + posY: 1.65 + posZ: 6.04 + rotX: 359.92 + rotY: 269.98 + rotZ: 0.02 + scaleX: 0.33 + scaleY: 1.0 + scaleZ: 0.33 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 88e9a0.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 88e9a0.yaml new file mode 100644 index 000000000..a201fa4e9 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory 88e9a0.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomToken: + MergeDistancePixels: 5.0 + Stackable: true + StandUp: false + Thickness: 0.1 + ImageScalar: 1.0 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/j5v5E3j.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 88e9a0 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Token +Nickname: Memory +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -25.34 + posY: 1.68 + posZ: -1.5 + rotX: 359.92 + rotY: 269.98 + rotZ: 1.64 + scaleX: 0.33 + scaleY: 1.0 + scaleZ: 0.33 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory b5637e.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory b5637e.yaml new file mode 100644 index 000000000..98fc9e36e --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory b5637e.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomToken: + MergeDistancePixels: 5.0 + Stackable: true + StandUp: false + Thickness: 0.1 + ImageScalar: 1.0 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/j5v5E3j.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b5637e +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Token +Nickname: Memory +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -25.16 + posY: 1.68 + posZ: -9.2 + rotX: 359.92 + rotY: 270.01 + rotZ: 1.59 + scaleX: 0.33 + scaleY: 1.0 + scaleZ: 0.33 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory ef5528.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory ef5528.yaml new file mode 100644 index 000000000..f4248d3a3 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Token Memory ef5528.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomToken: + MergeDistancePixels: 5.0 + Stackable: true + StandUp: false + Thickness: 0.1 + ImageScalar: 1.0 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/j5v5E3j.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ef5528 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Token +Nickname: Memory +Snap: false +Sticky: true +Tooltip: true +Transform: + posX: -31.86 + posY: 1.69 + posZ: -9.34 + rotX: 359.93 + rotY: 269.99 + rotZ: 1.41 + scaleX: 0.33 + scaleY: 1.0 + scaleZ: 0.33 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Deck Encounter Deck b8619a.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Deck Encounter Deck b8619a.yaml new file mode 100644 index 000000000..c593969c6 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Deck Encounter Deck b8619a.yaml @@ -0,0 +1,1434 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 540022 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 4911f2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Acolyte + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.81347585 + posY: 1.9591794 + posZ: 7.54692268 + rotX: 359.921844 + rotY: 270.016785 + rotZ: 354.928131 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540022 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 50fdc5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Acolyte + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.692011 + posY: 1.60273135 + posZ: 8.485747 + rotX: 359.919739 + rotY: 269.999725 + rotZ: 0.0168374088 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540022 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: fe7dc4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Acolyte + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.721113 + posY: 1.9771179 + posZ: 7.768363 + rotX: 359.925018 + rotY: 270.040161 + rotZ: 347.514374 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540023 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: d36612 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Wizard of the Order + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.75028348 + posY: 1.951267 + posZ: 7.71792936 + rotX: 359.921661 + rotY: 270.020752 + rotZ: 354.2487 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540024 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: b347d1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Mysterious Chanting + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.94618416 + posY: 1.953377 + posZ: 7.69395733 + rotX: 359.912018 + rotY: 270.018982 + rotZ: 349.788147 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540024 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: d63054 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Mysterious Chanting + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -4.24932432 + posY: 1.66881728 + posZ: 8.263629 + rotX: 359.9325 + rotY: 270.000061 + rotZ: 0.01416134 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235737 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 22c580 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Brotherhood Cultist + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.76474047 + posY: 1.9198736 + posZ: 8.129835 + rotX: 359.931915 + rotY: 270.0081 + rotZ: 0.0139253112 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235737 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 91e14a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Brotherhood Cultist + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -4.017778 + posY: 1.67813826 + posZ: 8.046427 + rotX: 359.9325 + rotY: 270.000061 + rotZ: 0.0141649367 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235738 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: 1098b0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Shadowed + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.82979 + posY: 1.949933 + posZ: 7.91377974 + rotX: 359.921967 + rotY: 270.008331 + rotZ: 352.220245 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235738 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: 4fa0c8 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Shadowed + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.71302724 + posY: 1.87033641 + posZ: 8.101307 + rotX: 359.933075 + rotY: 270.0062 + rotZ: 0.0139921233 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235739 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: fdde51 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Words of Power + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.82536817 + posY: 1.83938766 + posZ: 7.98849154 + rotX: 359.924072 + rotY: 270.0373 + rotZ: 0.004405579 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235739 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: ceedf6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Words of Power + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.70038152 + posY: 1.64391077 + posZ: 8.598213 + rotX: 359.918152 + rotY: 269.9886 + rotZ: 0.006366 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235745 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: 0ea7bf + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Secret Must Be Kept + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.91468573 + posY: 1.68739378 + posZ: 8.209216 + rotX: 359.9379 + rotY: 269.999817 + rotZ: 0.013712924 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235745 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: 4ca580 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Secret Must Be Kept + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.58888483 + posY: 1.90102494 + posZ: 8.293257 + rotX: 359.933 + rotY: 270.007843 + rotZ: 0.0132258115 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235745 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: f08d50 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Secret Must Be Kept + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.65069246 + posY: 1.933011 + posZ: 7.807292 + rotX: 359.940735 + rotY: 270.0078 + rotZ: 359.7926 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235746 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Mystery. + DragSelectable: true + GMNotes: '' + GUID: 75701a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Nobody's Home + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.65590787 + posY: 1.87445772 + posZ: 8.31758 + rotX: 359.922882 + rotY: 270.0243 + rotZ: 359.296661 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235746 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Mystery. + DragSelectable: true + GMNotes: '' + GUID: 034938 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Nobody's Home + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.66667247 + posY: 1.89448893 + posZ: 8.150047 + rotX: 359.932831 + rotY: 270.008667 + rotZ: 0.0135375727 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235747 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: c404e5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Conspiracy of Blood + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.86671424 + posY: 1.95012772 + posZ: 7.81499147 + rotX: 359.920715 + rotY: 270.0092 + rotZ: 353.114441 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 235747 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: a0b528 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Conspiracy of Blood + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.56604123 + posY: 1.87954748 + posZ: 8.246014 + rotX: 359.933441 + rotY: 270.0069 + rotZ: 0.0131155262 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540027 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Obstacle. + DragSelectable: true + GMNotes: '' + GUID: 4904d0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Locked Door + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.69824243 + posY: 1.94563758 + posZ: 7.878649 + rotX: 359.9204 + rotY: 270.0036 + rotZ: 353.799927 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540027 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Obstacle. + DragSelectable: true + GMNotes: '' + GUID: ab3719 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Locked Door + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.84611368 + posY: 1.97954619 + posZ: 7.74542046 + rotX: 359.9212 + rotY: 270.061249 + rotZ: 346.838531 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540004 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 2ceae2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: False Lead + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.90559626 + posY: 1.96752775 + posZ: 7.736604 + rotX: 359.919647 + rotY: 269.999969 + rotZ: 347.422058 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540004 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 057d5f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: False Lead + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.75155354 + posY: 1.95138371 + posZ: 7.767609 + rotX: 359.909851 + rotY: 270.0116 + rotZ: 349.22937 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540003 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Curse. + DragSelectable: true + GMNotes: '' + GUID: ea8fcf + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunting Shadow + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.58204412 + posY: 1.958341 + posZ: 7.715451 + rotX: 359.9103 + rotY: 269.9996 + rotZ: 349.143341 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540003 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Curse. + DragSelectable: true + GMNotes: '' + GUID: 14bfaf + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunting Shadow + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.82991529 + posY: 1.77385449 + posZ: 8.100135 + rotX: 359.9324 + rotY: 270.003967 + rotZ: 0.0138492258 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540003 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Curse. + DragSelectable: true + GMNotes: '' + GUID: ab3719 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunting Shadow + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.56984735 + posY: 1.936475 + posZ: 8.227361 + rotX: 359.928436 + rotY: 270.010742 + rotZ: 356.442627 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540026 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 1e04da + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: On Wings of Darkness + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.855868 + posY: 1.880945 + posZ: 7.92808056 + rotX: 357.8972 + rotY: 269.903046 + rotZ: 356.962067 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540025 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Monster. Nightgaunt. + DragSelectable: true + GMNotes: '' + GUID: ab3719 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunting Nightgaunt + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.91097 + posY: 1.7838428 + posZ: 8.370731 + rotX: 359.932556 + rotY: 270.0038 + rotZ: 0.0141466158 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540025 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Monster. Nightgaunt. + DragSelectable: true + GMNotes: '' + GUID: b75b70 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunting Nightgaunt + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.73760986 + posY: 1.96592343 + posZ: 7.530754 + rotX: 359.92157 + rotY: 270.004883 + rotZ: 353.1447 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 540026 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 1d0c1c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: On Wings of Darkness + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -3.68641 + posY: 1.94001377 + posZ: 7.75891829 + rotX: 359.9319 + rotY: 270.0099 + rotZ: 358.9296 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2357': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + '5400': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775106514377430057/E4E5A51434CEF23EF5D04A104F352520304AA550/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +DeckIDs: +- 540022 +- 540022 +- 540022 +- 540023 +- 540024 +- 540024 +- 235737 +- 235737 +- 235738 +- 235738 +- 235739 +- 235739 +- 235745 +- 235745 +- 235745 +- 235746 +- 235746 +- 235747 +- 235747 +- 540027 +- 540027 +- 540004 +- 540004 +- 540003 +- 540003 +- 540003 +- 540026 +- 540025 +- 540025 +- 540026 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b8619a +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Encounter Deck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -3.93 + posY: 1.75 + posZ: 5.75 + rotX: 359.92 + rotY: 270.0 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da/Custom_Tile Blood Spilled in Salem 83b781.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da/Custom_Tile Blood Spilled in Salem 83b781.ttslua index 438f92e12..019f2aa3f 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da/Custom_Tile Blood Spilled in Salem 83b781.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da/Custom_Tile Blood Spilled in Salem 83b781.ttslua @@ -1,21 +1,21 @@ -name = 'Blood Spilled in Salem' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Blood Spilled in Salem' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97/Custom_Tile Bridge of Sighs 2d9794.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97/Custom_Tile Bridge of Sighs 2d9794.ttslua index 0eecb494e..aa4315356 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97/Custom_Tile Bridge of Sighs 2d9794.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97/Custom_Tile Bridge of Sighs 2d9794.ttslua @@ -1,21 +1,21 @@ -name = 'Bridge of Sighs' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Bridge of Sighs' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.yaml index 0e5e6ff3b..7aa7fc266 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.yaml @@ -20,7 +20,6 @@ ColorDiffuse: r: 1.0 ContainedObjects: - !include 'Custom_Model_Bag Carnevale of Horrors 23dd51/Deck SetupResolution d5e519.yaml' -- !include 'Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_PDF c1d121.yaml' - !include 'Custom_Model_Bag Carnevale of Horrors 23dd51/Card San Marco Basilica 0368c1.yaml' - !include 'Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile 12d492.yaml' - !include 'Custom_Model_Bag Carnevale of Horrors 23dd51/Card Abbess Allegria Di Biase @@ -42,6 +41,7 @@ ContainedObjects: - !include 'Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile b676d8.yaml' - !include 'Custom_Model_Bag Carnevale of Horrors 23dd51/Deck Masked Carnevale-Goer bb43b8.yaml' +- !include 'Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_PDF c1d121.yaml' - !include 'Custom_Model_Bag Carnevale of Horrors 23dd51/Card Canal-side eb8aad.yaml' - !include 'Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile fde05d.yaml' CustomMesh: diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247.yaml index c5542806c..f7f44741f 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247.yaml @@ -4,8 +4,8 @@ ColorDiffuse: g: 0.00100758043 r: 0.02148666 ContainedObjects: +- !include 'Custom_Model_Bag Set-aside a45247/Deck Masks 77e4d3.yaml' - !include 'Custom_Model_Bag Set-aside a45247/Card Cnidathqua 4d3a26.yaml' -- !include 'Custom_Model_Bag Set-aside a45247/Deck Masks 6fb734.yaml' CustomMesh: CastShadows: true ColliderURL: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247/Card Cnidathqua 4d3a26.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247/Card Cnidathqua 4d3a26.yaml index 5281a7485..db1c5dc49 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247/Card Cnidathqua 4d3a26.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247/Card Cnidathqua 4d3a26.yaml @@ -33,12 +33,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 18.18 - posY: 3.58 - posZ: 7.51 - rotX: 359.93 - rotY: 270.0 - rotZ: 0.02 + posX: 1.7 + posY: 3.66 + posZ: 14.28 + rotX: 359.97 + rotY: 225.0 + rotZ: 0.07 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247/Deck Masks 6fb734.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247/Deck Masks 77e4d3.yaml similarity index 72% rename from unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247/Deck Masks 6fb734.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247/Deck Masks 77e4d3.yaml index bc188e0d9..9c29daca0 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247/Deck Masks 6fb734.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Model_Bag Set-aside a45247/Deck Masks 77e4d3.yaml @@ -5,15 +5,15 @@ ColorDiffuse: r: 0.713235259 ContainedObjects: - Autoraise: true - CardID: 295504 + CardID: 295604 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2955': + '2956': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 @@ -22,7 +22,7 @@ ContainedObjects: Description: '' DragSelectable: true GMNotes: '' - GUID: da4a26 + GUID: d0e108 Grid: true GridProjection: false Hands: true @@ -39,26 +39,26 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 15.41279 - posY: 1.47777224 - posZ: 14.076767 + posX: -5.60287 + posY: 1.51139891 + posZ: 28.7767334 rotX: 359.920135 - rotY: 270.000244 - rotZ: 0.0168701261 + rotY: 269.999969 + rotZ: 0.0168738868 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 295503 + CardID: 295603 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2955': + '2956': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 @@ -67,7 +67,7 @@ ContainedObjects: Description: '' DragSelectable: true GMNotes: '' - GUID: 080d4a + GUID: 7f1927 Grid: true GridProjection: false Hands: true @@ -84,26 +84,26 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 15.2967157 - posY: 1.51236367 - posZ: 14.2456036 - rotX: 359.798584 - rotY: 269.998077 - rotZ: 0.0167140625 + posX: -5.602788 + posY: 1.55401564 + posZ: 28.7766113 + rotX: 359.7756 + rotY: 270.031128 + rotZ: 0.016791949 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 295502 + CardID: 295602 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2955': + '2956': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 @@ -112,7 +112,7 @@ ContainedObjects: Description: '' DragSelectable: true GMNotes: '' - GUID: 0f54e7 + GUID: 6179d5 Grid: true GridProjection: false Hands: true @@ -129,26 +129,26 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 15.1226578 - posY: 1.54342675 - posZ: 14.22733 - rotX: 359.927368 - rotY: 270.000366 - rotZ: 0.00778224925 + posX: -5.602769 + posY: 1.58454418 + posZ: 28.7766075 + rotX: 359.920135 + rotY: 269.999939 + rotZ: 0.0168733746 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 295501 + CardID: 295601 ColorDiffuse: b: 0.713235259 g: 0.713235259 r: 0.713235259 CustomDeck: - '2955': + '2956': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 @@ -157,7 +157,7 @@ ContainedObjects: Description: '' DragSelectable: true GMNotes: '' - GUID: 25000a + GUID: 9c9196 Grid: true GridProjection: false Hands: true @@ -174,34 +174,34 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 15.5464144 - posY: 1.55256391 - posZ: 14.3019056 - rotX: 359.921478 - rotY: 269.999939 - rotZ: 0.0150889354 + posX: -5.602769 + posY: 1.59418106 + posZ: 28.7766075 + rotX: 359.920135 + rotY: 269.9999 + rotZ: 0.0168752987 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' CustomDeck: - '2955': + '2956': BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/254843371583121486/AF36A64D6D25AEB0E50FB36B34AD2A95C2B485BF/ + BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 Type: 0 UniqueBack: false DeckIDs: -- 295504 -- 295503 -- 295502 -- 295501 -Description: Carnevale of Horrors +- 295604 +- 295603 +- 295602 +- 295601 +Description: '' DragSelectable: true GMNotes: '' -GUID: 6fb734 +GUID: 77e4d3 Grid: true GridProjection: false Hands: false @@ -218,12 +218,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 31.86 - posY: 4.22 - posZ: -1.54 - rotX: 359.92 - rotY: 270.0 - rotZ: 0.02 + posX: 1.7 + posY: 3.69 + posZ: 14.28 + rotX: 359.97 + rotY: 225.0 + rotZ: 0.07 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile fde05d.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile fde05d.yaml index 4d7708537..bb4bd887e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile fde05d.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile fde05d.yaml @@ -123,12 +123,12 @@ States: Sticky: true Tooltip: true Transform: - posX: -27.06 - posY: 1.62 - posZ: 7.59 - rotX: 359.92 + posX: 10.89 + posY: 1.93 + posZ: 4.0 + rotX: 359.93 rotY: 270.0 - rotZ: 0.02 + rotZ: 0.01 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile Carnevale of Horrors a5891b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile Carnevale of Horrors a5891b.ttslua index 78c608dc2..6b3e44012 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile Carnevale of Horrors a5891b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile Carnevale of Horrors a5891b.ttslua @@ -1,13 +1,13 @@ -name = 'Carnevale of Horrors' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end +name = 'Carnevale of Horrors' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Deck SetupResolution d5e519.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Deck SetupResolution d5e519.yaml index 88c80a57e..3cba19ea8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Deck SetupResolution d5e519.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Deck SetupResolution d5e519.yaml @@ -356,9 +356,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 17.6 + posX: 12.25 posY: 2.0 - posZ: 30.97 + posZ: 3.99 rotX: 359.92 rotY: 270.0 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.yaml index 4d73ea942..1efb5f575 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.yaml @@ -80,9 +80,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 19.18 - posY: 4.31 - posZ: -26.61 + posX: 19.61 + posY: 3.46 + posZ: -17.47 rotX: 359.98 rotY: 270.0 rotZ: 0.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247.yaml index 96eb3c64f..b0ee67e3a 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247.yaml @@ -8,7 +8,7 @@ ContainedObjects: b7e6a3.yaml' - !include 'Custom_Model_Bag Set-aside a45247/Deck Masks 6fb734.yaml' - !include 'Custom_Model_Bag Set-aside a45247/Deck Spinners in Darkness 912fa4.yaml' -- !include 'Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543.yaml' +- !include 'Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.yaml' CustomMesh: CastShadows: true ColliderURL: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.ttslua new file mode 100644 index 000000000..4d4017455 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.ttslua @@ -0,0 +1,273 @@ +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.yaml new file mode 100644 index 000000000..1e10a07e3 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.yaml @@ -0,0 +1,43 @@ +Autoraise: true +ColorDiffuse: + b: 0.0 + g: 0.0 + r: 0.0 +ContainedObjects: +- !include 'Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha 34d21c.yaml' +- !include 'Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha 6af4f4.yaml' +- !include 'Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha 8b17a1.yaml' +- !include 'Bag Atlach-Nacha 3d83ce/Custom_Tile Atlach-Nacha Helper 8e78c7.yaml' +- !include 'Bag Atlach-Nacha 3d83ce/Card Atlatch-Nacha a2f955.yaml' +- !include 'Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha f4d669.yaml' +Description: Clear the map and click place when instructed to engage Atlach-Nacha +DragSelectable: true +GMNotes: '' +GUID: 3d83ce +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Bag Atlach-Nacha 3d83ce.ttslua' +LuaScriptState: '{"ml":{"34d21c":{"lock":false,"pos":{"x":-20.3836,"y":1.6224,"z":-3.5339},"rot":{"x":359.9201,"y":270.007,"z":0.0168}},"6af4f4":{"lock":false,"pos":{"x":-26.8702,"y":1.6315,"z":-3.3655},"rot":{"x":359.9201,"y":269.99,"z":0.0169}},"8b17a1":{"lock":false,"pos":{"x":-20.3417,"y":1.6244,"z":3.2286},"rot":{"x":359.9201,"y":269.9904,"z":0.0169}},"8e78c7":{"lock":false,"pos":{"x":-20.3494,"y":1.6118,"z":6.7083},"rot":{"x":359.9201,"y":269.9997,"z":0.0168}},"a2f955":{"lock":false,"pos":{"x":-23.6765,"y":1.6281,"z":-0.03},"rot":{"x":359.9201,"y":270.0169,"z":0.0168}},"f4d669":{"lock":false,"pos":{"x":-26.8404,"y":1.6335,"z":3.3455},"rot":{"x":359.9201,"y":270.0083,"z":0.0168}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Bag +Nickname: Atlach-Nacha +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 21.19 + posY: 4.13 + posZ: -28.42 + rotX: 0.0 + rotY: 90.0 + rotZ: 0.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Atlatch-Nacha a2f955.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Atlatch-Nacha a2f955.yaml similarity index 100% rename from unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Atlatch-Nacha a2f955.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Atlatch-Nacha a2f955.yaml diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 34d21c.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha 34d21c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 34d21c.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha 34d21c.yaml diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 6af4f4.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha 6af4f4.yaml similarity index 96% rename from unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 6af4f4.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha 6af4f4.yaml index 84600aa9b..67c745ce9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 6af4f4.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha 6af4f4.yaml @@ -33,9 +33,9 @@ Snap: false Sticky: true Tooltip: true Transform: - posX: -26.82 + posX: -26.87 posY: 1.63 - posZ: -3.76 + posZ: -3.37 rotX: 359.92 rotY: 269.99 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 8b17a1.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha 8b17a1.yaml similarity index 95% rename from unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 8b17a1.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha 8b17a1.yaml index a0dcd585c..b09136bc4 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 8b17a1.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha 8b17a1.yaml @@ -33,13 +33,13 @@ Snap: false Sticky: true Tooltip: true Transform: - posX: -20.33 + posX: -20.34 posY: 1.62 - posZ: 3.86 + posZ: 3.23 rotX: 359.92 rotY: 269.99 rotZ: 0.02 - scaleX: 1.0 + scaleX: 1.01 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha f4d669.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha f4d669.yaml similarity index 96% rename from unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha f4d669.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha f4d669.yaml index 374591fcf..2d23d0da9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha f4d669.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Card Legs of Atlach-Nacha f4d669.yaml @@ -33,9 +33,9 @@ Snap: false Sticky: true Tooltip: true Transform: - posX: -26.87 + posX: -26.84 posY: 1.63 - posZ: 3.83 + posZ: 3.35 rotX: 359.92 rotY: 270.01 rotZ: 0.02 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Custom_Tile Atlach-Nacha Helper 8e78c7.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Custom_Tile Atlach-Nacha Helper 8e78c7.ttslua new file mode 100644 index 000000000..386ffd1eb --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Custom_Tile Atlach-Nacha Helper 8e78c7.ttslua @@ -0,0 +1,79 @@ +ENCOUNTER_DECK_POS = {-3.8, 1, 5.7} +MIN_VALUE = 1 + +function onload() + val = 1 + + self.createButton({ + label="Rotate", + click_function="doRotation", + function_owner=self, + position={0,0.1,-0.4}, + height=120, + width=450, + scale={x=1.75, y=1.75, z=1.75}, + font_size=100 + }) + + self.createButton({ + label=val, + click_function="add_subtract", + function_owner=self, + position={0,0.1,0.4}, + height=120, + width=250, + scale={x=1.75, y=1.75, z=1.75}, + font_size=100 + }) +end + +function add_subtract(_obj, _color, alt_click) + local mod = alt_click and -1 or 1 + new_value = math.max(val + mod, MIN_VALUE) + if val ~= new_value then + val = new_value + self.editButton({ + index = 1, + label = tostring(val) + }) + end +end + +function doRotation(_obj, _color, alt_click) + if IS_ROTATING then return end + + IS_ROTATING = true + local body = getObjectFromGUID("a2f955") + if body == nil then + printToColor("Place Atlach-Nacha first, then try again", _color) + end + + local objs = Physics.cast({ + origin = body.getPosition(), + direction = {0,1,0}, + type = 2, + size = { 6, 6, 6 }, + max_distance = 0 + }) + + local numAttachments = 0 + for i,v in ipairs(objs) do + local obj = v.hit_object + if obj.getGUID() ~= "a2f955" and (obj.tag == "Card" or obj.getName() == "Damage") then + numAttachments = numAttachments + 1 + body.addAttachment(obj) + end + end + + local r = body.getRotation() + body.setRotationSmooth({ r.x, r.y + (45 * val), r.z }, false, true) + + Wait.time(|| detachLegs(body, numAttachments), 1) +end + +function detachLegs(body, numAttachments) + for i = numAttachments-1,0,-1 do + body.removeAttachment(i) + end + Wait.time(function() IS_ROTATING = false end, 1) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Custom_Tile Atlach-Nacha Helper 8e78c7.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Custom_Tile Atlach-Nacha Helper 8e78c7.yaml new file mode 100644 index 000000000..12a31d06a --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce/Custom_Tile Atlach-Nacha Helper 8e78c7.yaml @@ -0,0 +1,46 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 0 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/1696129502531615566/5EEBE5EDB93947E2138C14A354A5669C3682256F/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/1696129502531615566/5EEBE5EDB93947E2138C14A354A5669C3682256F/ + WidthScale: 0.0 +Description: Rotates Atlach-Nacha with her legs, damage tokens, and card attachments + by the number of spaces displayed. Left-click the number to increase, right-click + to decrease, then click Rotate. +DragSelectable: true +GMNotes: '' +GUID: 8e78c7 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Tile Atlach-Nacha Helper 8e78c7.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Atlach-Nacha Helper +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -20.35 + posY: 1.61 + posZ: 6.71 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543.yaml deleted file mode 100644 index a57c85b3d..000000000 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha d14543.yaml +++ /dev/null @@ -1,42 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 0.0 - g: 0.0 - r: 0.0 -ContainedObjects: -- !include 'Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 8b17a1.yaml' -- !include 'Bag Atlach-Nacha d14543/Card Atlatch-Nacha a2f955.yaml' -- !include 'Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 34d21c.yaml' -- !include 'Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha 6af4f4.yaml' -- !include 'Bag Atlach-Nacha d14543/Card Legs of Atlach-Nacha f4d669.yaml' -Description: Clear the map and click place when instructed to engage Atlach-Nacha -DragSelectable: true -GMNotes: '' -GUID: d14543 -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: !include 'Bag Atlach-Nacha d14543.ttslua' -LuaScriptState: '{"ml":{"34d21c":{"lock":false,"pos":{"x":-20.3836,"y":1.6225,"z":-3.5339},"rot":{"x":359.9201,"y":270.0107,"z":0.0169}},"6af4f4":{"lock":false,"pos":{"x":-26.8186,"y":1.6314,"z":-3.7648},"rot":{"x":359.9201,"y":269.9903,"z":0.0169}},"8b17a1":{"lock":false,"pos":{"x":-20.3285,"y":1.6246,"z":3.858},"rot":{"x":359.9201,"y":269.9905,"z":0.0169}},"a2f955":{"lock":false,"pos":{"x":-23.6765,"y":1.6281,"z":-0.03},"rot":{"x":359.9201,"y":270.0157,"z":0.0169}},"f4d669":{"lock":false,"pos":{"x":-26.8665,"y":1.6337,"z":3.8321},"rot":{"x":359.9201,"y":270.0092,"z":0.0169}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Bag -Nickname: Atlach-Nacha -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 20.83 - posY: 3.17 - posZ: -21.79 - rotX: 0.0 - rotY: 90.01 - rotZ: 0.0 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile 4d3553.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile 4d3553.yaml index 9437a98dc..e1d207d33 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile 4d3553.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile 4d3553.yaml @@ -127,7 +127,7 @@ Transform: posY: 1.61 posZ: 3.86 rotX: 359.98 - rotY: 359.98 + rotY: 359.99 rotZ: 359.92 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile Carnevale of Spiders a5891b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile Carnevale of Spiders a5891b.ttslua index 78c608dc2..6b3e44012 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile Carnevale of Spiders a5891b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile Carnevale of Spiders a5891b.ttslua @@ -1,13 +1,13 @@ -name = 'Carnevale of Horrors' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end +name = 'Carnevale of Horrors' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Bag Additional locations d14543.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Bag Additional locations d14543.ttslua index 758efa0e2..f82d90245 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Bag Additional locations d14543.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Bag Additional locations d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Setup", click_function="buttonClick_setup", function_owner=self, ---- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={1,1,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Setup", click_function="buttonClick_setup", function_owner=self, +--- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={1,1,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Custom_Tile Consternation on the Constellation bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Custom_Tile Consternation on the Constellation bbb70a.ttslua index 1b866fa18..9732c81e8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Custom_Tile Consternation on the Constellation bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Custom_Tile Consternation on the Constellation bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'Consternation' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Consternation' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Bag Locations 73e53d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Bag Locations 73e53d.ttslua index be2fd274b..1cfc46617 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Bag Locations 73e53d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Bag Locations 73e53d.ttslua @@ -1,5 +1,5 @@ -function onCollisionEnter(collision_info) - self.shuffle() - self.shuffle() - self.shuffle() -end +function onCollisionEnter(collision_info) + self.shuffle() + self.shuffle() + self.shuffle() +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Custom_Tile Curse of the Rougarou cf0c00.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Custom_Tile Curse of the Rougarou cf0c00.ttslua index 682e30022..8c433dcd4 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Custom_Tile Curse of the Rougarou cf0c00.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Custom_Tile Curse of the Rougarou cf0c00.ttslua @@ -1,13 +1,13 @@ -name = 'Curse of the Rougarou' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end +name = 'Curse of the Rougarou' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Deck Act d47bca.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Deck Act d47bca.yaml index 9606ad43d..da26f8470 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Deck Act d47bca.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Deck Act d47bca.yaml @@ -122,12 +122,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: -2.69 - posY: 1.61 - posZ: -5.05 - rotX: 0.02 - rotY: 180.03 - rotZ: 0.08 + posX: 10.52 + posY: 1.97 + posZ: 12.29 + rotX: 0.01 + rotY: 180.01 + rotZ: 0.07 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model Dark Matter Custom Data Helper a57738.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model Dark Matter Custom Data Helper a57738.ttslua index d42a554fe..eb4a0b421 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model Dark Matter Custom Data Helper a57738.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model Dark Matter Custom Data Helper a57738.ttslua @@ -1,83 +1,83 @@ --- set true to enable debug logging -DEBUG = false - -function log(message) - if DEBUG then - print(message) - end -end - ---[[ -Known locations and clues. We check this to determine if we should -atttempt to spawn clues, first we look for _ and if -we find nothing we look for -format is [location_guid -> clueCount] -]] -LOCATIONS_DATA_JSON = [[ -{ - "Cargo Hold": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Cryosleep Quarters": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Engine Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Escape Pod Bay": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Infirmary": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Mess Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ship's Bridge": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ventilation Shaft": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Cafeteria": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Classroom K2": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Entrance Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Gymnasium": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Biology Lab": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Library": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "School Grounds": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Cold Wastes": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Crystal Peak": {"type": "perPlayer", "value": 3, "clueSide": "front"}, - "Ice Spires": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Main Facility": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Omni-Transmitters": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Q-Crystal Mines": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Airlocks": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Crew Quarters": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Flight Deck": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Hydroponics": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Infirmary_N": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Ship Mainframe": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Telecoms": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "A Hiding Place": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "A Mutiny": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Adrift in Space": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "An Accident": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "City of Cats": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Fever Dream": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Abandoned Lander": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Cyclopean Caverns": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Garden of Delights": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Grand Ballroom": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Spiral Staircase": {"type": "fixed", "value": 1, "clueSide": "back"}, - "The Yellow Throne": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Whisper Labyrinth": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "New Brooklyn": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Hope": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Yuggoth": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Mount Sinai": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Derelict Ship": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Martian Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Olympus Telescope": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Moonbase Laboratory": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Threshold of Yuggoth": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Earth": {"type": "perPlayer", "value": 2, "clueSide": "front"} -} -]] - -LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) - -function onload(save_state) - local playArea = getObjectFromGUID('721ba2') - playArea.call("updateLocations", {self.getGUID()}) -end +-- set true to enable debug logging +DEBUG = false + +function log(message) + if DEBUG then + print(message) + end +end + +--[[ +Known locations and clues. We check this to determine if we should +atttempt to spawn clues, first we look for _ and if +we find nothing we look for +format is [location_guid -> clueCount] +]] +LOCATIONS_DATA_JSON = [[ +{ + "Cargo Hold": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Cryosleep Quarters": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Engine Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Escape Pod Bay": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Infirmary": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Mess Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ship's Bridge": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ventilation Shaft": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Cafeteria": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Classroom K2": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Entrance Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Gymnasium": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Biology Lab": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Library": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "School Grounds": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Cold Wastes": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Crystal Peak": {"type": "perPlayer", "value": 3, "clueSide": "front"}, + "Ice Spires": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Main Facility": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Omni-Transmitters": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Q-Crystal Mines": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Airlocks": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Crew Quarters": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Flight Deck": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Hydroponics": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Infirmary_N": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Ship Mainframe": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Telecoms": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "A Hiding Place": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "A Mutiny": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Adrift in Space": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "An Accident": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "City of Cats": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Fever Dream": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Abandoned Lander": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Cyclopean Caverns": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Garden of Delights": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Grand Ballroom": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Spiral Staircase": {"type": "fixed", "value": 1, "clueSide": "back"}, + "The Yellow Throne": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Whisper Labyrinth": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "New Brooklyn": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Hope": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Yuggoth": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Mount Sinai": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Derelict Ship": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Martian Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Olympus Telescope": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Moonbase Laboratory": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Threshold of Yuggoth": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Earth": {"type": "perPlayer", "value": 2, "clueSide": "front"} +} +]] + +LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) + +function onload(save_state) + local playArea = getObjectFromGUID('721ba2') + playArea.call("updateLocations", {self.getGUID()}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Electric Nightmare 2bd90b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Electric Nightmare 2bd90b.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Electric Nightmare 2bd90b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Electric Nightmare 2bd90b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Fragment of Carcosa a492bc.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Fragment of Carcosa a492bc.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Fragment of Carcosa a492bc.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Fragment of Carcosa a492bc.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag In the Shadow of Earth 8cfe99.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag In the Shadow of Earth 8cfe99.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag In the Shadow of Earth 8cfe99.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag In the Shadow of Earth 8cfe99.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Lost Quantum c29a78.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Lost Quantum c29a78.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Lost Quantum c29a78.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Lost Quantum c29a78.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Starfall e04c21.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Starfall e04c21.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Starfall e04c21.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Starfall e04c21.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Strange Moons 2ebcda.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Strange Moons 2ebcda.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Strange Moons 2ebcda.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Strange Moons 2ebcda.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Machine in Yellow 32039e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Machine in Yellow 32039e.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Machine in Yellow 32039e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Machine in Yellow 32039e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Tatteremalion 51fbbc.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Tatteremalion 51fbbc.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Tatteremalion 51fbbc.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Tatteremalion 51fbbc.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile 0aa185.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile 0aa185.ttslua index 73d04e8c1..2d033f3ff 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile 0aa185.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile 0aa185.ttslua @@ -1,736 +1,736 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First checkbox - { - pos = {0.54,0.11,0.02}, - size = 200, - state = false - }, - --Second checkbox - { - pos = {0.545,0.11,0.07}, - size = 200, - state = false - }, - --Third checkbox - { - pos = {0.553,0.11,0.14}, - size = 200, - state = false - }, - -- Fourth Checkbox - { - pos = {0.505,0.11,0.27}, - size = 200, - state = false - }, - -- Fifth Checkbox - { - pos = {0.715,0.11,0.3}, - size = 200, - state = false - }, - -- Sixth Checkbox - { - pos = {0.54,0.11,0.37}, - size = 200, - state = false - }, - -- Seventh Checkbox - { - pos = {0.575,0.11,0.45}, - size = 200, - state = false - }, - -- Eigth Checkbox - { - pos = {0.675,0.11,0.515}, - size = 200, - state = false - }, - -- Ninth Checkbox - { - pos = {0.64,0.11,0.565}, - size = 200, - state = false - }, - -- Tenth Checkbox - { - pos = {0.428,0.11,0.637}, - size = 200, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.615,0.11,-0.42}, - size = 300, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.47,0.11,-0.42}, - size = 300, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.47,0.11,-0.51}, - size = 300, - value = 0, - hideBG = true - }, - --Slot one Memories - { - pos = {-0.615,0.11,-0.335}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.19,0.11,-0.42}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.045,0.11,-0.42}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.045,0.11,-0.51}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two Memories - { - pos = {-0.19,0.11,-0.335}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {-0.615,0.11,0.132}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {-0.47,0.11,0.132}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {-0.47,0.11,0.042}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three Memories - { - pos = {-0.615,0.11,0.217}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {-0.19,0.11,0.132}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {-0.045,0.11,0.132}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {-0.045,0.11,0.042}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four Memories - { - pos = {-0.74,0.11,0.75}, - size = 600, - value = 0, - hideBG = true - }, - --Impending Doom - { - pos = {-0.19,0.11,0.217}, - size = 300, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.615,0.11,-0.635}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.615,0.11,-0.57}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.615,0.11,-0.21}, - rows = 4, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.19,0.11,-0.635}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.19,0.11,-0.57}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.19,0.1,-0.21}, - rows = 4, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {-0.615,0.11,-0.083}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {-0.615,0.11,-0.017}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {-0.615,0.11,0.34}, - rows = 4, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {-0.19,0.11,-0.083}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {-0.19,0.11,-0.017}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {-0.19,0.11,0.34}, - rows = 4, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Killed Textbox - { - pos = {0.46,0.11,0.85}, - rows = 2, - width = 3000, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {0.44,0.11,-0.44}, - rows = 18, - width = 3200, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First checkbox + { + pos = {0.54,0.11,0.02}, + size = 200, + state = false + }, + --Second checkbox + { + pos = {0.545,0.11,0.07}, + size = 200, + state = false + }, + --Third checkbox + { + pos = {0.553,0.11,0.14}, + size = 200, + state = false + }, + -- Fourth Checkbox + { + pos = {0.505,0.11,0.27}, + size = 200, + state = false + }, + -- Fifth Checkbox + { + pos = {0.715,0.11,0.3}, + size = 200, + state = false + }, + -- Sixth Checkbox + { + pos = {0.54,0.11,0.37}, + size = 200, + state = false + }, + -- Seventh Checkbox + { + pos = {0.575,0.11,0.45}, + size = 200, + state = false + }, + -- Eigth Checkbox + { + pos = {0.675,0.11,0.515}, + size = 200, + state = false + }, + -- Ninth Checkbox + { + pos = {0.64,0.11,0.565}, + size = 200, + state = false + }, + -- Tenth Checkbox + { + pos = {0.428,0.11,0.637}, + size = 200, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.615,0.11,-0.42}, + size = 300, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.47,0.11,-0.42}, + size = 300, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.47,0.11,-0.51}, + size = 300, + value = 0, + hideBG = true + }, + --Slot one Memories + { + pos = {-0.615,0.11,-0.335}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.19,0.11,-0.42}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.045,0.11,-0.42}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.045,0.11,-0.51}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two Memories + { + pos = {-0.19,0.11,-0.335}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {-0.615,0.11,0.132}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {-0.47,0.11,0.132}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {-0.47,0.11,0.042}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three Memories + { + pos = {-0.615,0.11,0.217}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {-0.19,0.11,0.132}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {-0.045,0.11,0.132}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {-0.045,0.11,0.042}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four Memories + { + pos = {-0.74,0.11,0.75}, + size = 600, + value = 0, + hideBG = true + }, + --Impending Doom + { + pos = {-0.19,0.11,0.217}, + size = 300, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.615,0.11,-0.635}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.615,0.11,-0.57}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.615,0.11,-0.21}, + rows = 4, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.19,0.11,-0.635}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.19,0.11,-0.57}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.19,0.1,-0.21}, + rows = 4, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {-0.615,0.11,-0.083}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {-0.615,0.11,-0.017}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {-0.615,0.11,0.34}, + rows = 4, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {-0.19,0.11,-0.083}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {-0.19,0.11,-0.017}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {-0.19,0.11,0.34}, + rows = 4, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Killed Textbox + { + pos = {0.46,0.11,0.85}, + rows = 2, + width = 3000, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {0.44,0.11,-0.44}, + rows = 18, + width = 3200, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile Dark Matter b5928a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile Dark Matter b5928a.ttslua index cb99e61bb..1f739f097 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile Dark Matter b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile Dark Matter b5928a.ttslua @@ -1,21 +1,21 @@ -name = 'Dark Matter' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Dark Matter' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 13bc7d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 13bc7d.ttslua index 895f01f1f..639b2e969 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 13bc7d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 13bc7d.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 66dad0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 66dad0.ttslua index 895f01f1f..639b2e969 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 66dad0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 66dad0.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 794376.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 794376.ttslua index 895f01f1f..639b2e969 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 794376.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 794376.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 99db87.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 99db87.ttslua index 895f01f1f..639b2e969 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 99db87.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 99db87.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612/Custom_Tile Darkness Falls b5928a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612/Custom_Tile Darkness Falls b5928a.ttslua index c8c78d011..67ad5da9e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612/Custom_Tile Darkness Falls b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612/Custom_Tile Darkness Falls b5928a.ttslua @@ -1,21 +1,21 @@ -name = 'Darkness Falls' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Darkness Falls' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e.ttslua index 4cd89ff71..2644aff3f 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e/Custom_Tile Delta Geen Convergence 520889.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e/Custom_Tile Delta Geen Convergence 520889.ttslua index c97f5a60c..77ec0033d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e/Custom_Tile Delta Geen Convergence 520889.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e/Custom_Tile Delta Geen Convergence 520889.ttslua @@ -1,21 +1,21 @@ -name = 'Delta Green' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Delta Green' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Dead by Dawn c29a78.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Dead by Dawn c29a78.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Dead by Dawn c29a78.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Dead by Dawn c29a78.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Late Risers 51fbbc.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Late Risers 51fbbc.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Late Risers 51fbbc.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Late Risers 51fbbc.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Mourning Chorus 24c385.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Mourning Chorus 24c385.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Mourning Chorus 24c385.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Mourning Chorus 24c385.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Night on the Town 2bd90b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Night on the Town 2bd90b.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Night on the Town 2bd90b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Night on the Town 2bd90b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood ac895d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood ac895d.ttslua index 49836c550..40fe71a43 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood ac895d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood ac895d.ttslua @@ -1,21 +1,21 @@ -name = 'Flesh' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Flesh' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood f5db25.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood f5db25.ttslua index 49836c550..40fe71a43 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood f5db25.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood f5db25.ttslua @@ -1,21 +1,21 @@ -name = 'Flesh' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Flesh' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Token Generic Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Token Generic Campaign Log eda22b.ttslua index 588598831..d5fb74c82 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Token Generic Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Token Generic Campaign Log eda22b.ttslua @@ -1,651 +1,651 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.080,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.270,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.000,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.251,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.441,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.171,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {0.579,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {0.389,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {0.659,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {1.407,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {1.217,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {1.487,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.265,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.265,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.265,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.436,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.436,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.436,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {0.394,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {0.394,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {0.394,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {1.222,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {1.222,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {1.222,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.930,0.1,0.930}, - rows = 27, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.820,0.1,0.707}, - rows = 20, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {1.010,0.1,1.700}, - rows = 5, - width = 7400, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.080,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.270,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.000,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.251,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.441,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.171,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {0.579,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {0.389,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {0.659,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {1.407,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {1.217,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {1.487,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.265,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.265,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.265,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.436,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.436,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.436,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {0.394,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {0.394,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {0.394,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {1.222,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {1.222,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {1.222,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.930,0.1,0.930}, + rows = 27, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.820,0.1,0.707}, + rows = 20, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Killed and Insane Investigators + { + pos = {1.010,0.1,1.700}, + rows = 5, + width = 7400, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.yaml index 83538869c..9b2ab0e82 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.yaml @@ -79,8 +79,8 @@ Sticky: true Tooltip: true Transform: posX: 12.25 - posY: 1.94 - posZ: 3.99 + posY: 1.93 + posZ: -12.01 rotX: 359.93 rotY: 270.0 rotZ: 0.01 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard b7af99.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard b7af99.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard b7af99.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard b7af99.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard e19c97.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard e19c97.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard e19c97.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard e19c97.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - EasyStandard afc7b5.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - EasyStandard afc7b5.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - EasyStandard afc7b5.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - EasyStandard afc7b5.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - HardExpert 9ed124.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - HardExpert 9ed124.ttslua index 67da25eae..1c555f04c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - HardExpert 9ed124.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - HardExpert 9ed124.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Tile Guardians of the Abyss 82e1ed.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Tile Guardians of the Abyss 82e1ed.ttslua index c7cae53da..613d25c00 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Tile Guardians of the Abyss 82e1ed.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Tile Guardians of the Abyss 82e1ed.ttslua @@ -1,21 +1,21 @@ -name = 'Guardians of the Abyss' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Guardians of the Abyss' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8/Custom_Tile Happy's Funhouse c5008a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8/Custom_Tile Happy's Funhouse c5008a.ttslua index 8a7490ca8..a6a523bb3 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8/Custom_Tile Happy's Funhouse c5008a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8/Custom_Tile Happy's Funhouse c5008a.ttslua @@ -1,21 +1,21 @@ -name = 'Happys Funhouse' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Happys Funhouse' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b.ttslua index 979aaf560..5534586ac 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 1 Bread and Circuses 16ceab.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 1 Bread and Circuses 16ceab.ttslua index 0748143c2..54d591927 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 1 Bread and Circuses 16ceab.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 1 Bread and Circuses 16ceab.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 2 Enter the Dragon 4f944f.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 2 Enter the Dragon 4f944f.ttslua index 0748143c2..54d591927 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 2 Enter the Dragon 4f944f.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 2 Enter the Dragon 4f944f.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 3 Bon Voyage 49dfb9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 3 Bon Voyage 49dfb9.ttslua index 0748143c2..54d591927 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 3 Bon Voyage 49dfb9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 3 Bon Voyage 49dfb9.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 4 Cost of Azure 0fad66.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 4 Cost of Azure 0fad66.ttslua index 0748143c2..54d591927 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 4 Cost of Azure 0fad66.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 4 Cost of Azure 0fad66.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Tile Bread and Circuses 82e1ed.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Tile Bread and Circuses 82e1ed.ttslua index bd968c218..d47035472 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Tile Bread and Circuses 82e1ed.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Tile Bread and Circuses 82e1ed.ttslua @@ -1,21 +1,21 @@ -name = 'Bread and Circuses' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Bread and Circuses' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c.ttslua index 979aaf560..5534586ac 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c/Custom_Tile The Initiation bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c/Custom_Tile The Initiation bbb70a.ttslua index 4048d1eb0..497ce1745 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c/Custom_Tile The Initiation bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c/Custom_Tile The Initiation bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'The Initiation' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Initiation' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0/Custom_Tile Into the Shadowlands 770021.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0/Custom_Tile Into the Shadowlands 770021.ttslua index 4e75f9bfd..96b1aaa66 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0/Custom_Tile Into the Shadowlands 770021.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0/Custom_Tile Into the Shadowlands 770021.ttslua @@ -1,21 +1,21 @@ -name = 'Into the Shadowlands' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Into the Shadowlands' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 2 Endless Horizons b1bc62.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 2 Endless Horizons b1bc62.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 2 Endless Horizons b1bc62.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 2 Endless Horizons b1bc62.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48/Custom_Tile Jenny's Choice bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48/Custom_Tile Jenny's Choice bbb70a.ttslua index 1182c3163..f1cde3b4e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48/Custom_Tile Jenny's Choice bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48/Custom_Tile Jenny's Choice bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'Jennys Choice' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Jennys Choice' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Investigators fba392.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Investigators fba392.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Investigators fba392.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Investigators fba392.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Izanami's Delegates b34bec.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Izanami's Delegates b34bec.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Izanami's Delegates b34bec.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Izanami's Delegates b34bec.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Player Cards 64ad17.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Player Cards 64ad17.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Player Cards 64ad17.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Player Cards 64ad17.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 1 - Modorimonogatari f051fc.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 1 - Modorimonogatari f051fc.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 1 - Modorimonogatari f051fc.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 1 - Modorimonogatari f051fc.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2A - Toshimonogatari 4076cd.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2A - Toshimonogatari 4076cd.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2A - Toshimonogatari 4076cd.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2A - Toshimonogatari 4076cd.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2B - Inarimonogatari ad56f2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2B - Inarimonogatari ad56f2.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2B - Inarimonogatari ad56f2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2B - Inarimonogatari ad56f2.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Inarimonogatari first, choose this bag 1a6190.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Inarimonogatari first, choose this bag 1a6190.ttslua index 053fbbacb..103cb00e5 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Inarimonogatari first, choose this bag 1a6190.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Inarimonogatari first, choose this bag 1a6190.ttslua @@ -1,547 +1,547 @@ - -- Utility memory bag by Directsun --- Version 2.6.0 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - buttonIndexMap = {} - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Workaround for custom PDFs - if obj.Book then - objPos.y = objPos.y + 0.5 - end - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - buttonIndexMap[obj.getGUID()] = howManyButtons - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - self.createButton({ - label="Selection", click_function="editDragSelection", function_owner=self, - position={0,0.3,2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(obj, move) - local index = buttonIndexMap[obj.getGUID()] - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - -function editDragSelection(bagObj, player, remove) - local selectedObjs = Player[player].getSelectedObjects() - if not remove then - for _, obj in ipairs(selectedObjs) do - local index = buttonIndexMap[obj.getGUID()] - --Ignore if already in the memory list, or does not have a button - if index and not memoryList[obj.getGUID()] then - self.editButton({index=index, color={0,1,0,0.6}}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - end - end - else - for _, obj in ipairs(selectedObjs) do - local index = buttonIndexMap[obj.getGUID()] - if index and memoryList[obj.getGUID()] then - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end - end - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end + -- Utility memory bag by Directsun +-- Version 2.6.0 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + buttonIndexMap = {} + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Workaround for custom PDFs + if obj.Book then + objPos.y = objPos.y + 0.5 + end + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + buttonIndexMap[obj.getGUID()] = howManyButtons + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + self.createButton({ + label="Selection", click_function="editDragSelection", function_owner=self, + position={0,0.3,2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(obj, move) + local index = buttonIndexMap[obj.getGUID()] + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +function editDragSelection(bagObj, player, remove) + local selectedObjs = Player[player].getSelectedObjects() + if not remove then + for _, obj in ipairs(selectedObjs) do + local index = buttonIndexMap[obj.getGUID()] + --Ignore if already in the memory list, or does not have a button + if index and not memoryList[obj.getGUID()] then + self.editButton({index=index, color={0,1,0,0.6}}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + end + end + else + for _, obj in ipairs(selectedObjs) do + local index = buttonIndexMap[obj.getGUID()] + if index and memoryList[obj.getGUID()] then + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end + end + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Toshimonogatari first, choose this bag 91392f.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Toshimonogatari first, choose this bag 91392f.ttslua index 053fbbacb..103cb00e5 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Toshimonogatari first, choose this bag 91392f.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Toshimonogatari first, choose this bag 91392f.ttslua @@ -1,547 +1,547 @@ - -- Utility memory bag by Directsun --- Version 2.6.0 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - buttonIndexMap = {} - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Workaround for custom PDFs - if obj.Book then - objPos.y = objPos.y + 0.5 - end - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - buttonIndexMap[obj.getGUID()] = howManyButtons - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - self.createButton({ - label="Selection", click_function="editDragSelection", function_owner=self, - position={0,0.3,2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(obj, move) - local index = buttonIndexMap[obj.getGUID()] - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - -function editDragSelection(bagObj, player, remove) - local selectedObjs = Player[player].getSelectedObjects() - if not remove then - for _, obj in ipairs(selectedObjs) do - local index = buttonIndexMap[obj.getGUID()] - --Ignore if already in the memory list, or does not have a button - if index and not memoryList[obj.getGUID()] then - self.editButton({index=index, color={0,1,0,0.6}}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - end - end - else - for _, obj in ipairs(selectedObjs) do - local index = buttonIndexMap[obj.getGUID()] - if index and memoryList[obj.getGUID()] then - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end - end - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end + -- Utility memory bag by Directsun +-- Version 2.6.0 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + buttonIndexMap = {} + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Workaround for custom PDFs + if obj.Book then + objPos.y = objPos.y + 0.5 + end + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + buttonIndexMap[obj.getGUID()] = howManyButtons + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + self.createButton({ + label="Selection", click_function="editDragSelection", function_owner=self, + position={0,0.3,2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(obj, move) + local index = buttonIndexMap[obj.getGUID()] + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +function editDragSelection(bagObj, player, remove) + local selectedObjs = Player[player].getSelectedObjects() + if not remove then + for _, obj in ipairs(selectedObjs) do + local index = buttonIndexMap[obj.getGUID()] + --Ignore if already in the memory list, or does not have a button + if index and not memoryList[obj.getGUID()] then + self.editButton({index=index, color={0,1,0,0.6}}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + end + end + else + for _, obj in ipairs(selectedObjs) do + local index = buttonIndexMap[obj.getGUID()] + if index and memoryList[obj.getGUID()] then + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end + end + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 3 - Yamamonogatari b99de3.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 3 - Yamamonogatari b99de3.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 3 - Yamamonogatari b99de3.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 3 - Yamamonogatari b99de3.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 4 - Houkaimonogatari 8f297e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 4 - Houkaimonogatari 8f297e.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 4 - Houkaimonogatari 8f297e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 4 - Houkaimonogatari 8f297e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 5 - Fumeimonogatari b86938.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 5 - Fumeimonogatari b86938.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 5 - Fumeimonogatari b86938.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 5 - Fumeimonogatari b86938.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Tile Kaimonogatari f5db25.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Tile Kaimonogatari f5db25.ttslua index a559005a4..da38fca54 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Tile Kaimonogatari f5db25.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Tile Kaimonogatari f5db25.ttslua @@ -1,21 +1,21 @@ -name = 'Kaimonogatari' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Kaimonogatari' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Token Monogatari Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Token Monogatari Campaign Log eda22b.ttslua index ec05dff81..db191365f 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Token Monogatari Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Token Monogatari Campaign Log eda22b.ttslua @@ -1,75 +1,75 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) ]] --Prologue { @@ -160,572 +160,572 @@ defaultButtonData = { pos = {0.87,0.1,-0.092}, size = 260, state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.205,0.1,-1.115}, - size = 700, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.418,0.1,-0.962}, - size = 500, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.165,0.1,-0.962}, - size = 500, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.513,0.1,-1.115}, - size = 700, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.73,0.1,-0.962}, - size = 500, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.48,0.1,-0.962}, - size = 500, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {-1.205,0.1,-0.045}, - size = 700, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {-1.418,0.1,0.12}, - size = 500, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {-1.165,0.1,0.12}, - size = 500, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {-0.513,0.1,-0.045}, - size = 700, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {-0.73,0.1,0.12}, - size = 500, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {-0.48,0.1,0.12}, - size = 500, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.42,0.1,-1.381}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.42,0.1,-1.245}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.42,0.1,-0.63}, - rows = 6, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.73,0.1,-1.381}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.73,0.1,-1.245}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.73,0.1,-0.63}, - rows = 6, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {-1.42,0.1,-0.31}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {-1.42,0.1,-0.17}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {-1.42,0.1,0.38}, - rows = 4, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {-0.73,0.1,-0.31}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {-0.73,0.1,-0.17}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {-0.73,0.1,0.38}, - rows = 4, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {0.41,0.1,0.52}, - rows = 12, - width = 5800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {-1.26,0.1,0.837}, - rows = 4, - width = 5600, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.205,0.1,-1.115}, + size = 700, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.418,0.1,-0.962}, + size = 500, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.165,0.1,-0.962}, + size = 500, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.513,0.1,-1.115}, + size = 700, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.73,0.1,-0.962}, + size = 500, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.48,0.1,-0.962}, + size = 500, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {-1.205,0.1,-0.045}, + size = 700, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {-1.418,0.1,0.12}, + size = 500, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {-1.165,0.1,0.12}, + size = 500, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {-0.513,0.1,-0.045}, + size = 700, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {-0.73,0.1,0.12}, + size = 500, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {-0.48,0.1,0.12}, + size = 500, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.42,0.1,-1.381}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.42,0.1,-1.245}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.42,0.1,-0.63}, + rows = 6, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.73,0.1,-1.381}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.73,0.1,-1.245}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.73,0.1,-0.63}, + rows = 6, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {-1.42,0.1,-0.31}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {-1.42,0.1,-0.17}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {-1.42,0.1,0.38}, + rows = 4, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {-0.73,0.1,-0.31}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {-0.73,0.1,-0.17}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {-0.73,0.1,0.38}, + rows = 4, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {0.41,0.1,0.52}, + rows = 12, + width = 5800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Killed and Insane Investigators + { + pos = {-1.26,0.1,0.837}, + rows = 4, + width = 5600, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Dziwny Przypadek Benedicta Burtona bd069f.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Dziwny Przypadek Benedicta Burtona bd069f.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Dziwny Przypadek Benedicta Burtona bd069f.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Dziwny Przypadek Benedicta Burtona bd069f.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Nieuchwytny 31a93a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Nieuchwytny 31a93a.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Nieuchwytny 31a93a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Nieuchwytny 31a93a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Podniebny Koncert 2889f0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Podniebny Koncert 2889f0.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Podniebny Koncert 2889f0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Podniebny Koncert 2889f0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Przeznacznenie w Red Hook 1e00a9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Przeznacznenie w Red Hook 1e00a9.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Przeznacznenie w Red Hook 1e00a9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Przeznacznenie w Red Hook 1e00a9.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8/Custom_Tile Knightfall 271ce2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8/Custom_Tile Knightfall 271ce2.ttslua index 02c9b2688..c2370fa18 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8/Custom_Tile Knightfall 271ce2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8/Custom_Tile Knightfall 271ce2.ttslua @@ -1,21 +1,21 @@ -name = 'Knightfall' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Knightfall' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca/Custom_Tile Last Call at Roxie's 567db0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca/Custom_Tile Last Call at Roxie's 567db0.ttslua index 7c6288894..5206cda4e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca/Custom_Tile Last Call at Roxie's 567db0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca/Custom_Tile Last Call at Roxie's 567db0.ttslua @@ -1,21 +1,21 @@ -name = 'Last Call at Roxies' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Last Call at Roxies' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8/Custom_Tile Core Difficulty aae2b1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8/Custom_Tile Core Difficulty aae2b1.ttslua index ce26fb1d9..c7ea585c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8/Custom_Tile Core Difficulty aae2b1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8/Custom_Tile Core Difficulty aae2b1.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef.ttslua similarity index 96% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef.ttslua rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef.yaml similarity index 99% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef.yaml index 76ecbe799..46be12fe7 100644 --- a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef.yaml @@ -97,12 +97,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 32.69 - posY: 1.43 - posZ: -10.1 - rotX: 359.92 + posX: 11.76 + posY: 3.33 + posZ: -27.83 + rotX: 359.98 rotY: 270.0 - rotZ: 0.02 + rotZ: 0.0 scaleX: 2.21 scaleY: 0.46 scaleZ: 2.42 diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Adventureland 492628.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Adventureland 492628.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Adventureland 492628.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Adventureland 492628.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Critter Country eeedd1.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Critter Country eeedd1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Critter Country eeedd1.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Critter Country eeedd1.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Fantasyland 28c5d1.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Fantasyland 28c5d1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Fantasyland 28c5d1.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Fantasyland 28c5d1.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Frontierland acef56.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Frontierland acef56.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Frontierland acef56.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Frontierland acef56.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Galaxy's Edge f5106e.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Galaxy's Edge f5106e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Galaxy's Edge f5106e.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Galaxy's Edge f5106e.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Main Street, U.S.A. 1ffbbd.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Main Street, U.S.A. 1ffbbd.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Main Street, U.S.A. 1ffbbd.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Main Street, U.S.A. 1ffbbd.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Miskatonic Mouse 1f45da.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Miskatonic Mouse 1f45da.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Miskatonic Mouse 1f45da.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Miskatonic Mouse 1f45da.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom New Orleans Square ca86be.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom New Orleans Square ca86be.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom New Orleans Square ca86be.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom New Orleans Square ca86be.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Park Entrance dbdb0f.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Park Entrance dbdb0f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Park Entrance dbdb0f.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Park Entrance dbdb0f.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom The Hub c63130.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom The Hub c63130.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom The Hub c63130.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom The Hub c63130.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Tomorrowland e80a41.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Tomorrowland e80a41.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Tomorrowland e80a41.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Tomorrowland e80a41.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Toontown 5287f3.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Toontown 5287f3.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Toontown 5287f3.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/CardCustom Toontown 5287f3.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.ttslua similarity index 97% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.ttslua rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.ttslua index 42affc223..ca858aa9a 100644 --- a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.ttslua @@ -1,38 +1,38 @@ --- set true to enable debug logging -DEBUG = false - -function log(message) - if DEBUG then - print(message) - end -end - ---[[ -Known locations and clues. We check this to determine if we should -atttempt to spawn clues, first we look for _ and if -we find nothing we look for -format is [location_guid -> clueCount] -]] -LOCATIONS_DATA_JSON = [[ -{ - "Park Entrance": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Main Street, U.S.A.": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Park Entrance": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "The Hub": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Adventureland": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Frontierland": {"type": "fixed", "value": 3, "clueSide": "front"}, - "New Orleans Square": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Critter Country": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Galaxy's Edge": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Fantasyland": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Toontown": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Tomorrowland": {"type": "fixed", "value": 3, "clueSide": "front"} -} -]] - -LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) - -function onload(save_state) - local playArea = getObjectFromGUID('721ba2') - playArea.call("updateLocations", {self.getGUID()}) -end +-- set true to enable debug logging +DEBUG = false + +function log(message) + if DEBUG then + print(message) + end +end + +--[[ +Known locations and clues. We check this to determine if we should +atttempt to spawn clues, first we look for _ and if +we find nothing we look for +format is [location_guid -> clueCount] +]] +LOCATIONS_DATA_JSON = [[ +{ + "Park Entrance": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Main Street, U.S.A.": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Park Entrance": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "The Hub": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Adventureland": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Frontierland": {"type": "fixed", "value": 3, "clueSide": "front"}, + "New Orleans Square": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Critter Country": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Galaxy's Edge": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Fantasyland": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Toontown": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Tomorrowland": {"type": "fixed", "value": 3, "clueSide": "front"} +} +]] + +LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) + +function onload(save_state) + local playArea = getObjectFromGUID('721ba2') + playArea.call("updateLocations", {self.getGUID()}) +end diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck A Dream Come True befb0d.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck A Dream Come True befb0d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck A Dream Come True befb0d.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck A Dream Come True befb0d.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Crazed Vacationer Swarms 12f5aa.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Crazed Vacationer Swarms 12f5aa.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Crazed Vacationer Swarms 12f5aa.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Crazed Vacationer Swarms 12f5aa.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Fab Five 2b1559.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Fab Five 2b1559.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Fab Five 2b1559.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Fab Five 2b1559.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Souvenirs ac3c85.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Souvenirs ac3c85.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Souvenirs ac3c85.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Souvenirs ac3c85.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Weaknesses 37a019.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Weaknesses 37a019.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Weaknesses 37a019.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model_Bag Set Aside daa421/Deck Weaknesses 37a019.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_PDF Miskatonic Mouse Scenario Guide bda9a9.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_PDF Miskatonic Mouse Scenario Guide bda9a9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_PDF Miskatonic Mouse Scenario Guide bda9a9.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_PDF Miskatonic Mouse Scenario Guide bda9a9.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 070048.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 070048.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 070048.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 070048.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 20323b.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 20323b.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 20323b.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 20323b.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 270525.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 270525.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 270525.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 270525.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 2875cc.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 2875cc.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 2875cc.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 2875cc.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 3b6978.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 3b6978.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 3b6978.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 3b6978.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 3bc61d.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 3bc61d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 3bc61d.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 3bc61d.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 7234af.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 7234af.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 7234af.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 7234af.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 776283.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 776283.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 776283.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 776283.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 970ac8.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 970ac8.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 970ac8.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 970ac8.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 9b26d0.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 9b26d0.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 9b26d0.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile 9b26d0.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile afed94.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile afed94.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile afed94.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile afed94.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile b1d640.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile b1d640.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile b1d640.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile b1d640.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile c62fb5.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile c62fb5.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile c62fb5.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile c62fb5.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile c907e9.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile c907e9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile c907e9.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile c907e9.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile d37681.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile d37681.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile d37681.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile d37681.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile e600d4.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile e600d4.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile e600d4.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Tile e600d4.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Act Deck dbe757.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Act Deck dbe757.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Act Deck dbe757.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Act Deck dbe757.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Agenda Deck e5c753.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Agenda Deck e5c753.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Agenda Deck e5c753.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Agenda Deck e5c753.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Childlike Excitement Deck 971f55.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Childlike Excitement Deck 971f55.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Childlike Excitement Deck 971f55.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Childlike Excitement Deck 971f55.yaml diff --git a/unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Ecounter Deck 9e02de.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Ecounter Deck 9e02de.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Ecounter Deck 9e02de.yaml rename to unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Deck Ecounter Deck 9e02de.yaml diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Custom_Tile Murder at the Excelsior Hotel bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Custom_Tile Murder at the Excelsior Hotel bbb70a.ttslua index 6f70e0940..46732a4a2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Custom_Tile Murder at the Excelsior Hotel bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Custom_Tile Murder at the Excelsior Hotel bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'Excelsior' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Excelsior' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Deck Encounter Deck fd4231.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Deck Encounter Deck fd4231.yaml index f8466cce1..829a0791c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Deck Encounter Deck fd4231.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Deck Encounter Deck fd4231.yaml @@ -1046,12 +1046,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: -3.93 - posY: 1.72 - posZ: 5.76 - rotX: 359.92 + posX: 12.25 + posY: 2.06 + posZ: -20.01 + rotX: 359.93 rotY: 270.0 - rotZ: 180.02 + rotZ: 180.01 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 1 147dea.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 1 147dea.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 1 147dea.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 1 147dea.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 2 7f9f0d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 2 7f9f0d.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 2 7f9f0d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 2 7f9f0d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 3 df5156.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 3 df5156.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 3 df5156.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 3 df5156.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Custom_Tile Core Difficulty ea0896.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Custom_Tile Core Difficulty ea0896.ttslua index ce26fb1d9..c7ea585c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Custom_Tile Core Difficulty ea0896.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Custom_Tile Core Difficulty ea0896.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50.ttslua index 45f110e8b..ed7a62e7d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a.ttslua index 409896272..1d754d17c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a/Custom_Tile Core Difficulty 56a08b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a/Custom_Tile Core Difficulty 56a08b.ttslua index e79bc79e7..476f361a0 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a/Custom_Tile Core Difficulty 56a08b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a/Custom_Tile Core Difficulty 56a08b.ttslua @@ -1,21 +1,21 @@ -name = 'Of Sphinx' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Of Sphinx' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 2 Chaos in Cairo 6e0236.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 2 Chaos in Cairo 6e0236.ttslua index 409896272..1d754d17c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 2 Chaos in Cairo 6e0236.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 2 Chaos in Cairo 6e0236.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 3 The Will to Triump 6d8dad.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 3 The Will to Triump 6d8dad.ttslua index 409896272..1d754d17c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 3 The Will to Triump 6d8dad.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 3 The Will to Triump 6d8dad.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202.ttslua index a085f3c96..d88f19b4b 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Midnight in Paris 7cda3f.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Midnight in Paris 7cda3f.ttslua index 7a4d95fda..360f86347 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Midnight in Paris 7cda3f.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Midnight in Paris 7cda3f.ttslua @@ -1,505 +1,505 @@ --- Utility memory bag by Directsun --- Version 2.5 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - print("updating memory with moves") - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - print(guid) - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - print(_) - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + print("updating memory with moves") + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + print(guid) + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + print(_) + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Shadows of Brocéliande 7b28eb.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Shadows of Brocéliande 7b28eb.ttslua index a40fbbd64..a6759c861 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Shadows of Brocéliande 7b28eb.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Shadows of Brocéliande 7b28eb.ttslua @@ -1,505 +1,505 @@ --- Utility memory bag by Directsun --- Version 2.5 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - print("updating memory with moves") - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - print(guid) - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - print(_) - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + print("updating memory with moves") + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + print(guid) + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + print(_) + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag The München Conspiracy 286579.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag The München Conspiracy 286579.ttslua index a40fbbd64..a6759c861 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag The München Conspiracy 286579.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag The München Conspiracy 286579.ttslua @@ -1,505 +1,505 @@ --- Utility memory bag by Directsun --- Version 2.5 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - print("updating memory with moves") - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - print(guid) - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - print(_) - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + print("updating memory with moves") + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + print(guid) + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + print(_) + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Tibetan Winds ba2ded.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Tibetan Winds ba2ded.ttslua index 7a4d95fda..360f86347 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Tibetan Winds ba2ded.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Tibetan Winds ba2ded.ttslua @@ -1,505 +1,505 @@ --- Utility memory bag by Directsun --- Version 2.5 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - print("updating memory with moves") - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - print(guid) - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - print(_) - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + print("updating memory with moves") + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + print(guid) + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + print(_) + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Custom_Tile Ordo Templi Orientis bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Custom_Tile Ordo Templi Orientis bbb70a.ttslua index 606e250c5..97ed54b6f 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Custom_Tile Ordo Templi Orientis bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Custom_Tile Ordo Templi Orientis bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'Ordis' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Ordis' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag c0897e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag c0897e.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag c0897e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag c0897e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 1 Nightmare or Dream f39e68.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 1 Nightmare or Dream f39e68.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 1 Nightmare or Dream f39e68.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 1 Nightmare or Dream f39e68.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 2 Awake 6ca52c.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 2 Awake 6ca52c.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 2 Awake 6ca52c.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 2 Awake 6ca52c.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Custom_Tile Core Difficulty 56a08b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Custom_Tile Core Difficulty 56a08b.ttslua index ce26fb1d9..c7ea585c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Custom_Tile Core Difficulty 56a08b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Custom_Tile Core Difficulty 56a08b.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Adding Pokemon To An Existing Campaign 7b57ad.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Adding Pokemon To An Existing Campaign 7b57ad.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Adding Pokemon To An Existing Campaign 7b57ad.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Adding Pokemon To An Existing Campaign 7b57ad.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Basic Pokemon d14543.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Basic Pokemon d14543.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Basic Pokemon d14543.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Basic Pokemon d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Pokemon Investigators 05109d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Pokemon Investigators 05109d.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Pokemon Investigators 05109d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Pokemon Investigators 05109d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1/Custom_Tile Pokemon Eldritch Edition 3837a5.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1/Custom_Tile Pokemon Eldritch Edition 3837a5.ttslua index 5093ba655..71c417e00 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1/Custom_Tile Pokemon Eldritch Edition 3837a5.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1/Custom_Tile Pokemon Eldritch Edition 3837a5.ttslua @@ -1,21 +1,21 @@ -name = 'Pokemon' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Pokemon' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2a The Winding Road 61801e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2a The Winding Road 61801e.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2a The Winding Road 61801e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2a The Winding Road 61801e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2b Shipments From The Unknown 13ed7d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2b Shipments From The Unknown 13ed7d.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2b Shipments From The Unknown 13ed7d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2b Shipments From The Unknown 13ed7d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3a Viridian f040a6.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3a Viridian f040a6.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3a Viridian f040a6.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3a Viridian f040a6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3b Deep Secrets 3da6dd.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3b Deep Secrets 3da6dd.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3b Deep Secrets 3da6dd.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3b Deep Secrets 3da6dd.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 4 The Unconjuring 52d102.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 4 The Unconjuring 52d102.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 4 The Unconjuring 52d102.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 4 The Unconjuring 52d102.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15/Custom_Tile Eldritch Safari 3837a5.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15/Custom_Tile Eldritch Safari 3837a5.ttslua index 749dcbfa9..854b30bd5 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15/Custom_Tile Eldritch Safari 3837a5.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15/Custom_Tile Eldritch Safari 3837a5.ttslua @@ -1,21 +1,21 @@ -name = 'Safari' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Safari' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf/Custom_Tile Project Cerulean 3837a5.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf/Custom_Tile Project Cerulean 3837a5.ttslua index a5c1bbe0b..937603789 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf/Custom_Tile Project Cerulean 3837a5.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf/Custom_Tile Project Cerulean 3837a5.ttslua @@ -1,21 +1,21 @@ -name = 'Cerulean' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Cerulean' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Upgrade Pokemon 2cea4e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Upgrade Pokemon 2cea4e.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Upgrade Pokemon 2cea4e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Upgrade Pokemon 2cea4e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Custom_Token Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Custom_Token Campaign Log eda22b.ttslua index 588598831..d5fb74c82 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Custom_Token Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Custom_Token Campaign Log eda22b.ttslua @@ -1,651 +1,651 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.080,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.270,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.000,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.251,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.441,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.171,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {0.579,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {0.389,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {0.659,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {1.407,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {1.217,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {1.487,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.265,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.265,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.265,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.436,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.436,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.436,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {0.394,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {0.394,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {0.394,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {1.222,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {1.222,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {1.222,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.930,0.1,0.930}, - rows = 27, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.820,0.1,0.707}, - rows = 20, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {1.010,0.1,1.700}, - rows = 5, - width = 7400, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.080,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.270,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.000,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.251,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.441,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.171,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {0.579,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {0.389,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {0.659,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {1.407,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {1.217,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {1.487,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.265,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.265,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.265,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.436,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.436,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.436,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {0.394,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {0.394,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {0.394,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {1.222,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {1.222,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {1.222,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.930,0.1,0.930}, + rows = 27, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.820,0.1,0.707}, + rows = 20, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Killed and Insane Investigators + { + pos = {1.010,0.1,1.700}, + rows = 5, + width = 7400, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.yaml index 54d24802f..2db741a6d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.yaml @@ -57,7 +57,7 @@ CustomMesh: r: 1.0 SpecularIntensity: 0.0 SpecularSharpness: 2.0 - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1011565751983250718/F776DC9FDACBDDF16C8A4989E148489917A052F6/ + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1655599785039304850/852232605656B7DD6577C475A1988491D3378506/ MaterialIndex: 3 MeshURL: https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj NormalURL: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Custom_Tile Read or Die b5928a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Custom_Tile Read or Die b5928a.ttslua index 0dd8ca8e1..42778aed7 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Custom_Tile Read or Die b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Custom_Tile Read or Die b5928a.ttslua @@ -1,21 +1,21 @@ -name = 'Read or Die' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Read or Die' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Deck Encounter Deck 556e96.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Deck Encounter Deck 556e96.yaml index 0affef73d..d9be5d53b 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Deck Encounter Deck 556e96.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Deck Encounter Deck 556e96.yaml @@ -1530,9 +1530,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 9.72 - posY: 2.1 - posZ: -20.47 + posX: 12.25 + posY: 2.12 + posZ: 19.99 rotX: 359.93 rotY: 270.0 rotZ: 180.01 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 1 In Search Of Sanity 961940.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 1 In Search Of Sanity 961940.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 1 In Search Of Sanity 961940.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 1 In Search Of Sanity 961940.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 2 The Thrushmoor Terror eea51b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 2 The Thrushmoor Terror eea51b.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 2 The Thrushmoor Terror eea51b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 2 The Thrushmoor Terror eea51b.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Custom_Tile Strange Aeons 82e1ed.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Custom_Tile Strange Aeons 82e1ed.ttslua index e74915067..8f300ba86 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Custom_Tile Strange Aeons 82e1ed.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Custom_Tile Strange Aeons 82e1ed.ttslua @@ -1,21 +1,21 @@ -name = 'Strange Aeons' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Strange Aeons' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301/Custom_Tile Stranger Things bc825a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301/Custom_Tile Stranger Things bc825a.ttslua index 23e08a4d9..accf324f6 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301/Custom_Tile Stranger Things bc825a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301/Custom_Tile Stranger Things bc825a.ttslua @@ -1,21 +1,21 @@ -name = 'Stranger Things' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Stranger Things' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.ttslua index 0748143c2..54d591927 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.yaml index c7d3f1bbc..94a191eda 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.yaml @@ -66,12 +66,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 32.3 - posY: 2.16 - posZ: 0.14 - rotX: 359.93 + posX: 38.37 + posY: 3.16 + posZ: -62.81 + rotX: 359.98 rotY: 270.0 - rotZ: 0.01 + rotZ: 0.0 scaleX: 2.21 scaleY: 0.46 scaleZ: 2.42 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 1 Plot Uncovered 67d524.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 1 Plot Uncovered 67d524.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 1 Plot Uncovered 67d524.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 1 Plot Uncovered 67d524.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 2 Dark Waters 90aab1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 2 Dark Waters 90aab1.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 2 Dark Waters 90aab1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 2 Dark Waters 90aab1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 3 Curiosities 20982e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 3 Curiosities 20982e.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 3 Curiosities 20982e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 3 Curiosities 20982e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 4 Shadow Rails 3a3b5a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 4 Shadow Rails 3a3b5a.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 4 Shadow Rails 3a3b5a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 4 Shadow Rails 3a3b5a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 5 lair of the Cult 266dcb.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 5 lair of the Cult 266dcb.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 5 lair of the Cult 266dcb.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 5 lair of the Cult 266dcb.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 6 Domain of Baal 84cdaf.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 6 Domain of Baal 84cdaf.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 6 Domain of Baal 84cdaf.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 6 Domain of Baal 84cdaf.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Custom_Tile The Approaching Storm 7521a9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Custom_Tile The Approaching Storm 7521a9.ttslua index 1c0f40de9..7af28b4f4 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Custom_Tile The Approaching Storm 7521a9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Custom_Tile The Approaching Storm 7521a9.ttslua @@ -1,21 +1,21 @@ -name = 'Approaching Storm' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Approaching Storm' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Epic Multiplayer 2c10cf.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Epic Multiplayer 2c10cf.ttslua index 758efa0e2..f82d90245 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Epic Multiplayer 2c10cf.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Epic Multiplayer 2c10cf.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Setup", click_function="buttonClick_setup", function_owner=self, ---- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={1,1,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Setup", click_function="buttonClick_setup", function_owner=self, +--- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={1,1,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Single Group 830305.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Single Group 830305.ttslua index 758efa0e2..f82d90245 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Single Group 830305.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Single Group 830305.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Setup", click_function="buttonClick_setup", function_owner=self, ---- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={1,1,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Setup", click_function="buttonClick_setup", function_owner=self, +--- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={1,1,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_PDF The Blob that Ate Everything 36b4eb.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_PDF The Blob that Ate Everything 36b4eb.yaml index 98170bcca..3507a4892 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_PDF The Blob that Ate Everything 36b4eb.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_PDF The Blob that Ate Everything 36b4eb.yaml @@ -7,7 +7,7 @@ CustomPDF: PDFPage: 0 PDFPageOffset: 0 PDFPassword: '' - PDFUrl: http://cloud-3.steamusercontent.com/ugc/784129708172267441/DEB96DAC4A9DDB7F8A66AE52710978A7AD7FDA0C/ + PDFUrl: http://cloud-3.steamusercontent.com/ugc/1655599785041484428/1D72362ED0A48F3D740AA9A82FC27A72CD6624B9/ Description: Scenario Guide DragSelectable: true GMNotes: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_Tile The Blob that Ate Everything bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_Tile The Blob that Ate Everything bbb70a.ttslua index ad353a3f2..ac13f876e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_Tile The Blob that Ate Everything bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_Tile The Blob that Ate Everything bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'The Blob' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Blob' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Deck Starting Locations fd7be1.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Deck Starting Locations fd7be1.yaml index 88ade355b..ee39af70f 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Deck Starting Locations fd7be1.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Deck Starting Locations fd7be1.yaml @@ -126,12 +126,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 12.25 - posY: 1.96 - posZ: -12.01 - rotX: 359.93 + posX: -12.38 + posY: 1.63 + posZ: 11.41 + rotX: 359.92 rotY: 270.0 - rotZ: 0.01 + rotZ: 0.02 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb/Custom_Tile The Collector 150603.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb/Custom_Tile The Collector 150603.ttslua index 91fb38d19..af63b7201 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb/Custom_Tile The Collector 150603.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb/Custom_Tile The Collector 150603.ttslua @@ -1,21 +1,21 @@ -name = 'The Collector' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Collector' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff/Custom_Tile The Colour out of Space 2e887e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff/Custom_Tile The Colour out of Space 2e887e.ttslua index 9e9359d36..dbc84856b 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff/Custom_Tile The Colour out of Space 2e887e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff/Custom_Tile The Colour out of Space 2e887e.ttslua @@ -1,21 +1,21 @@ -name = 'The Colour out of Space' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Colour out of Space' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d/Custom_Tile The Curse of Amultep b3cbc1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d/Custom_Tile The Curse of Amultep b3cbc1.ttslua index 354659bc7..31eb20a69 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d/Custom_Tile The Curse of Amultep b3cbc1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d/Custom_Tile The Curse of Amultep b3cbc1.ttslua @@ -1,21 +1,21 @@ -name = 'The Curse of Amultep' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Curse of Amultep' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9/Custom_Tile The Dying Star 8d62ae.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9/Custom_Tile The Dying Star 8d62ae.ttslua index 931990e74..75a63c904 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9/Custom_Tile The Dying Star 8d62ae.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9/Custom_Tile The Dying Star 8d62ae.ttslua @@ -1,21 +1,21 @@ -name = 'The Dying Star' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Dying Star' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d/Custom_Tile The Dying Star a148f2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d/Custom_Tile The Dying Star a148f2.ttslua index 931990e74..75a63c904 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d/Custom_Tile The Dying Star a148f2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d/Custom_Tile The Dying Star a148f2.ttslua @@ -1,21 +1,21 @@ -name = 'The Dying Star' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Dying Star' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a/Custom_Tile The Festival 4b81f6.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a/Custom_Tile The Festival 4b81f6.ttslua index c8283e89f..392b969e5 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a/Custom_Tile The Festival 4b81f6.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a/Custom_Tile The Festival 4b81f6.ttslua @@ -1,21 +1,21 @@ -name = 'The Festival' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Festival' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1/Custom_Tile Core Difficulty 9cd1ad.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1/Custom_Tile Core Difficulty 9cd1ad.ttslua index ce26fb1d9..c7ea585c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1/Custom_Tile Core Difficulty 9cd1ad.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1/Custom_Tile Core Difficulty 9cd1ad.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.ttslua index 901ce543c..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.ttslua @@ -1,273 +1,503 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.yaml index 8ca0af1c6..eb704fb05 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.yaml @@ -25,9 +25,9 @@ ContainedObjects: - !include 'Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.yaml' - !include 'Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.yaml' - !include 'Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.yaml' +- !include 'Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.yaml' - !include 'Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.yaml' -- !include 'Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.yaml' CustomMesh: CastShadows: true ColliderURL: '' @@ -48,7 +48,7 @@ HideWhenFaceDown: false IgnoreFoW: false Locked: false LuaScript: !include 'Custom_Model_Bag The Labyrinths of Lunacy 4c173f.ttslua' -LuaScriptState: '{"ml":{"14808b":{"lock":false,"pos":{"x":9.7604,"y":1.2864,"z":11.7484},"rot":{"x":0.0799,"y":89.9983,"z":359.9831}},"2ea2a2":{"lock":false,"pos":{"x":9.5356,"y":1.2881,"z":16.2747},"rot":{"x":0.0799,"y":89.9969,"z":359.9831}},"5ef0ce":{"lock":false,"pos":{"x":-8.6494,"y":1.7726,"z":-27.1446},"rot":{"x":359.9201,"y":269.9999,"z":0.0169}},"76b476":{"lock":false,"pos":{"x":9.7067,"y":1.2852,"z":7.2515},"rot":{"x":0.0799,"y":89.9911,"z":359.9831}},"79b534":{"lock":false,"pos":{"x":10.0441,"y":1.2826,"z":0.5236},"rot":{"x":0.0799,"y":89.9995,"z":359.9831}},"c352ac":{"lock":false,"pos":{"x":9.4217,"y":1.2811,"z":-7.7254},"rot":{"x":0.0799,"y":89.9979,"z":359.9831}},"c7c4c1":{"lock":false,"pos":{"x":9.6417,"y":1.2822,"z":-3.4464},"rot":{"x":0.0799,"y":89.991,"z":359.9831}},"f4dcee":{"lock":false,"pos":{"x":-3.7547,"y":1.5823,"z":-14.8894},"rot":{"x":359.9197,"y":270.0037,"z":0.0168}}}}' +LuaScriptState: '{"ml":{"14808b":{"lock":false,"pos":{"x":3.41869044303894,"y":1.28437519073486,"z":-24.9040679931641},"rot":{"x":0.0799667090177536,"y":89.99951171875,"z":359.983093261719}},"2ea2a2":{"lock":false,"pos":{"x":3.46256160736084,"y":1.28561234474182,"z":-20.4963073730469},"rot":{"x":0.0799679085612297,"y":89.9991989135742,"z":359.983093261719}},"5ef0ce":{"lock":false,"pos":{"x":-8.64940166473389,"y":1.77257490158081,"z":-27.1445999145508},"rot":{"x":359.920135498047,"y":269.999908447266,"z":0.0168545711785555}},"76b476":{"lock":false,"pos":{"x":3.3650164604187,"y":1.28312623500824,"z":-29.4009761810303},"rot":{"x":0.0799646973609924,"y":89.9967346191406,"z":359.983093261719}},"79b534":{"lock":false,"pos":{"x":-1.14386463165283,"y":1.29200792312622,"z":-20.5858459472656},"rot":{"x":0.0799710899591446,"y":89.9999923706055,"z":359.983093261719}},"c352ac":{"lock":false,"pos":{"x":-1.22769594192505,"y":1.2895085811615,"z":-29.4703140258789},"rot":{"x":0.0799661129713058,"y":89.9995422363281,"z":359.983093261719}},"c7c4c1":{"lock":false,"pos":{"x":-1.03725612163544,"y":1.29063427448273,"z":-24.7441425323486},"rot":{"x":0.0799664258956909,"y":89.9992828369141,"z":359.983093261719}},"f4dcee":{"lock":false,"pos":{"x":-3.75470042228699,"y":1.58234560489655,"z":-14.8894014358521},"rot":{"x":359.919738769531,"y":270.003662109375,"z":0.0168327111750841}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.yaml index 0fb827cb9..26de7b720 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.yaml @@ -34,11 +34,11 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 10.05 - posY: 1.28 - posZ: 0.34 + posX: -1.14 + posY: 1.29 + posZ: -20.59 rotX: 0.08 - rotY: 90.03 + rotY: 90.0 rotZ: 359.98 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.yaml index 94dae3169..de01788a4 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.yaml @@ -35,10 +35,10 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 12.25 - posY: 1.5 - posZ: 11.99 - rotX: 0.06 + posX: -1.04 + posY: 1.29 + posZ: -24.74 + rotX: 0.08 rotY: 90.0 rotZ: 359.98 scaleX: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.yaml index 7c4a7e608..bc622ee43 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.yaml @@ -35,9 +35,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 9.42 - posY: 1.28 - posZ: -7.73 + posX: -1.23 + posY: 1.29 + posZ: -29.47 rotX: 0.08 rotY: 90.0 rotZ: 359.98 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.yaml index 6c7253789..d8ffd6f76 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.yaml @@ -34,9 +34,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 9.54 + posX: 3.46 posY: 1.29 - posZ: 16.27 + posZ: -20.5 rotX: 0.08 rotY: 90.0 rotZ: 359.98 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.yaml index dc5728e1d..c498dd4b7 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.yaml @@ -34,11 +34,11 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 9.76 - posY: 1.49 - posZ: 11.75 + posX: 3.42 + posY: 1.28 + posZ: -24.9 rotX: 0.08 - rotY: 89.99 + rotY: 90.0 rotZ: 359.98 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.yaml index 4e1b188e6..04778358d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.yaml @@ -34,11 +34,11 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 9.71 - posY: 1.29 - posZ: 7.7 + posX: 3.37 + posY: 1.28 + posZ: -29.4 rotX: 0.08 - rotY: 89.99 + rotY: 90.0 rotZ: 359.98 scaleX: 1.0 scaleY: 1.0 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.ttslua index 1ef613c2a..91793b491 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.ttslua @@ -1,21 +1,21 @@ -name = 'The Labyrinths of Lunacy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Labyrinths of Lunacy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.yaml index 44b84b608..6a10fe006 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.yaml +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.yaml @@ -32,12 +32,12 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: -3.75 - posY: 1.58 - posZ: -14.89 - rotX: 359.92 + posX: 12.25 + posY: 1.68 + posZ: -4.01 + rotX: 359.93 rotY: 270.0 - rotZ: 0.02 + rotZ: 0.01 scaleX: 2.2 scaleY: 1.0 scaleZ: 2.2 diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2.ttslua index d3a91c848..5aa27be92 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Tile The Legend of Sleepy Hollow bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Tile The Legend of Sleepy Hollow bbb70a.ttslua index b8c1bec41..ed6b304fe 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Tile The Legend of Sleepy Hollow bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Tile The Legend of Sleepy Hollow bbb70a.ttslua @@ -1,13 +1,13 @@ -name = 'Sleepy Hollow' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end +name = 'Sleepy Hollow' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Token Generic Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Token Generic Campaign Log eda22b.ttslua index 0942cf0ac..4ea5509ad 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Token Generic Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Token Generic Campaign Log eda22b.ttslua @@ -1,509 +1,509 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.080,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.270,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.000,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.251,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.441,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.171,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {0.579,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {0.389,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {0.659,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {1.407,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {1.217,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {1.487,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.265,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.265,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.265,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.436,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.436,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.436,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {0.394,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {0.394,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {0.394,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {1.222,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {1.222,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {1.222,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.930,0.1,0.930}, - rows = 27, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.820,0.1,0.707}, - rows = 20, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {1.010,0.1,1.700}, - rows = 5, - width = 7400, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -function updateSave() - saved_data = JSON.encode(ref_buttonData) - if disableSave==true then saved_data="" end - self.script_state = saved_data -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.080,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.270,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.000,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.251,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.441,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.171,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {0.579,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {0.389,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {0.659,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {1.407,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {1.217,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {1.487,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.265,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.265,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.265,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.436,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.436,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.436,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {0.394,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {0.394,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {0.394,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {1.222,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {1.222,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {1.222,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.930,0.1,0.930}, + rows = 27, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.820,0.1,0.707}, + rows = 20, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Killed and Insane Investigators + { + pos = {1.010,0.1,1.700}, + rows = 5, + width = 7400, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +function updateSave() + saved_data = JSON.encode(ref_buttonData) + if disableSave==true then saved_data="" end + self.script_state = saved_data +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55/Custom_Tile A Loving Spouse ea41d9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55/Custom_Tile A Loving Spouse ea41d9.ttslua index 8c66c0fe3..7ad001427 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55/Custom_Tile A Loving Spouse ea41d9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55/Custom_Tile A Loving Spouse ea41d9.ttslua @@ -1,21 +1,21 @@ -name = 'London Set 1' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'London Set 1' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66/Custom_Tile Mrs Tillywingers Cat 0ae91a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66/Custom_Tile Mrs Tillywingers Cat 0ae91a.ttslua index 392146f03..562cf43bf 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66/Custom_Tile Mrs Tillywingers Cat 0ae91a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66/Custom_Tile Mrs Tillywingers Cat 0ae91a.ttslua @@ -1,21 +1,21 @@ -name = 'London Set 2' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'London Set 2' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3/Custom_Tile Disgracing Alderman Whitney c2736e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3/Custom_Tile Disgracing Alderman Whitney c2736e.ttslua index 8e7652429..83121ac95 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3/Custom_Tile Disgracing Alderman Whitney c2736e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3/Custom_Tile Disgracing Alderman Whitney c2736e.ttslua @@ -1,21 +1,21 @@ -name = 'London Set 3' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'London Set 3' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12/Custom_Tile The Nephew Calls 54707a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12/Custom_Tile The Nephew Calls 54707a.ttslua index a51884f2c..8849d7feb 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12/Custom_Tile The Nephew Calls 54707a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12/Custom_Tile The Nephew Calls 54707a.ttslua @@ -1,21 +1,21 @@ -name = 'The Nephew Calls' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Nephew Calls' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 1 526ff9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 1 526ff9.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 1 526ff9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 1 526ff9.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 2 5b3ac7.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 2 5b3ac7.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 2 5b3ac7.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 2 5b3ac7.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 3 d166f2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 3 d166f2.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 3 d166f2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 3 d166f2.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Custom_Tile The Outsider d5b06c.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Custom_Tile The Outsider d5b06c.ttslua index c7d360676..9686b0f8a 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Custom_Tile The Outsider d5b06c.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Custom_Tile The Outsider d5b06c.ttslua @@ -1,21 +1,21 @@ -name = 'The Outsider' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Outsider' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38/Custom_Tile The Pensher Wyrm c606a1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38/Custom_Tile The Pensher Wyrm c606a1.ttslua index 89881072c..e71cfb253 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38/Custom_Tile The Pensher Wyrm c606a1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38/Custom_Tile The Pensher Wyrm c606a1.ttslua @@ -1,21 +1,21 @@ -name = 'The Pensher Wyrm' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Pensher Wyrm' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Red Room fa4327.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Red Room fa4327.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Red Room fa4327.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Red Room fa4327.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4/Custom_Tile Core Difficulty ec7a73.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4/Custom_Tile Core Difficulty ec7a73.ttslua index ce26fb1d9..c7ea585c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4/Custom_Tile Core Difficulty ec7a73.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4/Custom_Tile Core Difficulty ec7a73.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b/Custom_Tile Core Difficulty a751fe.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b/Custom_Tile Core Difficulty a751fe.ttslua index ce26fb1d9..c7ea585c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b/Custom_Tile Core Difficulty a751fe.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b/Custom_Tile Core Difficulty a751fe.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Model Custom Data Helper c0b834.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Model Custom Data Helper c0b834.ttslua index 7db02d708..2f7f3a921 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Model Custom Data Helper c0b834.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Model Custom Data Helper c0b834.ttslua @@ -1,37 +1,37 @@ --- set true to enable debug logging -DEBUG = false - -function log(message) - if DEBUG then - print(message) - end -end - ---[[ -Known locations and clues. We check this to determine if we should -atttempt to spawn clues, first we look for _ and if -we find nothing we look for -format is [location_guid -> clueCount] -]] -LOCATIONS_DATA_JSON = [[ -{ - "Entrance Hall": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Main Lobby": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Gallery": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Auditorium": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Anechoic Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Instrument Closet": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Recording Studio": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Rehearsal Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Scene Shop": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Tiring Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Stage Hall": {"type": "fixed", "value": 1, "clueSide": "front"} -} -]] - -LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) - -function onload(save_state) - local playArea = getObjectFromGUID('721ba2') - playArea.call("updateLocations", {self.getGUID()}) -end +-- set true to enable debug logging +DEBUG = false + +function log(message) + if DEBUG then + print(message) + end +end + +--[[ +Known locations and clues. We check this to determine if we should +atttempt to spawn clues, first we look for _ and if +we find nothing we look for +format is [location_guid -> clueCount] +]] +LOCATIONS_DATA_JSON = [[ +{ + "Entrance Hall": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Main Lobby": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Gallery": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Auditorium": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Anechoic Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Instrument Closet": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Recording Studio": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Rehearsal Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Scene Shop": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Tiring Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Stage Hall": {"type": "fixed", "value": 1, "clueSide": "front"} +} +]] + +LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) + +function onload(save_state) + local playArea = getObjectFromGUID('721ba2') + playArea.call("updateLocations", {self.getGUID()}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Tile The Symphony of Erich Zann f4c93e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Tile The Symphony of Erich Zann f4c93e.ttslua index e0c809bfe..9cecde9ef 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Tile The Symphony of Erich Zann f4c93e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Tile The Symphony of Erich Zann f4c93e.ttslua @@ -1,25 +1,25 @@ -name = 'Erich Zann' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Erich Zann' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49/Custom_Tile Core Difficulty 2261a5.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49/Custom_Tile Core Difficulty 2261a5.ttslua index ce26fb1d9..c7ea585c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49/Custom_Tile Core Difficulty 2261a5.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49/Custom_Tile Core Difficulty 2261a5.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469.ttslua index d08a19f8d..d4332d4c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 1 First Contact f70a0d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 1 First Contact f70a0d.ttslua index 013eb65ca..cae387265 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 1 First Contact f70a0d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 1 First Contact f70a0d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 2 Phobos and Deimos 313523.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 2 Phobos and Deimos 313523.ttslua index 013eb65ca..cae387265 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 2 Phobos and Deimos 313523.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 2 Phobos and Deimos 313523.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 3 The Thirsting Void a0d2b1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 3 The Thirsting Void a0d2b1.ttslua index 013eb65ca..cae387265 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 3 The Thirsting Void a0d2b1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 3 The Thirsting Void a0d2b1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Tile War of the Worlds b5928a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Tile War of the Worlds b5928a.ttslua index 4a3502c94..267e4346b 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Tile War of the Worlds b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Tile War of the Worlds b5928a.ttslua @@ -1,21 +1,21 @@ name = 'War of the Worlds' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Token War of the Worlds Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Token War of the Worlds Campaign Log eda22b.ttslua index 64a6b9bcb..6011ced73 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Token War of the Worlds Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Token War of the Worlds Campaign Log eda22b.ttslua @@ -1,682 +1,682 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First Contact - { - pos = {-1.730,0.1,1.140}, - size = 500, - state = false - }, - --Phobos and Deimos - { - pos = {-0.968,0.1,1.355}, - size = 500, - state = false - }, - --The Stillness - { - pos = {-1.683,0.1,1.560}, - size = 500, - state = false - }, - --The Thirsting Void - { - pos = {-0.888,0.1,1.746}, - size = 500, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.080,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.270,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.000,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.251,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.441,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.171,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {0.579,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {0.389,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {0.659,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {1.407,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {1.217,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {1.487,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --Sacrifices to Nodens - { - pos = {0.890,0.1,1.150}, - size = 1000, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.265,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.265,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.265,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.436,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.436,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.436,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {0.394,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {0.394,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {0.394,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {1.222,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {1.222,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {1.222,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.930,0.1,0.620}, - rows = 12, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Evacuated Locations - { - pos = {0.820,0.1,0.500}, - rows = 10, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {1.010,0.1,1.700}, - rows = 5, - width = 7400, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First Contact + { + pos = {-1.730,0.1,1.140}, + size = 500, + state = false + }, + --Phobos and Deimos + { + pos = {-0.968,0.1,1.355}, + size = 500, + state = false + }, + --The Stillness + { + pos = {-1.683,0.1,1.560}, + size = 500, + state = false + }, + --The Thirsting Void + { + pos = {-0.888,0.1,1.746}, + size = 500, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.080,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.270,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.000,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.251,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.441,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.171,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {0.579,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {0.389,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {0.659,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {1.407,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {1.217,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {1.487,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --Sacrifices to Nodens + { + pos = {0.890,0.1,1.150}, + size = 1000, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.265,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.265,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.265,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.436,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.436,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.436,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {0.394,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {0.394,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {0.394,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {1.222,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {1.222,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {1.222,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.930,0.1,0.620}, + rows = 12, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Evacuated Locations + { + pos = {0.820,0.1,0.500}, + rows = 10, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Killed and Insane Investigators + { + pos = {1.010,0.1,1.700}, + rows = 5, + width = 7400, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.ttslua new file mode 100644 index 000000000..d4332d4c8 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.ttslua @@ -0,0 +1,503 @@ +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.yaml new file mode 100644 index 000000000..48d1ff26a --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.yaml @@ -0,0 +1,114 @@ +AttachedDecals: +- CustomDecal: + ImageURL: http://cloud-3.steamusercontent.com/ugc/959719855119695911/931B9829687A20F4DEADB36DA57B7E6D76792231/ + Name: dunwich_back + Size: 7.4 + Transform: + posX: -0.0021877822 + posY: -0.08963572 + posZ: -0.00288731651 + rotX: 270.0 + rotY: 359.869568 + rotZ: 0.0 + scaleX: 2.00000215 + scaleY: 2.00000238 + scaleZ: 2.00000262 +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +ContainedObjects: +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 012f6e.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Deck Act Deck 01a1bf.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Deck Blue Agenda Deck 119ff4.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Deck Green Agenda Deck 1375c8.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card Scenario 1ade36.yaml' +- !include "Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of Montr\xE9\ + al 262233.yaml" +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 308d21.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 30c009.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Deck Encounter Deck 3111c8.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 354cd0.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_PDF War of the Outer + Gods 36b4eb.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of New York + City 473d21.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 638f24.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card Disciple of the Swarm + 677a88.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 7234af.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card Chateau Ramezay 790c3a.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside + 7b0f72.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card Nihilistic Stargazer + 7f901e.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Deck Red Agenda Deck a96a99.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile b2f67d.yaml' +- !include "Custom_Model_Bag War of the Outer Gods fc7674/Card Shrine of Magh\u2019\ + an Ark\u2019at b57f26.yaml" +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card The Arcade b976f6.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of Providence + be7797.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card Arkham c21137.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile ca62fc.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card The Penthouse d9e9ca.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer + Gods dcb241.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile dcb5db.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card Zealot of Paradise + f2b1dd.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card The Burning Pit f52a2e.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile f7e308.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Card Athenaeum of the Empty + Sky fa15cd.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile fc5dce.yaml' +- !include 'Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile fe6ec3.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0.0 + SpecularColor: + b: 1.0 + g: 1.0 + r: 1.0 + SpecularIntensity: 0.0 + SpecularSharpness: 2.0 + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1655599785041387976/264E2E1DA532DC374D6E75B19AD4FEDDBEAA22F0/ + MaterialIndex: 3 + MeshURL: https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj + NormalURL: '' + TypeIndex: 6 +Description: Scenario Pack +DragSelectable: true +GMNotes: '' +GUID: fc7674 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Model_Bag War of the Outer Gods fc7674.ttslua' +LuaScriptState: '{"ml":{"012f6e":{"lock":false,"pos":{"x":-33.1674919128418,"y":1.6287933588028,"z":3.70239424705505},"rot":{"x":359.931579589844,"y":315.000122070313,"z":359.955413818359}},"01a1bf":{"lock":false,"pos":{"x":-2.68847990036011,"y":1.61911654472351,"z":-5.04854345321655},"rot":{"x":0.016835656017065,"y":179.999969482422,"z":0.0802559405565262}},"119ff4":{"lock":false,"pos":{"x":-2.72466206550598,"y":1.62076032161713,"z":0.373312205076218},"rot":{"x":0.0168317202478647,"y":180.002822875977,"z":0.0802567973732948}},"1375c8":{"lock":false,"pos":{"x":-0.0221965294331312,"y":1.61770987510681,"z":2.87429475784302},"rot":{"x":0.0168357416987419,"y":179.999984741211,"z":0.0802559703588486}},"1ade36":{"lock":false,"pos":{"x":-3.95589280128479,"y":1.59753930568695,"z":-10.4411783218384},"rot":{"x":359.919738769531,"y":270.000183105469,"z":0.0168369878083467}},"262233":{"lock":false,"pos":{"x":-23.6764488220215,"y":1.62806642055511,"z":-0.0300161112099886},"rot":{"x":359.920104980469,"y":270.000305175781,"z":0.0168391820043325}},"308d21":{"lock":false,"pos":{"x":-20.245641708374,"y":1.60910320281982,"z":-1.98555278778076},"rot":{"x":359.931579589844,"y":314.999969482422,"z":359.955413818359}},"30c009":{"lock":false,"pos":{"x":-26.6726875305176,"y":1.61866891384125,"z":0.0717482194304466},"rot":{"x":359.920104980469,"y":270.008697509766,"z":0.0168638881295919}},"3111c8":{"lock":false,"pos":{"x":-3.92764544487,"y":1.70105218887329,"z":5.75713586807251},"rot":{"x":359.919738769531,"y":270,"z":180.016815185547}},"354cd0":{"lock":false,"pos":{"x":-36.7732048034668,"y":1.63610136508942,"z":11.4600048065186},"rot":{"x":359.983154296875,"y":-3.54230651282705E-05,"z":359.920013427734}},"36b4eb":{"lock":false,"pos":{"x":-1.47177505493164,"y":1.47563123703003,"z":-26.9304103851318},"rot":{"x":359.920135498047,"y":269.986267089844,"z":0.0168912038207054}},"473d21":{"lock":false,"pos":{"x":-36.773136138916,"y":1.64856243133545,"z":7.56998348236084},"rot":{"x":359.920104980469,"y":270.000305175781,"z":0.0168393068015575}},"638f24":{"lock":false,"pos":{"x":-36.7732353210449,"y":1.62935066223145,"z":-11.5099897384644},"rot":{"x":359.983154296875,"y":3.21962652378716E-05,"z":359.920043945313}},"677a88":{"lock":false,"pos":{"x":-33.8202323913574,"y":1.66120958328247,"z":16.7586078643799},"rot":{"x":359.393829345703,"y":269.9990234375,"z":0.0168407447636127}},"7234af":{"lock":false,"pos":{"x":-40.2050437927246,"y":1.63523387908936,"z":-7.77354335784912},"rot":{"x":359.920104980469,"y":270.008758544922,"z":0.0168676227331162}},"790c3a":{"lock":false,"pos":{"x":-17.1199398040771,"y":1.62006711959839,"z":3.85998702049255},"rot":{"x":359.920104980469,"y":270.000305175781,"z":0.0168393459171057}},"7b0f72":{"lock":false,"pos":{"x":1.69660317897797,"y":1.55831670761108,"z":14.2788076400757},"rot":{"x":359.955139160156,"y":224.997817993164,"z":0.0686722248792648}},"7f901e":{"lock":false,"pos":{"x":-33.5703430175781,"y":1.63791847229004,"z":-13.4511194229126},"rot":{"x":359.920104980469,"y":269.999969482422,"z":0.0168396458029747}},"a96a99":{"lock":false,"pos":{"x":-5.41815280914307,"y":1.62370681762695,"z":-2.43894195556641},"rot":{"x":0.0168357584625483,"y":179.999938964844,"z":0.0802559182047844}},"b2f67d":{"lock":false,"pos":{"x":-40.2400131225586,"y":1.63415777683258,"z":-11.6012916564941},"rot":{"x":359.931579589844,"y":315,"z":359.955413818359}},"b57f26":{"lock":false,"pos":{"x":-17.119945526123,"y":1.61778891086578,"z":-3.83001303672791},"rot":{"x":359.920288085938,"y":270.000335693359,"z":0.0156270749866962}},"b976f6":{"lock":false,"pos":{"x":-43.3699989318848,"y":1.6532735824585,"z":-7.70001935958862},"rot":{"x":359.920104980469,"y":270.000183105469,"z":0.0168393533676863}},"be7797":{"lock":false,"pos":{"x":-36.7731857299805,"y":1.64407479763031,"z":-7.70001840591431},"rot":{"x":359.920104980469,"y":270.000213623047,"z":0.0168392769992352}},"c21137":{"lock":false,"pos":{"x":-30.220832824707,"y":1.6371922492981,"z":-0.0298343636095524},"rot":{"x":359.920104980469,"y":269.979156494141,"z":0.0168686490505934}},"ca62fc":{"lock":false,"pos":{"x":-17.119909286499,"y":1.6053192615509,"z":-0.0299910623580217},"rot":{"x":359.983154296875,"y":4.37779726780718E-06,"z":359.920043945313}},"d9e9ca":{"lock":false,"pos":{"x":-43.3699531555176,"y":1.65776121616364,"z":7.56960582733154},"rot":{"x":359.920104980469,"y":269.998138427734,"z":0.0168421845883131}},"dcb241":{"lock":false,"pos":{"x":-3.61810517311096,"y":1.58212554454803,"z":-14.987250328064},"rot":{"x":359.919738769531,"y":270.025085449219,"z":0.0168026685714722}},"dcb5db":{"lock":false,"pos":{"x":-40.8296546936035,"y":1.64187622070313,"z":11.8642768859863},"rot":{"x":359.955413818359,"y":224.999938964844,"z":0.0683624520897865}},"f2b1dd":{"lock":false,"pos":{"x":-14.0998258590698,"y":1.6266473531723,"z":-5.97682428359985},"rot":{"x":359.408386230469,"y":270.001953125,"z":0.0172571241855621}},"f52a2e":{"lock":false,"pos":{"x":-36.7731704711914,"y":1.65080463886261,"z":15.1899890899658},"rot":{"x":359.920074462891,"y":270.000244140625,"z":0.0169998127967119}},"f7e308":{"lock":false,"pos":{"x":-39.8396644592285,"y":1.63923645019531,"z":7.5797963142395},"rot":{"x":359.920104980469,"y":270.008666992188,"z":0.0168647188693285}},"fa15cd":{"lock":false,"pos":{"x":-36.7732353210449,"y":1.64184725284576,"z":-15.2800159454346},"rot":{"x":359.920104980469,"y":270.000244140625,"z":0.0168394334614277}},"fc5dce":{"lock":false,"pos":{"x":-33.6138725280762,"y":1.62700366973877,"z":-4.50444030761719},"rot":{"x":359.955413818359,"y":225.000045776367,"z":0.0683886557817459}},"fe6ec3":{"lock":false,"pos":{"x":-20.3256988525391,"y":1.61053478717804,"z":2.50686287879944},"rot":{"x":359.955200195313,"y":225.168884277344,"z":0.068253792822361}}}}' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: War of the Outer Gods +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 12.25 + posY: 1.45 + posZ: -36.01 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 2.21 + scaleY: 0.46 + scaleZ: 2.42 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Arkham c21137.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Arkham c21137.yaml new file mode 100644 index 000000000..bc275baa9 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Arkham c21137.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231813 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: Ritual Site. Town. +DragSelectable: true +GMNotes: '' +GUID: c21137 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Arkham +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -30.22 + posY: 1.64 + posZ: -0.03 + rotX: 359.92 + rotY: 269.98 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Athenaeum of the Empty Sky fa15cd.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Athenaeum of the Empty Sky fa15cd.yaml new file mode 100644 index 000000000..0fc37ff67 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Athenaeum of the Empty Sky fa15cd.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231815 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: Ritual Site. Providence. +DragSelectable: true +GMNotes: '' +GUID: fa15cd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Athenaeum of the Empty Sky +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -36.77 + posY: 1.64 + posZ: -15.28 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Chateau Ramezay 790c3a.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Chateau Ramezay 790c3a.yaml new file mode 100644 index 000000000..cff9d01ec --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Chateau Ramezay 790c3a.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231818 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: "Montr\xE9al." +DragSelectable: true +GMNotes: '' +GUID: 790c3a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Chateau Ramezay +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 1.62 + posZ: 3.86 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Disciple of the Swarm 677a88.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Disciple of the Swarm 677a88.yaml new file mode 100644 index 000000000..599f2bf3e --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Disciple of the Swarm 677a88.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231604 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false +Description: Humanoid. Cultist. +DragSelectable: true +GMNotes: '' +GUID: 677a88 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Disciple of the Swarm +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -33.82 + posY: 1.66 + posZ: 16.76 + rotX: 359.39 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Nihilistic Stargazer 7f901e.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Nihilistic Stargazer 7f901e.yaml new file mode 100644 index 000000000..529fc040e --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Nihilistic Stargazer 7f901e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231600 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false +Description: Humanoid. Cultist. +DragSelectable: true +GMNotes: '' +GUID: 7f901e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Nihilistic Stargazer +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -33.57 + posY: 1.64 + posZ: -13.45 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Scenario 1ade36.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Scenario 1ade36.yaml new file mode 100644 index 000000000..a484fa085 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Scenario 1ade36.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231800 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: War of the Outer Gods +DragSelectable: true +GMNotes: '' +GUID: 1ade36 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scenario +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -3.96 + posY: 1.6 + posZ: -10.44 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Shrine of Magh’an Ark’at b57f26.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Shrine of Magh’an Ark’at b57f26.yaml new file mode 100644 index 000000000..15be45801 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Shrine of Magh’an Ark’at b57f26.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231819 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: "Ritual Site. Montr\xE9al." +DragSelectable: true +GMNotes: '' +GUID: b57f26 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "Shrine of Magh\u2019an Ark\u2019at" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 1.62 + posZ: -3.83 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of Montréal 262233.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of Montréal 262233.yaml new file mode 100644 index 000000000..1c1e245c1 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of Montréal 262233.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231817 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: "Montr\xE9al." +DragSelectable: true +GMNotes: '' +GUID: '262233' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: "Streets of Montr\xE9al" +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -23.68 + posY: 1.63 + posZ: -0.03 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of New York City 473d21.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of New York City 473d21.yaml new file mode 100644 index 000000000..743d91b70 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of New York City 473d21.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231820 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: New York City. +DragSelectable: true +GMNotes: '' +GUID: 473d21 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Streets of New York City +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -36.77 + posY: 1.65 + posZ: 7.57 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of Providence be7797.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of Providence be7797.yaml new file mode 100644 index 000000000..1487e93c3 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Streets of Providence be7797.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231814 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: Providence. +DragSelectable: true +GMNotes: '' +GUID: be7797 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Streets of Providence +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -36.77 + posY: 1.64 + posZ: -7.7 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Arcade b976f6.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Arcade b976f6.yaml new file mode 100644 index 000000000..5b6195cf9 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Arcade b976f6.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231816 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: Providence. +DragSelectable: true +GMNotes: '' +GUID: b976f6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Arcade +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -43.37 + posY: 1.65 + posZ: -7.7 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Burning Pit f52a2e.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Burning Pit f52a2e.yaml new file mode 100644 index 000000000..d0dfff6b4 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Burning Pit f52a2e.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231821 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: Ritual Site. New York City. +DragSelectable: true +GMNotes: '' +GUID: f52a2e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Burning Pit +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -36.77 + posY: 1.65 + posZ: 15.19 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Penthouse d9e9ca.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Penthouse d9e9ca.yaml new file mode 100644 index 000000000..e5985f952 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card The Penthouse d9e9ca.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231822 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: New York City. +DragSelectable: true +GMNotes: '' +GUID: d9e9ca +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Penthouse +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -43.37 + posY: 1.66 + posZ: 7.57 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Zealot of Paradise f2b1dd.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Zealot of Paradise f2b1dd.yaml new file mode 100644 index 000000000..1f3cec7d7 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Card Zealot of Paradise f2b1dd.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231602 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false +Description: Humanoid. Cultist. +DragSelectable: true +GMNotes: '' +GUID: f2b1dd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Zealot of Paradise +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -14.1 + posY: 1.63 + posZ: -5.98 + rotX: 359.41 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72.yaml new file mode 100644 index 000000000..297f293dd --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72.yaml @@ -0,0 +1,62 @@ +Autoraise: true +ColorDiffuse: + b: 0.02148666 + g: 0.00100758043 + r: 0.02148666 +ContainedObjects: +- !include 'Custom_Model_Bag Set-aside 7b0f72/Deck Story Assets 377a7c.yaml' +- !include 'Custom_Model_Bag Set-aside 7b0f72/Card Hub Dimension 377fcf.yaml' +- !include 'Custom_Model_Bag Set-aside 7b0f72/Deck Death of Stars db0ac4.yaml' +- !include 'Custom_Model_Bag Set-aside 7b0f72/Deck Swarm of Assimilation a5b82d.yaml' +- !include 'Custom_Model_Bag Set-aside 7b0f72/Deck Children of Paradise 6f56e0.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + DiffuseURL: http://cloud-3.steamusercontent.com/ugc/764975951334960553/C518D80E31E27DB23EEAC8CF9253E59798865790/ + MaterialIndex: 1 + MeshURL: http://cloud-3.steamusercontent.com/ugc/764975951334964971/3078F312706FC974833ECD2A359B87FD4F283509/ + NormalURL: http://cloud-3.steamusercontent.com/ugc/764975951334960069/E70E4A58A1B7827F1E5E2AF9FF44DF0BD5DA33F7/ + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7b0f72 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: Set-aside +PhysicsMaterial: + BounceCombine: 0 + Bounciness: 0.0 + DynamicFriction: 0.6 + FrictionCombine: 0 + StaticFriction: 0.6 +Rigidbody: + AngularDrag: 5.0 + Drag: 5.0 + Mass: 1.375 + UseGravity: true +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 1.7 + posY: 1.56 + posZ: 14.28 + rotX: 359.96 + rotY: 225.0 + rotZ: 0.07 + scaleX: 2.0 + scaleY: 2.0 + scaleZ: 2.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Card Hub Dimension 377fcf.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Card Hub Dimension 377fcf.yaml new file mode 100644 index 000000000..08f6f9775 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Card Hub Dimension 377fcf.yaml @@ -0,0 +1,45 @@ +Autoraise: true +CardID: 231823 +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +CustomDeck: + '2318': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +Description: Portal. +DragSelectable: true +GMNotes: '' +GUID: 377fcf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hub Dimension +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 1.7 + posY: 3.66 + posZ: 14.28 + rotX: 359.95 + rotY: 225.0 + rotZ: 0.06 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Children of Paradise 6f56e0.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Children of Paradise 6f56e0.yaml new file mode 100644 index 000000000..9774a52f4 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Children of Paradise 6f56e0.yaml @@ -0,0 +1,468 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231618 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 22dee5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunt Down + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.9655266 + posY: 1.60041463 + posZ: 15.0442657 + rotX: 359.9521 + rotY: 269.998169 + rotZ: 179.901016 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231618 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: eb6b0a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunt Down + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.9593334 + posY: 1.61029816 + posZ: 14.8629065 + rotX: 359.936066 + rotY: 270.000916 + rotZ: 179.27977 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231618 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: '931381' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hunt Down + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.2444954 + posY: 1.58440363 + posZ: 15.149147 + rotX: 359.936066 + rotY: 270.0021 + rotZ: 180.383942 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231617 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Mutated. + DragSelectable: true + GMNotes: '' + GUID: bf8a7a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Bringer of Paradise + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.843523 + posY: 1.56844652 + posZ: 15.3794861 + rotX: 359.9361 + rotY: 270.001 + rotZ: 179.699875 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231617 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Mutated. + DragSelectable: true + GMNotes: '' + GUID: f77e18 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Bringer of Paradise + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.9258881 + posY: 1.60118151 + posZ: 15.200263 + rotX: 359.936035 + rotY: 270.0004 + rotZ: 181.774658 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231616 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Monster. Shoggoth. Mutated. + DragSelectable: true + GMNotes: '' + GUID: 5c0736 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Horrific Shoggoth + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.9776382 + posY: 1.54621756 + posZ: 15.2099876 + rotX: 359.9361 + rotY: 270.0021 + rotZ: 180.356964 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231615 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Grotesque Abomination + DragSelectable: true + GMNotes: '' + GUID: 97da98 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Vile Broodmaster + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.9694576 + posY: 1.51208329 + posZ: 15.1341572 + rotX: 359.936066 + rotY: 269.999847 + rotZ: 180.32933 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231614 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: The Child of Paradise + DragSelectable: true + GMNotes: '' + GUID: e733f3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: "Magh\u2019an Ark\u2019at" + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.7804813 + posY: 1.47338533 + posZ: 15.1225281 + rotX: 359.920135 + rotY: 269.999084 + rotZ: 180.016876 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231925 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: '' + DragSelectable: true + GMNotes: '' + GUID: c6b942 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Egg Hatches + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.6733627 + posY: 1.6006813 + posZ: 7.98546362 + rotX: 359.936127 + rotY: 270.001251 + rotZ: 0.328636825 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +DeckIDs: +- 231618 +- 231618 +- 231618 +- 231617 +- 231617 +- 231616 +- 231615 +- 231614 +- 231925 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 6f56e0 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Children of Paradise +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 24.38 + posY: 3.23 + posZ: -55.71 + rotX: 359.49 + rotY: 179.96 + rotZ: 0.0 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Death of Stars db0ac4.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Death of Stars db0ac4.yaml new file mode 100644 index 000000000..3c79bf269 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Death of Stars db0ac4.yaml @@ -0,0 +1,468 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231613 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: 0517b9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Inevitable End + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.8063831 + posY: 1.65103185 + posZ: 13.6350107 + rotX: 359.952057 + rotY: 269.998535 + rotZ: 178.176025 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231613 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: 68425e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Inevitable End + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.6144676 + posY: 1.59726548 + posZ: 13.729125 + rotX: 359.93576 + rotY: 270.000183 + rotZ: 180.206726 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231613 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: 5732fe + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Inevitable End + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.6001186 + posY: 1.60073757 + posZ: 13.5453 + rotX: 359.936066 + rotY: 270.00058 + rotZ: 179.281555 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231612 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Monster. + DragSelectable: true + GMNotes: '' + GUID: cdae10 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ethereal Entity + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.3919048 + posY: 1.673632 + posZ: 13.6379747 + rotX: 359.935974 + rotY: 270.001678 + rotZ: 174.2237 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231612 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Monster. + DragSelectable: true + GMNotes: '' + GUID: 5be6f1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ethereal Entity + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.5273056 + posY: 1.66287768 + posZ: 13.9757547 + rotX: 359.936035 + rotY: 270.006927 + rotZ: 174.077332 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231611 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Monster. + DragSelectable: true + GMNotes: '' + GUID: '781168' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hune-Stitched Herald + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.5908165 + posY: 1.58184993 + posZ: 14.1332388 + rotX: 359.9361 + rotY: 270.000183 + rotZ: 181.349854 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231610 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Servant of Silenus + DragSelectable: true + GMNotes: '' + GUID: 4303a1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Inescapable Maw + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.5069275 + posY: 1.54023755 + posZ: 13.8827362 + rotX: 359.9232 + rotY: 270.000946 + rotZ: 178.091782 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231609 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: The Empty Sky + DragSelectable: true + GMNotes: '' + GUID: 52f230 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Silenus + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 18.5073242 + posY: 1.47341692 + posZ: 13.9362888 + rotX: 359.920135 + rotY: 270.008423 + rotZ: 180.016861 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231924 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 4a08fd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Silenus Descends + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 20.066185 + posY: 1.597573 + posZ: 10.6729059 + rotX: 359.9361 + rotY: 270.0004 + rotZ: 0.1488698 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +DeckIDs: +- 231613 +- 231613 +- 231613 +- 231612 +- 231612 +- 231611 +- 231610 +- 231609 +- 231924 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: db0ac4 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Death of Stars +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 23.66 + posY: 3.21 + posZ: -66.34 + rotX: 0.02 + rotY: 180.0 + rotZ: 0.08 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Story Assets 377a7c.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Story Assets 377a7c.yaml new file mode 100644 index 000000000..3d03178d3 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Story Assets 377a7c.yaml @@ -0,0 +1,276 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231727 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Mask of the Burning Pit + DragSelectable: true + GMNotes: '' + GUID: 19094d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Enchanted Skull + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -2.45017624 + posY: 1.48865032 + posZ: -33.5508232 + rotX: 359.920135 + rotY: 270.002441 + rotZ: 0.01686965 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231726 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Shellblade Tribute + DragSelectable: true + GMNotes: '' + GUID: db8043 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Blade of Ark'at + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -2.714489 + posY: 1.53159308 + posZ: -33.6966667 + rotX: 359.920135 + rotY: 270.0113 + rotZ: 0.0168601889 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231725 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Gift of the Void + DragSelectable: true + GMNotes: '' + GUID: 4b2e72 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dreaded End + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -2.43279958 + posY: 1.554089 + posZ: -33.7505569 + rotX: 359.93277 + rotY: 269.999542 + rotZ: 0.0142531106 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231724 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Doorway to Another World + DragSelectable: true + GMNotes: '' + GUID: 1ab785 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Pocket Portal + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -2.38399434 + posY: 1.56351936 + posZ: -33.91077 + rotX: 359.920135 + rotY: 269.9985 + rotZ: 0.01694017 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231723 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Interwoven Distortion + DragSelectable: true + GMNotes: '' + GUID: 4e1e79 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Cloak of the Outer Realm + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -2.24002361 + posY: 1.62386155 + posZ: -33.49328 + rotX: 359.918976 + rotY: 269.976746 + rotZ: 2.66497183 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2317': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false +DeckIDs: +- 231727 +- 231726 +- 231725 +- 231724 +- 231723 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 377a7c +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Story Assets +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -0.11 + posY: 3.57 + posZ: -6.47 + rotX: 359.92 + rotY: 270.0 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Swarm of Assimilation a5b82d.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Swarm of Assimilation a5b82d.yaml new file mode 100644 index 000000000..da4bb9aa0 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Model_Bag Set-aside 7b0f72/Deck Swarm of Assimilation a5b82d.yaml @@ -0,0 +1,468 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231622 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Curse. + DragSelectable: true + GMNotes: '' + GUID: 81af35 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Transmogrify + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.71407 + posY: 1.59632766 + posZ: 1.55447733 + rotX: 359.953461 + rotY: 270.002136 + rotZ: 179.576736 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231622 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Curse. + DragSelectable: true + GMNotes: '' + GUID: 7073c3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Transmogrify + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.273428 + posY: 1.58779347 + posZ: 1.13905919 + rotX: 359.935974 + rotY: 270.0004 + rotZ: 180.217773 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Creature. Insect. + DragSelectable: true + GMNotes: '' + GUID: 88099d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Trylogog + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.6186829 + posY: 1.53423321 + posZ: 2.04295731 + rotX: 359.932434 + rotY: 270.000122 + rotZ: 0.0142426938 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Creature. Insect. + DragSelectable: true + GMNotes: '' + GUID: c9d6ee + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Trylogog + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.52809 + posY: 1.54826045 + posZ: 1.86026812 + rotX: 359.932617 + rotY: 270.000061 + rotZ: 0.0128829842 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Creature. Insect. + DragSelectable: true + GMNotes: '' + GUID: cfbbf3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Trylogog + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.6171532 + posY: 1.560172 + posZ: 2.21293426 + rotX: 359.9314 + rotY: 270.000031 + rotZ: 0.0137510356 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231621 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Creature. Insect. + DragSelectable: true + GMNotes: '' + GUID: 23027c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Trylogog + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.532 + posY: 1.57031822 + posZ: 1.83674049 + rotX: 359.930542 + rotY: 270.0 + rotZ: 0.0136441989 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231620 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Monster. Insect. Servitor. Elite. + DragSelectable: true + GMNotes: '' + GUID: 41caae + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Droning Horde + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.451189 + posY: 1.572554 + posZ: 2.01011562 + rotX: 359.934937 + rotY: 269.999481 + rotZ: 0.011245654 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231619 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: The Lord of Swarms + DragSelectable: true + GMNotes: '' + GUID: 05dc30 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ezel-zen-rezl + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.6948814 + posY: 1.581778 + posZ: 1.69483256 + rotX: 359.920135 + rotY: 269.999054 + rotZ: 0.01693217 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231926 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: '' + DragSelectable: true + GMNotes: '' + GUID: e6bbf7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ezel-zen-rezl Emerges + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 19.59823 + posY: 1.59261811 + posZ: 5.17256975 + rotX: 359.9361 + rotY: 270.000122 + rotZ: 0.006655739 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +DeckIDs: +- 231622 +- 231622 +- 231621 +- 231621 +- 231621 +- 231621 +- 231620 +- 231619 +- 231926 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a5b82d +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Swarm of Assimilation +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 23.79 + posY: 3.22 + posZ: -61.91 + rotX: 0.02 + rotY: 180.0 + rotZ: 0.08 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_PDF War of the Outer Gods 36b4eb.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_PDF War of the Outer Gods 36b4eb.yaml new file mode 100644 index 000000000..d9d7303d9 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_PDF War of the Outer Gods 36b4eb.yaml @@ -0,0 +1,39 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomPDF: + PDFPage: 0 + PDFPageOffset: 0 + PDFPassword: '' + PDFUrl: http://cloud-3.steamusercontent.com/ugc/1655599785041394242/A4C89AB29B2BB58503313D162A577A4D5E073648/ +Description: Scenario Guide +DragSelectable: true +GMNotes: '' +GUID: 36b4eb +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_PDF +Nickname: War of the Outer Gods +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -1.47 + posY: 1.48 + posZ: -26.93 + rotX: 359.92 + rotY: 269.99 + rotZ: 0.02 + scaleX: 3.0 + scaleY: 1.0 + scaleZ: 3.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 012f6e.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 012f6e.yaml new file mode 100644 index 000000000..6af34a424 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 012f6e.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 012f6e +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -33.17 + posY: 1.63 + posZ: 3.7 + rotX: 359.93 + rotY: 315.0 + rotZ: 359.96 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 308d21.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 308d21.yaml new file mode 100644 index 000000000..57b04f533 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 308d21.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 308d21 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -20.25 + posY: 1.61 + posZ: -1.99 + rotX: 359.93 + rotY: 315.0 + rotZ: 359.96 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 30c009.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 30c009.yaml new file mode 100644 index 000000000..94a0d65f1 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 30c009.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 30c009 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -26.67 + posY: 1.62 + posZ: 0.07 + rotX: 359.92 + rotY: 270.01 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 354cd0.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 354cd0.yaml new file mode 100644 index 000000000..5ab0f5bb8 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 354cd0.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 354cd0 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -36.77 + posY: 1.64 + posZ: 11.46 + rotX: 359.98 + rotY: 0.0 + rotZ: 359.92 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 638f24.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 638f24.yaml new file mode 100644 index 000000000..cf96498e5 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 638f24.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 638f24 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -36.77 + posY: 1.63 + posZ: -11.51 + rotX: 359.98 + rotY: 0.0 + rotZ: 359.92 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 7234af.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 7234af.yaml new file mode 100644 index 000000000..d988fc4da --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile 7234af.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7234af +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -40.21 + posY: 1.64 + posZ: -7.77 + rotX: 359.92 + rotY: 270.01 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile b2f67d.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile b2f67d.yaml new file mode 100644 index 000000000..98f0ca2a7 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile b2f67d.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b2f67d +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -40.24 + posY: 1.63 + posZ: -11.6 + rotX: 359.93 + rotY: 315.0 + rotZ: 359.96 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile ca62fc.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile ca62fc.yaml new file mode 100644 index 000000000..41f513ba5 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile ca62fc.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: ca62fc +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -17.12 + posY: 1.61 + posZ: -0.03 + rotX: 359.98 + rotY: 0.0 + rotZ: 359.92 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile dcb5db.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile dcb5db.yaml new file mode 100644 index 000000000..dfd35acd0 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile dcb5db.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dcb5db +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -40.83 + posY: 1.64 + posZ: 11.86 + rotX: 359.96 + rotY: 225.0 + rotZ: 0.07 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile f7e308.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile f7e308.yaml new file mode 100644 index 000000000..4ec62b188 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile f7e308.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: f7e308 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -39.84 + posY: 1.64 + posZ: 7.58 + rotX: 359.92 + rotY: 270.01 + rotZ: 0.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile fc5dce.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile fc5dce.yaml new file mode 100644 index 000000000..d2a40ac6f --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile fc5dce.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fc5dce +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -33.61 + posY: 1.63 + posZ: -4.5 + rotX: 359.96 + rotY: 225.0 + rotZ: 0.07 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile fe6ec3.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile fe6ec3.yaml new file mode 100644 index 000000000..7f9a19a79 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile fe6ec3.yaml @@ -0,0 +1,135 @@ +Autoraise: true +ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/vppt2my.png + ImageURL: https://i.imgur.com/vppt2my.png + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: fe6ec3 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: '' +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/HyfE8m8.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 44b0c5 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -39.7933121 + posY: 1.63758957 + posZ: 2.038383 + rotX: 359.9201 + rotY: 269.9961 + rotZ: 0.0168742146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 0.6045295 + g: 0.6045295 + r: 0.6045295 + CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: https://i.imgur.com/HyfE8m8.png + ImageURL: https://i.imgur.com/dHKBLoD.png + WidthScale: 0.0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5b38c6 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Custom_Tile + Nickname: '' + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -38.8217163 + posY: 1.99356019 + posZ: 0.4159239 + rotX: 359.9201 + rotY: 272.9828 + rotZ: 0.01687373 + scaleX: 0.8 + scaleY: 1.0 + scaleZ: 0.8 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -20.33 + posY: 1.61 + posZ: 2.51 + rotX: 359.96 + rotY: 225.17 + rotZ: 0.07 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.ttslua new file mode 100644 index 000000000..cd3338fb2 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.ttslua @@ -0,0 +1,25 @@ +name = 'WotOG' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.yaml new file mode 100644 index 000000000..29724c288 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/949588657194710961/D864BCCCC1C811EC7F0AED69D1C30C678D3D9FC9/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/965354846165100486/3DC8FCEF364B30758B09EF96AF9458F2B8E64D56/ + WidthScale: 0.0 +Description: click to set chaos token difficulty +DragSelectable: true +GMNotes: '' +GUID: dcb241 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: !include 'Custom_Tile War of the Outer Gods dcb241.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: War of the Outer Gods +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -3.62 + posY: 1.58 + posZ: -14.99 + rotX: 359.92 + rotY: 270.03 + rotZ: 0.02 + scaleX: 2.2 + scaleY: 1.0 + scaleZ: 2.2 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Act Deck 01a1bf.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Act Deck 01a1bf.yaml new file mode 100644 index 000000000..8c68f0ec6 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Act Deck 01a1bf.yaml @@ -0,0 +1,184 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231912 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Act 3 + DragSelectable: true + GMNotes: '' + GUID: d552f6 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Close All Portals + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -9.69691849 + posY: 1.50093746 + posZ: -26.1329365 + rotX: 0.0168717485 + rotY: 179.999985 + rotZ: 0.0798770338 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231911 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Act 2 + DragSelectable: true + GMNotes: '' + GUID: e8a8f4 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Close the Portal + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -9.438414 + posY: 1.53242874 + posZ: -26.3099174 + rotX: -0.00229730317 + rotY: 179.858627 + rotZ: 0.06725734 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231910 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Act 1 + DragSelectable: true + GMNotes: '' + GUID: 78ec38 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: War of the Outer Gods + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -9.413708 + posY: 1.56627214 + posZ: -26.4102135 + rotX: -0.00158173218 + rotY: 179.2129 + rotZ: 0.0670934245 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +DeckIDs: +- 231912 +- 231911 +- 231910 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 01a1bf +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Act Deck +SidewaysCard: true +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -2.69 + posY: 1.62 + posZ: -5.05 + rotX: 0.02 + rotY: 180.0 + rotZ: 0.08 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Blue Agenda Deck 119ff4.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Blue Agenda Deck 119ff4.yaml new file mode 100644 index 000000000..bcbc7f136 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Blue Agenda Deck 119ff4.yaml @@ -0,0 +1,184 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231903 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 3 + DragSelectable: true + GMNotes: '' + GUID: eb72a0 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Summoning Nears Completion + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -7.792643 + posY: 1.4987694 + posZ: -33.63362 + rotX: 0.0165955983 + rotY: 180.002731 + rotZ: 0.225124851 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231902 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 2 + DragSelectable: true + GMNotes: '' + GUID: 2b1d57 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Summoning Progresses + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -7.761172 + posY: 1.53372061 + posZ: -33.5671158 + rotX: 0.0338502228 + rotY: 180.001892 + rotZ: 0.0916196853 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231901 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 1 + DragSelectable: true + GMNotes: '' + GUID: 67ab8f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Summoning of Silenus + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -7.59458876 + posY: 1.56102884 + posZ: -34.09421 + rotX: 0.0168766119 + rotY: 180.010666 + rotZ: 0.0798862055 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +DeckIDs: +- 231903 +- 231902 +- 231901 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 119ff4 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Blue Agenda Deck +SidewaysCard: true +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -2.72 + posY: 1.62 + posZ: 0.37 + rotX: 0.02 + rotY: 180.0 + rotZ: 0.08 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Encounter Deck 3111c8.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Encounter Deck 3111c8.yaml new file mode 100644 index 000000000..423310095 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Encounter Deck 3111c8.yaml @@ -0,0 +1,928 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231605 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 25bc9c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Feast of Locusts + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.5708752 + posY: 1.51862586 + posZ: 10.9630184 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168756321 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231607 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: 14ab95 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ravages of War + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.6831646 + posY: 1.47502732 + posZ: 10.7695866 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.016873138 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231604 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 97aad7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Disciple of the Swarm + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.74577 + posY: 1.518173 + posZ: 10.7725534 + rotX: 359.920135 + rotY: 269.999969 + rotZ: 0.0168734342 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231603 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: f5b3a8 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Predator's Call + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.2710571 + posY: 1.51897573 + posZ: 10.6280336 + rotX: 359.920135 + rotY: 270.0 + rotZ: 0.0168745946 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232601 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2326': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038742847/1870E45DD453FA9A0D717AA5DA617B2ECCE4E881/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false + Description: Humanoid. Mutated. + DragSelectable: true + GMNotes: '' + GUID: 0ed2e7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Bringer of Paradise + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -1.63098741 + posY: 3.50143 + posZ: 5.06057835 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168735068 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231605 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 6bb1ce + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Feast of Locusts + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.4059544 + posY: 1.47543192 + posZ: 10.83146 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168757513 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231606 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 5c6869 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hellfire + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.1108189 + posY: 1.55837166 + posZ: 10.4981527 + rotX: 359.9214 + rotY: 270.0 + rotZ: 0.0162979662 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231601 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: a85a25 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Death and Decay + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.5927639 + posY: 1.47310853 + posZ: 8.559571 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.01687484 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231606 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: 4a7753 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hellfire + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.11085 + posY: 1.519193 + posZ: 10.498147 + rotX: 359.920135 + rotY: 270.0 + rotZ: 0.01687311 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231608 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Omen. + DragSelectable: true + GMNotes: '' + GUID: 64c3c1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: While They Sleep + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 14.2225637 + posY: 1.9361347 + posZ: 8.048464 + rotX: 359.952057 + rotY: 270.0005 + rotZ: 180.33223 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232600 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2326': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038742847/1870E45DD453FA9A0D717AA5DA617B2ECCE4E881/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false + Description: Monster. + DragSelectable: true + GMNotes: '' + GUID: 2c7560 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ethereal Entity + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -1.18974459 + posY: 3.371097 + posZ: 4.92624569 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168716535 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231608 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Omen. + DragSelectable: true + GMNotes: '' + GUID: 9219b2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: While They Sleep + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.4261475 + posY: 1.51713014 + posZ: 11.57154 + rotX: 359.920135 + rotY: 269.9998 + rotZ: 0.0168739036 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231600 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 033e76 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Nihilistic Stargazer + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -4.079235 + posY: 1.77775574 + posZ: -33.9225426 + rotX: 359.932831 + rotY: 269.999725 + rotZ: 0.0141735235 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231602 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Humanoid. Cultist. + DragSelectable: true + GMNotes: '' + GUID: 821dbc + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Zealot of Paradise + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.15257 + posY: 1.51912189 + posZ: 10.5883894 + rotX: 359.920135 + rotY: 270.000031 + rotZ: 0.0168749318 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232602 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2326': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038742847/1870E45DD453FA9A0D717AA5DA617B2ECCE4E881/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false + Description: Creature. Insect. + DragSelectable: true + GMNotes: '' + GUID: f18934 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Trylogog + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -1.32409549 + posY: 3.50145769 + posZ: 5.059613 + rotX: 359.920135 + rotY: 269.9997 + rotZ: 0.0168731268 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231607 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Terror. + DragSelectable: true + GMNotes: '' + GUID: 8eca8b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Ravages of War + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.5168781 + posY: 1.51862109 + posZ: 10.9656143 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168732442 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231603 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Scheme. + DragSelectable: true + GMNotes: '' + GUID: eda2a9 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Predator's Call + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.2519188 + posY: 1.4755851 + posZ: 10.6223869 + rotX: 359.920135 + rotY: 270.0 + rotZ: 0.01687459 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231606 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hazard. + DragSelectable: true + GMNotes: '' + GUID: '235782' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Hellfire + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 16.1113815 + posY: 1.475746 + posZ: 10.503335 + rotX: 359.920135 + rotY: 270.0 + rotZ: 0.0168730672 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231601 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + Description: Hex. + DragSelectable: true + GMNotes: '' + GUID: 1dc235 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Death and Decay + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 17.8280926 + posY: 1.51572108 + posZ: 8.628544 + rotX: 359.920135 + rotY: 270.000061 + rotZ: 0.0168744847 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2316': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154966629/D2691F95F837F1FAF5C780BEA8BB354EBA56438B/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: false + '2326': + BackIsHidden: true + BackURL: https://i.imgur.com/sRsWiSG.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038742847/1870E45DD453FA9A0D717AA5DA617B2ECCE4E881/ + NumHeight: 2 + NumWidth: 2 + Type: 0 + UniqueBack: false +DeckIDs: +- 231605 +- 231607 +- 231604 +- 231603 +- 232601 +- 231605 +- 231606 +- 231601 +- 231606 +- 231608 +- 232600 +- 231608 +- 231600 +- 231602 +- 232602 +- 231607 +- 231603 +- 231606 +- 231601 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 3111c8 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Encounter Deck +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -3.93 + posY: 1.7 + posZ: 5.76 + rotX: 359.92 + rotY: 270.0 + rotZ: 180.02 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Green Agenda Deck 1375c8.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Green Agenda Deck 1375c8.yaml new file mode 100644 index 000000000..93cd9871a --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Green Agenda Deck 1375c8.yaml @@ -0,0 +1,184 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231906 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 3 + DragSelectable: true + GMNotes: '' + GUID: d54e23 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Incubation Nears Completion + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -10.9142447 + posY: 1.500015 + posZ: -35.02883 + rotX: 359.920074 + rotY: 270.004822 + rotZ: 0.016896205 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231905 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 2 + DragSelectable: true + GMNotes: '' + GUID: 97e6e2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Incubation Progresses + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -10.9311619 + posY: 1.53149593 + posZ: -35.15718 + rotX: 359.920074 + rotY: 269.999939 + rotZ: 0.0168403145 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231904 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 1 + DragSelectable: true + GMNotes: '' + GUID: cb3fbd + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Incubation of the Egg + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -10.83145 + posY: 1.56546783 + posZ: -34.64013 + rotX: 359.9201 + rotY: 270.000031 + rotZ: 0.0168597512 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +DeckIDs: +- 231906 +- 231905 +- 231904 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1375c8 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Green Agenda Deck +SidewaysCard: true +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -0.02 + posY: 1.62 + posZ: 2.87 + rotX: 0.02 + rotY: 180.0 + rotZ: 0.08 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Red Agenda Deck a96a99.yaml b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Red Agenda Deck a96a99.yaml new file mode 100644 index 000000000..e130b8249 --- /dev/null +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Deck Red Agenda Deck a96a99.yaml @@ -0,0 +1,184 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 231909 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 3 + DragSelectable: true + GMNotes: '' + GUID: 0d5c1c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Proliferation Nears Completion + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -10.0484533 + posY: 1.50172663 + posZ: -25.1169147 + rotX: 359.920135 + rotY: 269.999817 + rotZ: 0.01687282 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231908 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 2 + DragSelectable: true + GMNotes: '' + GUID: 07021f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Proliferation Progresses + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -9.940212 + posY: 1.54374814 + posZ: -25.16713 + rotX: 359.920135 + rotY: 269.999084 + rotZ: 0.0168739911 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 231907 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true + Description: Agenda 1 + DragSelectable: true + GMNotes: '' + GUID: 9da423 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Proliferation of the Swarm + SidewaysCard: true + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -9.852399 + posY: 1.56688607 + posZ: -25.3129272 + rotX: 359.920135 + rotY: 269.999084 + rotZ: 0.0168961678 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2319': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/1655599718154980057/D6C82658EC9D6E18D36038D7C471E38131496A73/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154978649/8221832BB708CBC005E3221AFAA9110448F75AED/ + NumHeight: 5 + NumWidth: 6 + Type: 0 + UniqueBack: true +DeckIDs: +- 231909 +- 231908 +- 231907 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a96a99 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: Red Agenda Deck +SidewaysCard: true +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -5.42 + posY: 1.62 + posZ: -2.44 + rotX: 0.02 + rotY: 180.0 + rotZ: 0.08 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057.ttslua index 901ce543c..46067f58e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Frozen Tracks 11429d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Frozen Tracks 11429d.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Frozen Tracks 11429d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Frozen Tracks 11429d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Stranded in the Urals 8077a1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Stranded in the Urals 8077a1.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Stranded in the Urals 8077a1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Stranded in the Urals 8077a1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag The Forgotten Village ddd10b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag The Forgotten Village ddd10b.ttslua index baa7b8b87..4acf9ea11 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag The Forgotten Village ddd10b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag The Forgotten Village ddd10b.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Custom_Tile Winter Winds d54710.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Custom_Tile Winter Winds d54710.ttslua index 65189ba86..600057539 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Custom_Tile Winter Winds d54710.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Custom_Tile Winter Winds d54710.ttslua @@ -1,21 +1,21 @@ -name = 'Winter Winds' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Winter Winds' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd.ttslua b/unpacked/Custom_Model_Bag Weakness decks 750fdd.ttslua index f999547e7..b25806e6f 100644 --- a/unpacked/Custom_Model_Bag Weakness decks 750fdd.ttslua +++ b/unpacked/Custom_Model_Bag Weakness decks 750fdd.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd.yaml index bf1385435..881793549 100644 --- a/unpacked/Custom_Model_Bag Weakness decks 750fdd.yaml +++ b/unpacked/Custom_Model_Bag Weakness decks 750fdd.yaml @@ -5,7 +5,7 @@ ColorDiffuse: r: 1.0 ContainedObjects: - !include 'Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks - ceacbf.yaml' + 1ae6a4.yaml' - !include 'Custom_Model_Bag Weakness decks 750fdd/Deck Return to the Dunwich Legacy 0b361d.yaml' - !include 'Custom_Model_Bag Weakness decks 750fdd/Deck The Dunwich Legacy 0da7f2.yaml' diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4.ttslua b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4.ttslua new file mode 100644 index 000000000..b25806e6f --- /dev/null +++ b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4.ttslua @@ -0,0 +1,503 @@ +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4.yaml similarity index 80% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4.yaml index 0365baa95..af9bdb71d 100644 --- a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf.yaml +++ b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4.yaml @@ -4,22 +4,22 @@ ColorDiffuse: g: 1.0 r: 1.0 ContainedObjects: -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck The Innsmouth Conspiracy 516413.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck Return to the Dunwich Legacy +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck Return to the Dunwich Legacy 0b361d.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck The Dunwich Legacy 0da7f2.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck Starter Decks 120210.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck Advanced 15e75e.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck The Path to Carcosa 193ddf.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck The Forgotten Age 62c248.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck Core 728f7e.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck Return to The Path to Carcosa +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck The Dunwich Legacy 0da7f2.yaml' +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck Starter Decks 120210.yaml' +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck Advanced 15e75e.yaml' +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck The Path to Carcosa 193ddf.yaml' +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck The Innsmouth Conspiracy 516413.yaml' +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck The Forgotten Age 62c248.yaml' +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck Core 728f7e.yaml' +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck Return to The Path to Carcosa 9c5822.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck Return to The Forgotten Age +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck Return to The Forgotten Age c0f36d.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck The Dream-Eaters c97be9.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck All Weaknesses d95bd6.yaml' -- !include 'Custom_Model_Bag Weakness decks ceacbf/Deck The Circle Undone f9215d.yaml' +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck The Dream-Eaters c97be9.yaml' +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck All Weaknesses d95bd6.yaml' +- !include 'Custom_Model_Bag Weakness decks 1ae6a4/Deck The Circle Undone f9215d.yaml' CustomMesh: CastShadows: true ColliderURL: '' @@ -40,14 +40,14 @@ CustomMesh: Description: '' DragSelectable: true GMNotes: '' -GUID: ceacbf +GUID: 1ae6a4 Grid: true GridProjection: false Hands: false HideWhenFaceDown: false IgnoreFoW: false Locked: false -LuaScript: !include 'Custom_Model_Bag Weakness decks ceacbf.ttslua' +LuaScript: !include 'Custom_Model_Bag Weakness decks 1ae6a4.ttslua' LuaScriptState: '{"ml":{"0b361d":{"lock":false,"pos":{"x":-20.9388980865479,"y":1.29235625267029,"z":83.3067016601563},"rot":{"x":0.0208030492067337,"y":270.018493652344,"z":180.016784667969}},"0da7f2":{"lock":false,"pos":{"x":-20.9388942718506,"y":1.31228566169739,"z":85.6067047119141},"rot":{"x":0.0208079889416695,"y":270.001556396484,"z":180.01676940918}},"120210":{"lock":false,"pos":{"x":-24.4533557891846,"y":1.30417060852051,"z":78.6900024414063},"rot":{"x":0.0208083149045706,"y":269.999877929688,"z":180.01676940918}},"15e75e":{"lock":false,"pos":{"x":-24.4533882141113,"y":1.30551850795746,"z":83.2946090698242},"rot":{"x":0.0208085216581821,"y":269.999725341797,"z":180.01676940918}},"193ddf":{"lock":false,"pos":{"x":-20.9388980865479,"y":1.30063784122467,"z":78.7067031860352},"rot":{"x":0.0208050366491079,"y":270.011505126953,"z":180.01676940918}},"516413":{"lock":false,"pos":{"x":-20.9389266967773,"y":1.29871940612793,"z":55.7066268920898},"rot":{"x":0.0208085887134075,"y":270.000061035156,"z":180.01676940918}},"62c248":{"lock":false,"pos":{"x":-20.9388961791992,"y":1.28899002075195,"z":71.8067016601563},"rot":{"x":0.0208067577332258,"y":270.005554199219,"z":180.01676940918}},"728f7e":{"lock":false,"pos":{"x":-24.4533824920654,"y":1.33026194572449,"z":85.594596862793},"rot":{"x":0.020808519795537,"y":269.999481201172,"z":180.01676940918}},"9c5822":{"lock":false,"pos":{"x":-20.9388961791992,"y":1.29515063762665,"z":76.4067001342773},"rot":{"x":0.0208045523613691,"y":270.013031005859,"z":180.016784667969}},"c0f36d":{"lock":false,"pos":{"x":-20.9388999938965,"y":1.28831684589386,"z":69.5068969726563},"rot":{"x":0.0208084341138601,"y":269.99951171875,"z":180.01676940918}},"c97be9":{"lock":false,"pos":{"x":-20.938928604126,"y":1.29525184631348,"z":60.3065376281738},"rot":{"x":0.0208042934536934,"y":270.014404296875,"z":180.016784667969}},"d95bd6":{"lock":false,"pos":{"x":-24.4533958435059,"y":1.49471259117126,"z":71.7899932861328},"rot":{"x":0.0207936707884073,"y":270.033325195313,"z":180.016799926758}},"e154c7":{"lock":false,"pos":{"x":-20.9389266967773,"y":1.28909134864807,"z":55.7066230773926},"rot":{"x":0.0208087246865034,"y":270.000061035156,"z":180.01676940918}},"ee093b":{"lock":false,"pos":{"x":-24.5413,"y":1.3439,"z":83.2945},"rot":{"x":0.0208,"y":269.9633,"z":180.0168}},"f9215d":{"lock":false,"pos":{"x":-20.9389209747314,"y":1.29659843444824,"z":64.9066314697266},"rot":{"x":0.0208042040467262,"y":270.014099121094,"z":180.016784667969}}}}' MaterialIndex: -1 MeasureMovement: false @@ -59,7 +59,7 @@ Sticky: true Tooltip: true Transform: posX: -20.8 - posY: 1.65 + posY: 1.64 posZ: 91.6 rotX: 0.02 rotY: 270.01 diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Advanced 15e75e.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Advanced 15e75e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Advanced 15e75e.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Advanced 15e75e.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck All Weaknesses d95bd6.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck All Weaknesses d95bd6.yaml similarity index 97% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck All Weaknesses d95bd6.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck All Weaknesses d95bd6.yaml index ff3a7f6b7..4ec7bc4a9 100644 --- a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck All Weaknesses d95bd6.yaml +++ b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck All Weaknesses d95bd6.yaml @@ -5,7 +5,7 @@ ColorDiffuse: r: 0.713235259 ContainedObjects: - Autoraise: true - CardID: 290814 + CardID: 290804 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -22,7 +22,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: ba2ae1 + GUID: 88ee43 Grid: true GridProjection: false Hands: true @@ -33,333 +33,18 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Doomed + Nickname: Hypochondria SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 73.57277 - posY: 1.367833 - posZ: 67.00315 - rotX: 0.0171475261 - rotY: 269.999878 - rotZ: 0.014829508 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290815 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: da227d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Thing That Follows - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 77.00673 - posY: 1.37194359 - posZ: 76.50519 - rotX: 0.0208081231 - rotY: 269.999054 - rotZ: 0.0167726167 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290816 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: b239d7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mob Enforcer - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.38398 - posY: 1.36537349 - posZ: 75.9246 - rotX: 0.02080847 - rotY: 269.999084 - rotZ: 0.0167746339 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290320 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Circumstances Beyond Your Control - DragSelectable: true - GMNotes: '' - GUID: cc65f3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "The Tower \u2022 XVI" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.4137726 - posY: 3.57692623 - posZ: 5.186873 - rotX: 0.0208082758 - rotY: 269.9998 - rotZ: 0.0167729743 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290321 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e42f12 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The 13th Vision - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 66.89174 - posY: 2.369952 - posZ: 45.3254356 - rotX: 0.0208055452 - rotY: 270.0067 - rotZ: 0.01677739 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290801 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: c17498 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Paranoia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.77021 - posY: 1.36098135 - posZ: 60.4401855 - rotX: 0.02080495 - rotY: 270.007172 - rotZ: 0.0167757 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290805 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: b2ef43 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Indebted - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 69.6492 - posY: 1.37130547 - posZ: 83.45329 - rotX: 0.02080887 - rotY: 269.997437 - rotZ: 0.0167718846 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 547402 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5474': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a2e7d7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Obsessive - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -36.2246132 - posY: 3.13493562 - posZ: 64.63013 - rotX: 0.0208077282 - rotY: 269.999237 - rotZ: 180.016769 + posX: 58.93588 + posY: 1.36254549 + posZ: 67.02983 + rotX: 0.01864637 + rotY: 270.010132 + rotZ: 0.0065060514 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -410,7 +95,7 @@ ContainedObjects: scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 290800 + CardID: 290810 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -427,7 +112,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: 2210c1 + GUID: 29766c Grid: true GridProjection: false Hands: true @@ -438,18 +123,108 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Amnesia + Nickname: Overzealous SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 60.0020523 - posY: 1.35961318 - posZ: 55.47854 - rotX: 0.0208090711 - rotY: 269.9957 - rotZ: 0.0167709384 + posX: 84.76986 + posY: 1.37477219 + posZ: 76.5368347 + rotX: 0.0208052341 + rotY: 270.008362 + rotZ: 0.01677476 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290321 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: e42f12 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The 13th Vision + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 66.89174 + posY: 2.369952 + posZ: 45.3254356 + rotX: 0.0208055452 + rotY: 270.0067 + rotZ: 0.01677739 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 438124 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: a5be8b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unspeakable Oath (Bloodthirst) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.46176 + posY: 1.37253177 + posZ: 73.76154 + rotX: 0.0148119656 + rotY: 270.004944 + rotZ: 0.0242835376 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -500,7 +275,187 @@ ContainedObjects: scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 290817 + CardID: 290320 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Circumstances Beyond Your Control + DragSelectable: true + GMNotes: '' + GUID: cc65f3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: "The Tower \u2022 XVI" + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -61.4137726 + posY: 3.57692623 + posZ: 5.186873 + rotX: 0.0208082758 + rotY: 269.9998 + rotZ: 0.0167729743 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 2210c1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Amnesia + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 60.0020523 + posY: 1.35961318 + posZ: 55.47854 + rotX: 0.0208090711 + rotY: 269.9957 + rotZ: 0.0167709384 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290810 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 88a9b3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Overzealous + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 81.0201 + posY: 1.373406 + posZ: 76.52217 + rotX: 0.0208056755 + rotY: 270.00824 + rotZ: 0.016777223 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290805 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 8df93a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Indebted + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 74.0187149 + posY: 1.37291312 + posZ: 83.52449 + rotX: 0.0208078064 + rotY: 269.9976 + rotZ: 0.0167761613 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290816 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -517,7 +472,7 @@ ContainedObjects: Description: Enemy DragSelectable: true GMNotes: '' - GUID: 16a89d + GUID: b239d7 Grid: true GridProjection: false Hands: true @@ -528,24 +483,24 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Silver Twilight Acolyte + Nickname: Mob Enforcer SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 59.2340546 - posY: 1.36607194 - posZ: 78.4964752 - rotX: 0.0208077766 - rotY: 269.999542 - rotZ: 0.016773073 + posX: 59.38398 + posY: 1.36537349 + posZ: 75.9246 + rotX: 0.02080847 + rotY: 269.999084 + rotZ: 0.0167746339 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 290807 + CardID: 290813 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -562,7 +517,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: 016e3c + GUID: dd3d09 Grid: true GridProjection: false Hands: true @@ -573,69 +528,24 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Chronophobia + Nickname: Dark Pact SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 80.96729 - posY: 1.37533462 - posZ: 83.17558 - rotX: 0.0208096765 - rotY: 269.9989 - rotZ: 0.016768232 + posX: 73.7898941 + posY: 1.50798833 + posZ: 66.88923 + rotX: 0.0198830087 + rotY: 269.998352 + rotZ: 0.0241802726 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 290802 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2908': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 249d83 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Haunted - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 73.63656 - posY: 1.66826892 - posZ: 51.2949 - rotX: 0.01472312 - rotY: 269.998657 - rotZ: 180.026688 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290806 + CardID: 290801 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -652,7 +562,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: 4fb446 + GUID: c17498 Grid: true GridProjection: false Hands: true @@ -663,18 +573,288 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Internal Injury + Nickname: Paranoia SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 84.63887 - posY: 1.376687 - posZ: 83.34652 - rotX: 0.0193456579 - rotY: 269.996979 - rotZ: 0.0182021931 + posX: 59.77021 + posY: 1.36098135 + posZ: 60.4401855 + rotX: 0.02080495 + rotY: 270.007172 + rotZ: 0.0167757 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 545212 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: e27c93 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Offer You Cannot Refuse + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -37.3926926 + posY: 1.26807761 + posZ: 78.69699 + rotX: 0.0208082441 + rotY: 269.999969 + rotZ: 0.0167712737 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290815 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Enemy + DragSelectable: true + GMNotes: '' + GUID: da227d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Thing That Follows + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 77.00673 + posY: 1.37194359 + posZ: 76.50519 + rotX: 0.0208081231 + rotY: 269.999054 + rotZ: 0.0167726167 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 547402 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5474': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: a2e7d7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Obsessive + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -36.2246132 + posY: 3.13493562 + posZ: 64.63013 + rotX: 0.0208077282 + rotY: 269.999237 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290803 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: d83baf + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Psychosis + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 59.276104 + posY: 1.36351478 + posZ: 69.70881 + rotX: 0.0208085179 + rotY: 269.998138 + rotZ: 0.0167739056 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 438128 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 406ab2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Your Worst Nightmare + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.44901 + posY: 1.53057539 + posZ: 58.7713966 + rotX: 0.0195846576 + rotY: 269.9999 + rotZ: 0.0153481439 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 438126 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 447a08 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Kleptomania + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.45187 + posY: 1.51685083 + posZ: 58.63176 + rotX: 0.02240032 + rotY: 270.002625 + rotZ: 0.00697853556 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -725,7 +905,7 @@ ContainedObjects: scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 438126 + CardID: 438125 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -742,7 +922,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: 447a08 + GUID: eff3c8 Grid: true GridProjection: false Hands: true @@ -753,18 +933,828 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Kleptomania + Nickname: Self-Centered SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 80.45187 - posY: 1.51685083 - posZ: 58.63176 - rotX: 0.02240032 - rotY: 270.002625 - rotZ: 0.00697853556 + posX: 82.3005 + posY: 1.37097037 + posZ: 66.61211 + rotX: 0.0208081 + rotY: 269.999756 + rotZ: 0.0167713575 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290814 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: ba2ae1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Doomed + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 73.57277 + posY: 1.367833 + posZ: 67.00315 + rotX: 0.0171475261 + rotY: 269.999878 + rotZ: 0.014829508 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 291019 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2659': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 31f72f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Through the Gates + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 81.1103439 + posY: 1.37475467 + posZ: 81.38222 + rotX: 0.0155774252 + rotY: 269.998871 + rotZ: 0.0148439659 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 545211 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 121b2d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dendromorphosis + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -37.3926 + posY: 1.26738691 + posZ: 76.33738 + rotX: 0.0208084 + rotY: 270.001 + rotZ: 0.0167715531 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266333 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: '162811' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dread Curse + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.64701 + posY: 1.28197241 + posZ: 53.1192131 + rotX: 0.0216190983 + rotY: 270.0002 + rotZ: 0.0151699139 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290807 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: eeb330 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Chronophobia + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 77.61771 + posY: 1.37417972 + posZ: 83.3862152 + rotX: 0.02080846 + rotY: 269.998749 + rotZ: 0.0167724155 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290320 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Circumstances Beyond Your Control + DragSelectable: true + GMNotes: '' + GUID: d5c93d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: "The Tower \u2022 XVI" + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -65.1514359 + posY: 3.57692623 + posZ: 6.00838327 + rotX: 0.0208086111 + rotY: 269.999878 + rotZ: 0.0167732742 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290817 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Enemy + DragSelectable: true + GMNotes: '' + GUID: 16a89d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Silver Twilight Acolyte + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 59.2340546 + posY: 1.36607194 + posZ: 78.4964752 + rotX: 0.0208077766 + rotY: 269.999542 + rotZ: 0.016773073 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538702 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: fc4168 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Nihilism + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -37.2537 + posY: 3.134545 + posZ: 65.7114258 + rotX: 0.02080753 + rotY: 269.99942 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266333 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 92f50c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dread Curse + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.6470013 + posY: 1.33284175 + posZ: 53.15561 + rotX: 0.025468139 + rotY: 269.999939 + rotZ: 0.0134331463 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538802 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: a3bc7a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Atychiphobia + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -35.9241447 + posY: 3.13553762 + posZ: 66.01996 + rotX: 0.0208091866 + rotY: 269.9995 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 547502 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5475': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 2204cc + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Self-Destructive + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -34.67578 + posY: 3.13617754 + posZ: 67.7192154 + rotX: 0.0208087862 + rotY: 269.999146 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290801 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 3575a3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Paranoia + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 60.2334442 + posY: 1.36171019 + posZ: 62.84418 + rotX: 0.0131824408 + rotY: 269.998535 + rotZ: 0.0226880386 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290802 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 249d83 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Haunted + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 73.63656 + posY: 1.66826892 + posZ: 51.2949 + rotX: 0.01472312 + rotY: 269.998657 + rotZ: 180.026688 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266332 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: '960118' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Accursed Follower + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.032135 + posY: 1.333963 + posZ: 56.4778023 + rotX: 0.0227802545 + rotY: 269.999939 + rotZ: 0.0163529646 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290818 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Enemy + DragSelectable: true + GMNotes: '' + GUID: 4ea68b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Stubborn Detective + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 59.32571 + posY: 1.3645314 + posZ: 73.1198349 + rotX: 0.0208079163 + rotY: 269.999237 + rotZ: 0.0167740583 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 438127 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 57e648 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Narcolepsy + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 82.24709 + posY: 1.371798 + posZ: 69.50579 + rotX: 0.0208078641 + rotY: 269.9998 + rotZ: 0.01677146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290807 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 016e3c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Chronophobia + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.96729 + posY: 1.37533462 + posZ: 83.17558 + rotX: 0.0208096765 + rotY: 269.9989 + rotZ: 0.016768232 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290806 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 4fb446 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Internal Injury + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 84.63887 + posY: 1.376687 + posZ: 83.34652 + rotX: 0.0193456579 + rotY: 269.996979 + rotZ: 0.0182021931 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -814,501 +1804,6 @@ ContainedObjects: scaleY: 1.0 scaleZ: 1.0 XmlUI: '' -- Autoraise: true - CardID: 266332 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: '960118' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Accursed Follower - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 13.032135 - posY: 1.333963 - posZ: 56.4778023 - rotX: 0.0227802545 - rotY: 269.999939 - rotZ: 0.0163529646 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290804 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 88ee43 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hypochondria - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 58.93588 - posY: 1.36254549 - posZ: 67.02983 - rotX: 0.01864637 - rotY: 270.010132 - rotZ: 0.0065060514 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438127 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 57e648 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Narcolepsy - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 82.24709 - posY: 1.371798 - posZ: 69.50579 - rotX: 0.0208078641 - rotY: 269.9998 - rotZ: 0.01677146 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438124 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a5be8b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Bloodthirst) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.46176 - posY: 1.37253177 - posZ: 73.76154 - rotX: 0.0148119656 - rotY: 270.004944 - rotZ: 0.0242835376 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 291019 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2659': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 31f72f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Through the Gates - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 81.1103439 - posY: 1.37475467 - posZ: 81.38222 - rotX: 0.0155774252 - rotY: 269.998871 - rotZ: 0.0148439659 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290810 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 88a9b3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Overzealous - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 81.0201 - posY: 1.373406 - posZ: 76.52217 - rotX: 0.0208056755 - rotY: 270.00824 - rotZ: 0.016777223 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438128 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 406ab2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Your Worst Nightmare - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.44901 - posY: 1.53057539 - posZ: 58.7713966 - rotX: 0.0195846576 - rotY: 269.9999 - rotZ: 0.0153481439 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552600 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1474319121424363455/E87A4A73DB6645C40FE719575B4E8C892F8EA37C/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: '487897' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Offer You Cannot Refuse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 15.61837 - posY: 1.32635355 - posZ: 62.5527458 - rotX: 0.0208086371 - rotY: 269.999878 - rotZ: 0.0167707372 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290807 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: eeb330 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Chronophobia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 77.61771 - posY: 1.37417972 - posZ: 83.3862152 - rotX: 0.02080846 - rotY: 269.998749 - rotZ: 0.0167724155 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552500 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1056604690734334657/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1474319121424361470/714720256A427E6C2B84E18740DB3EDB3B5D3334/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: f92da2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Dendromorphosis - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 15.6183739 - posY: 1.28745615 - posZ: 62.55275 - rotX: 0.0208087 - rotY: 269.999847 - rotZ: 0.0167706572 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 547502 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5475': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 2204cc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Self-Destructive - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -34.67578 - posY: 3.13617754 - posZ: 67.7192154 - rotX: 0.0208087862 - rotY: 269.999146 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' - Autoraise: true CardID: 266332 ColorDiffuse: @@ -1354,6 +1849,186 @@ ContainedObjects: scaleY: 1.0 scaleZ: 1.0 XmlUI: '' +- Autoraise: true + CardID: 438123 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: f6aba5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unspeakable Oath (Curiosity) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.29785 + posY: 1.53495085 + posZ: 73.75409 + rotX: 0.02094236 + rotY: 269.999878 + rotZ: 0.0147951907 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266334 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 4a5d1e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Day of Reckoning + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.0674715 + posY: 1.3438983 + posZ: 55.27775 + rotX: 0.0208068211 + rotY: 270.0 + rotZ: 0.0167719983 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 438122 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: ea0fa1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unspeakable Oath (Cowardice) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.61448 + posY: 1.53051329 + posZ: 73.92056 + rotX: 359.5608 + rotY: 270.008331 + rotZ: 0.0357966721 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538602 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: c45e67 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Reckless + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -36.5003281 + posY: 3.135191 + posZ: 65.93405 + rotX: 0.0208077282 + rotY: 269.999329 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' - Autoraise: true CardID: 291019 ColorDiffuse: @@ -1417,7 +2092,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: 8df93a + GUID: b2ef43 Grid: true GridProjection: false Hands: true @@ -1434,687 +2109,12 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 74.0187149 - posY: 1.37291312 - posZ: 83.52449 - rotX: 0.0208078064 - rotY: 269.9976 - rotZ: 0.0167761613 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290801 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 3575a3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Paranoia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 60.2334442 - posY: 1.36171019 - posZ: 62.84418 - rotX: 0.0131824408 - rotY: 269.998535 - rotZ: 0.0226880386 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538802 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a3bc7a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Atychiphobia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -35.9241447 - posY: 3.13553762 - posZ: 66.01996 - rotX: 0.0208091866 - rotY: 269.9995 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538602 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: c45e67 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Reckless - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -36.5003281 - posY: 3.135191 - posZ: 65.93405 - rotX: 0.0208077282 - rotY: 269.999329 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290818 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: 4ea68b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stubborn Detective - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.32571 - posY: 1.3645314 - posZ: 73.1198349 - rotX: 0.0208079163 - rotY: 269.999237 - rotZ: 0.0167740583 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 266334 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 4a5d1e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Day of Reckoning - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 13.0674715 - posY: 1.3438983 - posZ: 55.27775 - rotX: 0.0208068211 - rotY: 270.0 - rotZ: 0.0167719983 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438125 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: eff3c8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Self-Centered - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 82.3005 - posY: 1.37097037 - posZ: 66.61211 - rotX: 0.0208081 - rotY: 269.999756 - rotZ: 0.0167713575 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 266333 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 92f50c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dread Curse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6470013 - posY: 1.33284175 - posZ: 53.15561 - rotX: 0.025468139 - rotY: 269.999939 - rotZ: 0.0134331463 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 266333 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: '162811' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dread Curse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.64701 - posY: 1.28197241 - posZ: 53.1192131 - rotX: 0.0216190983 - rotY: 270.0002 - rotZ: 0.0151699139 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438123 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: f6aba5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Curiosity) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.29785 - posY: 1.53495085 - posZ: 73.75409 - rotX: 0.02094236 - rotY: 269.999878 - rotZ: 0.0147951907 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290813 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: dd3d09 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dark Pact - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 73.7898941 - posY: 1.50798833 - posZ: 66.88923 - rotX: 0.0198830087 - rotY: 269.998352 - rotZ: 0.0241802726 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290803 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: d83baf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Psychosis - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.276104 - posY: 1.36351478 - posZ: 69.70881 - rotX: 0.0208085179 - rotY: 269.998138 - rotZ: 0.0167739056 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438122 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: ea0fa1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Cowardice) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.61448 - posY: 1.53051329 - posZ: 73.92056 - rotX: 359.5608 - rotY: 270.008331 - rotZ: 0.0357966721 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290320 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Circumstances Beyond Your Control - DragSelectable: true - GMNotes: '' - GUID: d5c93d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "The Tower \u2022 XVI" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -65.1514359 - posY: 3.57692623 - posZ: 6.00838327 - rotX: 0.0208086111 - rotY: 269.999878 - rotZ: 0.0167732742 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538702 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: fc4168 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Nihilism - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -37.2537 - posY: 3.134545 - posZ: 65.7114258 - rotX: 0.02080753 - rotY: 269.99942 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290810 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 29766c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Overzealous - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 84.76986 - posY: 1.37477219 - posZ: 76.5368347 - rotX: 0.0208052341 - rotY: 270.008362 - rotZ: 0.01677476 + posX: 69.6492 + posY: 1.37130547 + posZ: 83.45329 + rotX: 0.02080887 + rotY: 269.997437 + rotZ: 0.0167718846 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -2184,6 +2184,14 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false '5474': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ @@ -2200,70 +2208,54 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false - '5525': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1056604690734334657/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1474319121424361470/714720256A427E6C2B84E18740DB3EDB3B5D3334/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5526': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1474319121424363455/E87A4A73DB6645C40FE719575B4E8C892F8EA37C/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false DeckIDs: -- 290814 -- 290815 -- 290816 -- 290320 -- 290321 -- 290801 -- 290805 -- 547402 -- 290811 -- 290800 -- 290800 -- 290817 -- 290807 -- 290802 -- 290806 -- 290806 -- 438126 -- 290321 -- 266332 - 290804 -- 438127 -- 438124 -- 291019 +- 290811 - 290810 +- 290321 +- 438124 +- 290800 +- 290320 +- 290800 +- 290810 +- 290805 +- 290816 +- 290813 +- 290801 +- 545212 +- 290815 +- 547402 +- 290803 - 438128 -- 552600 +- 438126 +- 290806 +- 438125 +- 290814 +- 291019 +- 545211 +- 266333 - 290807 -- 552500 +- 290320 +- 290817 +- 538702 +- 266333 +- 538802 - 547502 +- 290801 +- 290802 - 266332 +- 290818 +- 438127 +- 290807 +- 290806 +- 290321 +- 266332 +- 438123 +- 266334 +- 438122 +- 538602 - 291019 - 290805 -- 290801 -- 538802 -- 538602 -- 290818 -- 266334 -- 438125 -- 266333 -- 266333 -- 438123 -- 290813 -- 290803 -- 438122 -- 290320 -- 538702 -- 290810 Description: '' DragSelectable: true GMNotes: '' diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Core 728f7e.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Core 728f7e.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Core 728f7e.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Core 728f7e.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Return to The Forgotten Age c0f36d.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Return to The Forgotten Age c0f36d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Return to The Forgotten Age c0f36d.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Return to The Forgotten Age c0f36d.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Return to The Path to Carcosa 9c5822.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Return to The Path to Carcosa 9c5822.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Return to The Path to Carcosa 9c5822.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Return to The Path to Carcosa 9c5822.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Return to the Dunwich Legacy 0b361d.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Return to the Dunwich Legacy 0b361d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Return to the Dunwich Legacy 0b361d.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Return to the Dunwich Legacy 0b361d.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Starter Decks 120210.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Starter Decks 120210.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck Starter Decks 120210.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck Starter Decks 120210.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Circle Undone f9215d.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Circle Undone f9215d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Circle Undone f9215d.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Circle Undone f9215d.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Dream-Eaters c97be9.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Dream-Eaters c97be9.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Dream-Eaters c97be9.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Dream-Eaters c97be9.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Dunwich Legacy 0da7f2.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Dunwich Legacy 0da7f2.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Dunwich Legacy 0da7f2.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Dunwich Legacy 0da7f2.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Forgotten Age 62c248.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Forgotten Age 62c248.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Forgotten Age 62c248.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Forgotten Age 62c248.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Innsmouth Conspiracy 516413.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Innsmouth Conspiracy 516413.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Innsmouth Conspiracy 516413.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Innsmouth Conspiracy 516413.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Path to Carcosa 193ddf.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Path to Carcosa 193ddf.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf/Deck The Path to Carcosa 193ddf.yaml rename to unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4/Deck The Path to Carcosa 193ddf.yaml diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf.ttslua b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf.ttslua deleted file mode 100644 index f999547e7..000000000 --- a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks ceacbf.ttslua +++ /dev/null @@ -1,503 +0,0 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Deck All Weaknesses d95bd6.yaml b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Deck All Weaknesses d95bd6.yaml index e78dd2ad5..7f4f6e0b1 100644 --- a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Deck All Weaknesses d95bd6.yaml +++ b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Deck All Weaknesses d95bd6.yaml @@ -5,7 +5,7 @@ ColorDiffuse: r: 0.713235259 ContainedObjects: - Autoraise: true - CardID: 290814 + CardID: 290804 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -22,7 +22,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: ba2ae1 + GUID: 88ee43 Grid: true GridProjection: false Hands: true @@ -33,333 +33,18 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Doomed + Nickname: Hypochondria SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 73.57277 - posY: 1.367833 - posZ: 67.00315 - rotX: 0.0171475261 - rotY: 269.999878 - rotZ: 0.014829508 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290815 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: da227d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The Thing That Follows - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 77.00673 - posY: 1.37194359 - posZ: 76.50519 - rotX: 0.0208081231 - rotY: 269.999054 - rotZ: 0.0167726167 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290816 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: b239d7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Mob Enforcer - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.38398 - posY: 1.36537349 - posZ: 75.9246 - rotX: 0.02080847 - rotY: 269.999084 - rotZ: 0.0167746339 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290320 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Circumstances Beyond Your Control - DragSelectable: true - GMNotes: '' - GUID: cc65f3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "The Tower \u2022 XVI" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -61.4137726 - posY: 3.57692623 - posZ: 5.186873 - rotX: 0.0208082758 - rotY: 269.9998 - rotZ: 0.0167729743 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290321 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: '' - DragSelectable: true - GMNotes: '' - GUID: e42f12 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: The 13th Vision - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 66.89174 - posY: 2.369952 - posZ: 45.3254356 - rotX: 0.0208055452 - rotY: 270.0067 - rotZ: 0.01677739 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290801 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: c17498 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Paranoia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.77021 - posY: 1.36098135 - posZ: 60.4401855 - rotX: 0.02080495 - rotY: 270.007172 - rotZ: 0.0167757 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290805 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: b2ef43 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Indebted - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 69.6492 - posY: 1.37130547 - posZ: 83.45329 - rotX: 0.02080887 - rotY: 269.997437 - rotZ: 0.0167718846 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 547402 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5474': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a2e7d7 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Obsessive - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -36.2246132 - posY: 3.13493562 - posZ: 64.63013 - rotX: 0.0208077282 - rotY: 269.999237 - rotZ: 180.016769 + posX: 58.93588 + posY: 1.36254549 + posZ: 67.02983 + rotX: 0.01864637 + rotY: 270.010132 + rotZ: 0.0065060514 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -410,7 +95,7 @@ ContainedObjects: scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 290800 + CardID: 290810 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -427,7 +112,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: 2210c1 + GUID: 29766c Grid: true GridProjection: false Hands: true @@ -438,18 +123,108 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Amnesia + Nickname: Overzealous SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 60.0020523 - posY: 1.35961318 - posZ: 55.47854 - rotX: 0.0208090711 - rotY: 269.9957 - rotZ: 0.0167709384 + posX: 84.76986 + posY: 1.37477219 + posZ: 76.5368347 + rotX: 0.0208052341 + rotY: 270.008362 + rotZ: 0.01677476 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290321 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: e42f12 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The 13th Vision + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 66.89174 + posY: 2.369952 + posZ: 45.3254356 + rotX: 0.0208055452 + rotY: 270.0067 + rotZ: 0.01677739 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 438124 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: a5be8b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unspeakable Oath (Bloodthirst) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.46176 + posY: 1.37253177 + posZ: 73.76154 + rotX: 0.0148119656 + rotY: 270.004944 + rotZ: 0.0242835376 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -500,7 +275,187 @@ ContainedObjects: scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 290817 + CardID: 290320 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Circumstances Beyond Your Control + DragSelectable: true + GMNotes: '' + GUID: cc65f3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: "The Tower \u2022 XVI" + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -61.4137726 + posY: 3.57692623 + posZ: 5.186873 + rotX: 0.0208082758 + rotY: 269.9998 + rotZ: 0.0167729743 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290800 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 2210c1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Amnesia + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 60.0020523 + posY: 1.35961318 + posZ: 55.47854 + rotX: 0.0208090711 + rotY: 269.9957 + rotZ: 0.0167709384 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290810 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 88a9b3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Overzealous + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 81.0201 + posY: 1.373406 + posZ: 76.52217 + rotX: 0.0208056755 + rotY: 270.00824 + rotZ: 0.016777223 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290805 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 8df93a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Indebted + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 74.0187149 + posY: 1.37291312 + posZ: 83.52449 + rotX: 0.0208078064 + rotY: 269.9976 + rotZ: 0.0167761613 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290816 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -517,7 +472,7 @@ ContainedObjects: Description: Enemy DragSelectable: true GMNotes: '' - GUID: 16a89d + GUID: b239d7 Grid: true GridProjection: false Hands: true @@ -528,24 +483,24 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Silver Twilight Acolyte + Nickname: Mob Enforcer SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 59.2340546 - posY: 1.36607194 - posZ: 78.4964752 - rotX: 0.0208077766 - rotY: 269.999542 - rotZ: 0.016773073 + posX: 59.38398 + posY: 1.36537349 + posZ: 75.9246 + rotX: 0.02080847 + rotY: 269.999084 + rotZ: 0.0167746339 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 290807 + CardID: 290813 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -562,7 +517,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: 016e3c + GUID: dd3d09 Grid: true GridProjection: false Hands: true @@ -573,69 +528,24 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Chronophobia + Nickname: Dark Pact SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 80.96729 - posY: 1.37533462 - posZ: 83.17558 - rotX: 0.0208096765 - rotY: 269.9989 - rotZ: 0.016768232 + posX: 73.7898941 + posY: 1.50798833 + posZ: 66.88923 + rotX: 0.0198830087 + rotY: 269.998352 + rotZ: 0.0241802726 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 290802 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2908': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 249d83 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Haunted - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 73.63656 - posY: 1.66826892 - posZ: 51.2949 - rotX: 0.01472312 - rotY: 269.998657 - rotZ: 180.026688 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290806 + CardID: 290801 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -652,7 +562,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: 4fb446 + GUID: c17498 Grid: true GridProjection: false Hands: true @@ -663,18 +573,288 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Internal Injury + Nickname: Paranoia SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 84.63887 - posY: 1.376687 - posZ: 83.34652 - rotX: 0.0193456579 - rotY: 269.996979 - rotZ: 0.0182021931 + posX: 59.77021 + posY: 1.36098135 + posZ: 60.4401855 + rotX: 0.02080495 + rotY: 270.007172 + rotZ: 0.0167757 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 545212 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: e27c93 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Offer You Cannot Refuse + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -37.3926926 + posY: 1.26807761 + posZ: 78.69699 + rotX: 0.0208082441 + rotY: 269.999969 + rotZ: 0.0167712737 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290815 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Enemy + DragSelectable: true + GMNotes: '' + GUID: da227d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: The Thing That Follows + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 77.00673 + posY: 1.37194359 + posZ: 76.50519 + rotX: 0.0208081231 + rotY: 269.999054 + rotZ: 0.0167726167 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 547402 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5474': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: a2e7d7 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Obsessive + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -36.2246132 + posY: 3.13493562 + posZ: 64.63013 + rotX: 0.0208077282 + rotY: 269.999237 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290803 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: d83baf + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Psychosis + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 59.276104 + posY: 1.36351478 + posZ: 69.70881 + rotX: 0.0208085179 + rotY: 269.998138 + rotZ: 0.0167739056 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 438128 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 406ab2 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Your Worst Nightmare + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.44901 + posY: 1.53057539 + posZ: 58.7713966 + rotX: 0.0195846576 + rotY: 269.9999 + rotZ: 0.0153481439 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 438126 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 447a08 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Kleptomania + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.45187 + posY: 1.51685083 + posZ: 58.63176 + rotX: 0.02240032 + rotY: 270.002625 + rotZ: 0.00697853556 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -725,7 +905,7 @@ ContainedObjects: scaleZ: 1.0 XmlUI: '' - Autoraise: true - CardID: 438126 + CardID: 438125 ColorDiffuse: b: 0.713235259 g: 0.713235259 @@ -742,7 +922,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: 447a08 + GUID: eff3c8 Grid: true GridProjection: false Hands: true @@ -753,18 +933,828 @@ ContainedObjects: LuaScriptState: '' MeasureMovement: false Name: Card - Nickname: Kleptomania + Nickname: Self-Centered SidewaysCard: false Snap: true Sticky: true Tooltip: true Transform: - posX: 80.45187 - posY: 1.51685083 - posZ: 58.63176 - rotX: 0.02240032 - rotY: 270.002625 - rotZ: 0.00697853556 + posX: 82.3005 + posY: 1.37097037 + posZ: 66.61211 + rotX: 0.0208081 + rotY: 269.999756 + rotZ: 0.0167713575 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290814 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: ba2ae1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Doomed + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 73.57277 + posY: 1.367833 + posZ: 67.00315 + rotX: 0.0171475261 + rotY: 269.999878 + rotZ: 0.014829508 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 291019 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2659': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 31f72f + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Through the Gates + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 81.1103439 + posY: 1.37475467 + posZ: 81.38222 + rotX: 0.0155774252 + rotY: 269.998871 + rotZ: 0.0148439659 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 545211 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 121b2d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dendromorphosis + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -37.3926 + posY: 1.26738691 + posZ: 76.33738 + rotX: 0.0208084 + rotY: 270.001 + rotZ: 0.0167715531 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266333 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: '162811' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dread Curse + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.64701 + posY: 1.28197241 + posZ: 53.1192131 + rotX: 0.0216190983 + rotY: 270.0002 + rotZ: 0.0151699139 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290807 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: eeb330 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Chronophobia + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 77.61771 + posY: 1.37417972 + posZ: 83.3862152 + rotX: 0.02080846 + rotY: 269.998749 + rotZ: 0.0167724155 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290320 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2903': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Circumstances Beyond Your Control + DragSelectable: true + GMNotes: '' + GUID: d5c93d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: "The Tower \u2022 XVI" + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -65.1514359 + posY: 3.57692623 + posZ: 6.00838327 + rotX: 0.0208086111 + rotY: 269.999878 + rotZ: 0.0167732742 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290817 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Enemy + DragSelectable: true + GMNotes: '' + GUID: 16a89d + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Silver Twilight Acolyte + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 59.2340546 + posY: 1.36607194 + posZ: 78.4964752 + rotX: 0.0208077766 + rotY: 269.999542 + rotZ: 0.016773073 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538702 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5387': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: fc4168 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Nihilism + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -37.2537 + posY: 3.134545 + posZ: 65.7114258 + rotX: 0.02080753 + rotY: 269.99942 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266333 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 92f50c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Dread Curse + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 12.6470013 + posY: 1.33284175 + posZ: 53.15561 + rotX: 0.025468139 + rotY: 269.999939 + rotZ: 0.0134331463 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538802 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5388': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: a3bc7a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Atychiphobia + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -35.9241447 + posY: 3.13553762 + posZ: 66.01996 + rotX: 0.0208091866 + rotY: 269.9995 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 547502 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5475': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 2204cc + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Self-Destructive + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -34.67578 + posY: 3.13617754 + posZ: 67.7192154 + rotX: 0.0208087862 + rotY: 269.999146 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290801 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 3575a3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Paranoia + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 60.2334442 + posY: 1.36171019 + posZ: 62.84418 + rotX: 0.0131824408 + rotY: 269.998535 + rotZ: 0.0226880386 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290802 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2908': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 249d83 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Haunted + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 73.63656 + posY: 1.66826892 + posZ: 51.2949 + rotX: 0.01472312 + rotY: 269.998657 + rotZ: 180.026688 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266332 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: '960118' + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Accursed Follower + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.032135 + posY: 1.333963 + posZ: 56.4778023 + rotX: 0.0227802545 + rotY: 269.999939 + rotZ: 0.0163529646 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290818 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Enemy + DragSelectable: true + GMNotes: '' + GUID: 4ea68b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Stubborn Detective + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 59.32571 + posY: 1.3645314 + posZ: 73.1198349 + rotX: 0.0208079163 + rotY: 269.999237 + rotZ: 0.0167740583 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 438127 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 57e648 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Narcolepsy + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 82.24709 + posY: 1.371798 + posZ: 69.50579 + rotX: 0.0208078641 + rotY: 269.9998 + rotZ: 0.01677146 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290807 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 016e3c + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Chronophobia + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.96729 + posY: 1.37533462 + posZ: 83.17558 + rotX: 0.0208096765 + rotY: 269.9989 + rotZ: 0.016768232 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 290806 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2623': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 4fb446 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Internal Injury + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 84.63887 + posY: 1.376687 + posZ: 83.34652 + rotX: 0.0193456579 + rotY: 269.996979 + rotZ: 0.0182021931 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -814,501 +1804,6 @@ ContainedObjects: scaleY: 1.0 scaleZ: 1.0 XmlUI: '' -- Autoraise: true - CardID: 266332 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: '960118' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Accursed Follower - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 13.032135 - posY: 1.333963 - posZ: 56.4778023 - rotX: 0.0227802545 - rotY: 269.999939 - rotZ: 0.0163529646 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290804 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 88ee43 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Hypochondria - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 58.93588 - posY: 1.36254549 - posZ: 67.02983 - rotX: 0.01864637 - rotY: 270.010132 - rotZ: 0.0065060514 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438127 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 57e648 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Narcolepsy - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 82.24709 - posY: 1.371798 - posZ: 69.50579 - rotX: 0.0208078641 - rotY: 269.9998 - rotZ: 0.01677146 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438124 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a5be8b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Bloodthirst) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.46176 - posY: 1.37253177 - posZ: 73.76154 - rotX: 0.0148119656 - rotY: 270.004944 - rotZ: 0.0242835376 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 291019 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2659': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 31f72f - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Through the Gates - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 81.1103439 - posY: 1.37475467 - posZ: 81.38222 - rotX: 0.0155774252 - rotY: 269.998871 - rotZ: 0.0148439659 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290810 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 88a9b3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Overzealous - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 81.0201 - posY: 1.373406 - posZ: 76.52217 - rotX: 0.0208056755 - rotY: 270.00824 - rotZ: 0.016777223 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438128 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 406ab2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Your Worst Nightmare - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.44901 - posY: 1.53057539 - posZ: 58.7713966 - rotX: 0.0195846576 - rotY: 269.9999 - rotZ: 0.0153481439 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552600 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1474319121424363455/E87A4A73DB6645C40FE719575B4E8C892F8EA37C/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: '487897' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Offer You Cannot Refuse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 15.61837 - posY: 1.32635355 - posZ: 62.5527458 - rotX: 0.0208086371 - rotY: 269.999878 - rotZ: 0.0167707372 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290807 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: eeb330 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Chronophobia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 77.61771 - posY: 1.37417972 - posZ: 83.3862152 - rotX: 0.02080846 - rotY: 269.998749 - rotZ: 0.0167724155 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 552500 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1056604690734334657/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1474319121424361470/714720256A427E6C2B84E18740DB3EDB3B5D3334/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: f92da2 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: CardCustom - Nickname: Dendromorphosis - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 15.6183739 - posY: 1.28745615 - posZ: 62.55275 - rotX: 0.0208087 - rotY: 269.999847 - rotZ: 0.0167706572 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 547502 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5475': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 2204cc - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Self-Destructive - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -34.67578 - posY: 3.13617754 - posZ: 67.7192154 - rotX: 0.0208087862 - rotY: 269.999146 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' - Autoraise: true CardID: 266332 ColorDiffuse: @@ -1354,6 +1849,186 @@ ContainedObjects: scaleY: 1.0 scaleZ: 1.0 XmlUI: '' +- Autoraise: true + CardID: 438123 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: f6aba5 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unspeakable Oath (Curiosity) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.29785 + posY: 1.53495085 + posZ: 73.75409 + rotX: 0.02094236 + rotY: 269.999878 + rotZ: 0.0147951907 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 266334 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2663': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: 4a5d1e + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Day of Reckoning + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 13.0674715 + posY: 1.3438983 + posZ: 55.27775 + rotX: 0.0208068211 + rotY: 270.0 + rotZ: 0.0167719983 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 438122 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '4381': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: ea0fa1 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Unspeakable Oath (Cowardice) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 80.61448 + posY: 1.53051329 + posZ: 73.92056 + rotX: 359.5608 + rotY: 270.008331 + rotZ: 0.0357966721 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 538602 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '5386': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false + Description: Basic Weakness + DragSelectable: true + GMNotes: '' + GUID: c45e67 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Reckless + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -36.5003281 + posY: 3.135191 + posZ: 65.93405 + rotX: 0.0208077282 + rotY: 269.999329 + rotZ: 180.016769 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' - Autoraise: true CardID: 291019 ColorDiffuse: @@ -1417,7 +2092,7 @@ ContainedObjects: Description: Basic Weakness DragSelectable: true GMNotes: '' - GUID: 8df93a + GUID: b2ef43 Grid: true GridProjection: false Hands: true @@ -1434,687 +2109,12 @@ ContainedObjects: Sticky: true Tooltip: true Transform: - posX: 74.0187149 - posY: 1.37291312 - posZ: 83.52449 - rotX: 0.0208078064 - rotY: 269.9976 - rotZ: 0.0167761613 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290801 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 3575a3 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Paranoia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 60.2334442 - posY: 1.36171019 - posZ: 62.84418 - rotX: 0.0131824408 - rotY: 269.998535 - rotZ: 0.0226880386 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538802 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5388': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: a3bc7a - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Atychiphobia - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -35.9241447 - posY: 3.13553762 - posZ: 66.01996 - rotX: 0.0208091866 - rotY: 269.9995 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538602 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5386': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: c45e67 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Reckless - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -36.5003281 - posY: 3.135191 - posZ: 65.93405 - rotX: 0.0208077282 - rotY: 269.999329 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290818 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Enemy - DragSelectable: true - GMNotes: '' - GUID: 4ea68b - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Stubborn Detective - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.32571 - posY: 1.3645314 - posZ: 73.1198349 - rotX: 0.0208079163 - rotY: 269.999237 - rotZ: 0.0167740583 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 266334 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 4a5d1e - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Day of Reckoning - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 13.0674715 - posY: 1.3438983 - posZ: 55.27775 - rotX: 0.0208068211 - rotY: 270.0 - rotZ: 0.0167719983 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438125 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: eff3c8 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Self-Centered - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 82.3005 - posY: 1.37097037 - posZ: 66.61211 - rotX: 0.0208081 - rotY: 269.999756 - rotZ: 0.0167713575 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 266333 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 92f50c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dread Curse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.6470013 - posY: 1.33284175 - posZ: 53.15561 - rotX: 0.025468139 - rotY: 269.999939 - rotZ: 0.0134331463 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 266333 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2663': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: '162811' - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dread Curse - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 12.64701 - posY: 1.28197241 - posZ: 53.1192131 - rotX: 0.0216190983 - rotY: 270.0002 - rotZ: 0.0151699139 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438123 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: f6aba5 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Curiosity) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.29785 - posY: 1.53495085 - posZ: 73.75409 - rotX: 0.02094236 - rotY: 269.999878 - rotZ: 0.0147951907 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290813 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: dd3d09 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Dark Pact - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 73.7898941 - posY: 1.50798833 - posZ: 66.88923 - rotX: 0.0198830087 - rotY: 269.998352 - rotZ: 0.0241802726 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290803 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: d83baf - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Psychosis - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 59.276104 - posY: 1.36351478 - posZ: 69.70881 - rotX: 0.0208085179 - rotY: 269.998138 - rotZ: 0.0167739056 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 438122 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '4381': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: ea0fa1 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Unspeakable Oath (Cowardice) - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 80.61448 - posY: 1.53051329 - posZ: 73.92056 - rotX: 359.5608 - rotY: 270.008331 - rotZ: 0.0357966721 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290320 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2903': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Circumstances Beyond Your Control - DragSelectable: true - GMNotes: '' - GUID: d5c93d - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: "The Tower \u2022 XVI" - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -65.1514359 - posY: 3.57692623 - posZ: 6.00838327 - rotX: 0.0208086111 - rotY: 269.999878 - rotZ: 0.0167732742 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 538702 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '5387': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: fc4168 - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Nihilism - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -37.2537 - posY: 3.134545 - posZ: 65.7114258 - rotX: 0.02080753 - rotY: 269.99942 - rotZ: 180.016769 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -- Autoraise: true - CardID: 290810 - ColorDiffuse: - b: 0.713235259 - g: 0.713235259 - r: 0.713235259 - CustomDeck: - '2623': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ - NumHeight: 7 - NumWidth: 10 - Type: 0 - UniqueBack: false - Description: Basic Weakness - DragSelectable: true - GMNotes: '' - GUID: 29766c - Grid: true - GridProjection: false - Hands: true - HideWhenFaceDown: true - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Card - Nickname: Overzealous - SidewaysCard: false - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 84.76986 - posY: 1.37477219 - posZ: 76.5368347 - rotX: 0.0208052341 - rotY: 270.008362 - rotZ: 0.01677476 + posX: 69.6492 + posY: 1.37130547 + posZ: 83.45329 + rotX: 0.02080887 + rotY: 269.997437 + rotZ: 0.0167718846 scaleX: 1.0 scaleY: 1.0 scaleZ: 1.0 @@ -2184,6 +2184,14 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false + '5452': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false '5474': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ @@ -2200,70 +2208,54 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false - '5525': - BackIsHidden: true - BackURL: http://cloud-3.steamusercontent.com/ugc/1056604690734334657/B1BF31EBC5D92EC3A51B6D3B56ABFB232D2636C5/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1474319121424361470/714720256A427E6C2B84E18740DB3EDB3B5D3334/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false - '5526': - BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ - FaceURL: http://cloud-3.steamusercontent.com/ugc/1474319121424363455/E87A4A73DB6645C40FE719575B4E8C892F8EA37C/ - NumHeight: 1 - NumWidth: 1 - Type: 0 - UniqueBack: false DeckIDs: -- 290814 -- 290815 -- 290816 -- 290320 -- 290321 -- 290801 -- 290805 -- 547402 -- 290811 -- 290800 -- 290800 -- 290817 -- 290807 -- 290802 -- 290806 -- 290806 -- 438126 -- 290321 -- 266332 - 290804 -- 438127 -- 438124 -- 291019 +- 290811 - 290810 +- 290321 +- 438124 +- 290800 +- 290320 +- 290800 +- 290810 +- 290805 +- 290816 +- 290813 +- 290801 +- 545212 +- 290815 +- 547402 +- 290803 - 438128 -- 552600 +- 438126 +- 290806 +- 438125 +- 290814 +- 291019 +- 545211 +- 266333 - 290807 -- 552500 +- 290320 +- 290817 +- 538702 +- 266333 +- 538802 - 547502 +- 290801 +- 290802 - 266332 +- 290818 +- 438127 +- 290807 +- 290806 +- 290321 +- 266332 +- 438123 +- 266334 +- 438122 +- 538602 - 291019 - 290805 -- 290801 -- 538802 -- 538602 -- 290818 -- 266334 -- 438125 -- 266333 -- 266333 -- 438123 -- 290813 -- 290803 -- 438122 -- 290320 -- 538702 -- 290810 Description: '' DragSelectable: true GMNotes: '' diff --git a/unpacked/Custom_Model_Infinite_Bag Horror tokens 7bd2a0.yaml b/unpacked/Custom_Model_Infinite_Bag Horror tokens 7bd2a0.yaml index 92d9e5402..bb9ad3572 100644 --- a/unpacked/Custom_Model_Infinite_Bag Horror tokens 7bd2a0.yaml +++ b/unpacked/Custom_Model_Infinite_Bag Horror tokens 7bd2a0.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: b: 0.4512195 - g: 0.248152375 - r: 0.192503631 + g: 0.248150736 + r: 0.192502081 ContainedObjects: - Autoraise: true ColorDiffuse: diff --git a/unpacked/Custom_Model_Infinite_Bag Horror tokens ae1a4e.yaml b/unpacked/Custom_Model_Infinite_Bag Horror tokens ae1a4e.yaml index eda7a0cd8..ea44bc2c3 100644 --- a/unpacked/Custom_Model_Infinite_Bag Horror tokens ae1a4e.yaml +++ b/unpacked/Custom_Model_Infinite_Bag Horror tokens ae1a4e.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: b: 0.4512195 - g: 0.248152375 - r: 0.192503631 + g: 0.248150736 + r: 0.192502081 ContainedObjects: - Autoraise: true ColorDiffuse: diff --git a/unpacked/Custom_Model_Infinite_Bag Horror tokens c3ecf4.yaml b/unpacked/Custom_Model_Infinite_Bag Horror tokens c3ecf4.yaml index 1469ed01f..3915ad863 100644 --- a/unpacked/Custom_Model_Infinite_Bag Horror tokens c3ecf4.yaml +++ b/unpacked/Custom_Model_Infinite_Bag Horror tokens c3ecf4.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: b: 0.4512195 - g: 0.248152375 - r: 0.192503631 + g: 0.248150736 + r: 0.192502081 ContainedObjects: - Autoraise: true ColorDiffuse: diff --git a/unpacked/Custom_Model_Infinite_Bag Resource tokens 0168ae.yaml b/unpacked/Custom_Model_Infinite_Bag Resource tokens 0168ae.yaml index 72d2b3148..18f6fd81a 100644 --- a/unpacked/Custom_Model_Infinite_Bag Resource tokens 0168ae.yaml +++ b/unpacked/Custom_Model_Infinite_Bag Resource tokens 0168ae.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.07051984 - g: 0.07051984 - r: 0.2822579 + b: 0.07051868 + g: 0.07051868 + r: 0.282256275 ContainedObjects: - Autoraise: true ColorDiffuse: diff --git a/unpacked/Custom_Model_Infinite_Bag Resource tokens 9fadf9.yaml b/unpacked/Custom_Model_Infinite_Bag Resource tokens 9fadf9.yaml index 550171e52..d08d9fb96 100644 --- a/unpacked/Custom_Model_Infinite_Bag Resource tokens 9fadf9.yaml +++ b/unpacked/Custom_Model_Infinite_Bag Resource tokens 9fadf9.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.07051984 - g: 0.07051984 - r: 0.2822579 + b: 0.07051868 + g: 0.07051868 + r: 0.282256275 ContainedObjects: - Autoraise: true ColorDiffuse: diff --git a/unpacked/Custom_Model_Infinite_Bag Resource tokens fd617a.yaml b/unpacked/Custom_Model_Infinite_Bag Resource tokens fd617a.yaml index 25e28895f..53b037c7d 100644 --- a/unpacked/Custom_Model_Infinite_Bag Resource tokens fd617a.yaml +++ b/unpacked/Custom_Model_Infinite_Bag Resource tokens fd617a.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.07051984 - g: 0.07051984 - r: 0.2822579 + b: 0.07051868 + g: 0.07051868 + r: 0.282256275 ContainedObjects: - Autoraise: true ColorDiffuse: diff --git a/unpacked/Custom_Tile b9140e.yaml b/unpacked/Custom_Tile b9140e.yaml index b76f0b394..515fa7849 100644 --- a/unpacked/Custom_Tile b9140e.yaml +++ b/unpacked/Custom_Tile b9140e.yaml @@ -2,7 +2,7 @@ Autoraise: true ColorDiffuse: b: 0.0 g: 0.008296312 - r: 0.106244646 + r: 0.106243826 CustomImage: CustomTile: Stackable: false diff --git a/unpacked/Custom_Tile Data Helper 708279.ttslua b/unpacked/Custom_Tile Data Helper 708279.ttslua index c58a9cb51..e13bad86e 100644 --- a/unpacked/Custom_Tile Data Helper 708279.ttslua +++ b/unpacked/Custom_Tile Data Helper 708279.ttslua @@ -1,1680 +1,1822 @@ - -- set true to enable debug logging - DEBUG = false - - function log(message) - if DEBUG then - print(message) - end - end - - --[[ - Known locations and clues. We check this to determine if we should - atttempt to spawn clues, first we look for _ and if - we find nothing we look for - format is [location_guid -> clueCount] - ]] - LOCATIONS_DATA_JSON = [[ - { - "Study": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Study_670914": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Attic_377b20": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Attic": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Cellar_5d3bcc": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Cellar": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Bathroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Bedroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Far Above Your House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Deep Below Your House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Northside_86faac": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Northside": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Graveyard": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Miskatonic University_cedb0a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Miskatonic University": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Downtown_1aa7cb": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Downtown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "St. Mary's Hospital": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Easttown_88245c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Easttown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Southside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Rivertown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Your House_377b20": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Your House_b28633": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Ritual Site": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Arkham Woods_e8e04b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Arkham Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "New Orleans_5ab18a": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "New Orleans": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Riverside_ab9d69": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Riverside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Wilderness_3c5ea8": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Wilderness": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unhallowed Land_552a1d": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Unhallowed Land": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Flooded Square": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Streets of Venice": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Rialto Bridge": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Venetian Garden": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Guardian": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Canal-side": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Accademia Bridge": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Bridge of Sighs": {"type": "fixed", "value": 2, "clueSide": "back"}, - - "Warren Observatory": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Science Building": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Orne Library": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Administration Building": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Student Union": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Humanities Building": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Dormitories": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - "Faculty Offices": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Faculty Offices_1c567d": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - - "La Bella Luna": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Back Hall Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Museum Entrance": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Security Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Security Office_fcb3e4": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Administration Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Administration Office_d2eb25": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Exhibit Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Exhibit Hall_563240": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Exhibit Hall_f3ffb6": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Exhibit Hall_0b0c58": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Exhibit Hall_2d87e6": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Exhibit Hall_da02ea": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - - "Train Car": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Train Car_f3f902": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Train Car_905f69": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Train Car_a3a321": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Train Car_464528": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Train Car_3cfca4": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Train Car_64ffb0": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Train Car_0fb5f0": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - "Engine Car": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "House in the Reeds": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Osborn's General Store": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Congregational Church": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Bishop's Brook": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Burned Ruins": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Schoolhouse": {"type": "fixed", "value": 1, "clueSide": "back"}, - - "Dunwich Village": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Dunwich Village_ac4427": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Cold Spring Glen": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Cold Spring Glen_e58475": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Ten-Acre Meadow": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Ten-Acre Meadow_05b0dd": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Blasted Heath": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Blasted Heath_995fe7": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Whateley Ruins": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Devil's Hop Yard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Devil's Hop Yard_f7dd31": {"type": "fixed", "value": 2, "clueSide": "back"}, - - "Base of the Hill": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Base of the Hill_80236e": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Ascending Path": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Ascending Path_d3ae26": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Sentinel Peak": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Diverging Path": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Diverging Path_7239aa": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Altered Path": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "The Edge of the Universe": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Tear Through Time": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Prismatic Cascade": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Towering Luminosity": {"type": "fixed", "value": 4, "clueSide": "front"}, - "Tear Through Space": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Endless Bridge": {"type": "fixed", "value": 2, "clueSide": "front"}, - "Dimensional Doorway": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Steps of Y'hagharl": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Unstable Vortex": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Indecipherable Stairs": {"type": "fixed", "value": 1, "clueSide": "front"}, - - "Backstage Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Backstage Doorway_0797a9": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Lobby Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Lobby Doorway_7605cf": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Lobby": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Backstage": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Foyer": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Historical Society": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Historical Society_40f79d": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Historical Society_b352f8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Historical Society_0cf5d5": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Historical Society_abc0cb": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Historical Society_ab6a72": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Hidden Library": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - - "Patient Confinement": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Asylum Halls": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Asylum Halls_f99530": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Asylum Halls_576595": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Infirmary": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Basement Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Yard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Garden": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Kitchen": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Mess Hall": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Grand Guignol": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Montmartre": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Montmartre_cbaacc": {"type": "perPlayer", "value": 0, "clueSide": "front"}, - "Montparnasse": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Notre-Dame": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Gare d'Orsay": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Opéra Garnier": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Canal Saint-Martin": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Le Marais": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Gardens of Luxembourg": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Père Lachaise Cemetery": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Catacombs": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Catacombs_29170f": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_f1237c": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_c3151e": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_14b1cb": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_81920c": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_c14c8b": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_ea2a55": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Catacombs_8bcab3": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Catacombs_7c7f4a": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Catacombs_80cf41": {"type": "fixed", "value": 0, "clueSide": "back"}, - - "Abbey Church": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Porte de l'Avancée": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Grand Rue": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Cloister": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Knight's Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Chœur Gothique": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Outer Wall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Outer Wall_014bd6": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "North Tower": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "North Tower_69eae5": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Chapel of St. Aubert": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - "Chapel of St. Aubert_e75ba8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Abbey Tower": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - "Abbey Tower_2f3d21": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Shores of Hali": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Dark Spires": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Palace of the King": {"type": "perPlayer", "value": 3, "clueSide": "front"}, - "Palace of the King_60d758": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Ruins of Carcosa": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Dim Streets": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Depths of Demhe": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Bleak Plains": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Recesses of Your Own Mind": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "The Throne Room": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Stage of the Ward Theatre": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Serpent’s Haven": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ruins of Eztli": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Rope Bridge": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Overgrown Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "River Canyon": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Path of Thorns": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Temple of the Fang": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Circuitous Trail": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Riverside Temple": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Waterfall": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Trail of the Dead": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Cloud Forest": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Chamber of Time": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ancient Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ancient Hall_b9acb8": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Grand Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Entryway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Underground Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Burial Pit": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Secret Passage": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Snake Pit": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Throne Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Mosaic Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Tomb of the Ancients": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Town Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Curiositie Shoppe": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "At the Station": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "At the Station_e0833c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Missing Persons": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Relic is Missing!": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Trial of the Huntress": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Search for the Meaning": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Seeking Trouble": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Seeking Trouble_42f93b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - - "Sacred Woods": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Chapultepec Hill": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Chapultepec Hill_baec21": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Canals of Tenochtitlán": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Lake Xochimilco": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Lake Xochimilco_59bf7d": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Templo Mayor": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Templo Mayor_fb0083": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Temples of Tenochtitlán": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Temples of Tenochtitlán_80cef8": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Mouth of K'n-yan_38a3e5": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Stone Altar": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Time-Wracked Woods": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Vast Passages": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Perilous Gulch": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Dark Hollow": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Hall of Idolatry": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Crystal Pillars": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ruins of K’n-yan": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Chthonian Depths": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Subterranean Swamp": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Treacherous Descent": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Interview Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Interview Room_b1861c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Halls of Pnakotus": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Deconstruction Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Towers of Pnakotus": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Laboratory of the Great Race": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Yithian Orrery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Great Library": {"type": "fixed", "value": 4, "clueSide": "back"}, - "Cyclopean Vaults": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Alien Conservatory": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "City of the Serpents": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Bridge over N'kai": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Abandoned Site": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Caverns of Yoth": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Hall of Heresy": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Bright Canyon": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Forked Path": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Nexus of N'kai": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "A Pocket in Time": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "City of the Unseen": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Valusia": {"type": "fixed", "value": 2, "clueSide": "front"}, - "Great Hall of Celeano": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Buenos Aires": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Ultima Thule": {"type": "fixed", "value": 2, "clueSide": "front"}, - - "Shores of R’lyeh": {"type": "fixed", "value": 2, "clueSide": "front"}, - "Atlantis": {"type": "fixed", "value": 2, "clueSide": "front"}, - "Pnakotus": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Ruins of New York": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Yuggoth": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Mu": {"type": "fixed", "value": 4, "clueSide": "front"}, - "Plateau of Leng_0ab6ff": {"type": "fixed", "value": 1, "clueSide": "front"}, - - "Billiards Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Billiards Room_33990b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Trophy Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Trophy Room_e9160a": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Master Bedroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Balcony_1b5483": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Office_a1bd9a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Witch-Haunted Woods_1539ea": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Witch-Haunted Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Witch-Haunted Woods_d3f8c3": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Witch-Haunted Woods_eca18e": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Paths into Twilight": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - - "The Imperial Entrance": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Dark Stairwell": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Stairway": {"type": "fixed", "value": 1, "clueSide": "back"}, - "The Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Back Booths": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Lobby": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Backroom Door": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Backroom Door_ed439d": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Dining Area": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Dance Floor": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Gateway to the East": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Back Alley": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Mingzhu Laundry": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Dragon's Den": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "The Phoenix's Nest": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Golden Temple of the Heavens": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Flea Market": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Zihao's House of Fighting Arts": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Daiyu's Tea Garden": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Moldy Halls": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Decrepit Door": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Walter Gilman's Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unknown Places_b538f8": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Unknown Places_7bea34": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Unknown Places": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Unknown Places_9a471d": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unknown Places_0ac3ea": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Strange Geometry": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Site of the Sacrifice": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - - "Hangman's Brook": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Abandoned Chapel": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Haunted Fields": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Lobby_1c2dfe": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Lobby_bcd556": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Lodge Gates_fa6a29": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Lodge Gates": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Lodge Cellar": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Lodge Cellar_8ea4fd": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Lounge": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Vault": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Inner Sanctum": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Library": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Library_47ccbc": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Sanctum Doorway": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Sanctum Doorway_4da6c3": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "The Geist-Trap": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Forbidding Shore": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unvisited Isle": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Rivertown_92ee68": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Rivertown_db4b20": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Southside_c898a0": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Southside_e7f5fa": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Silver Twilight Lodge": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Silver Twilight Lodge_17e686": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Hangman's Hill": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Hangman's Hill_5f4d8a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Cosmic Ingress": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Cosmos": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Cosmos_a89dbf": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Cosmos_1a0ad2": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Cosmos_30fc53": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Cosmos_8f3e16": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Cosmos_4e8ae3": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Cosmos_a8d84d": {"type": "fixed", "value": 4, "clueSide": "back"}, - "Cosmos_7a3ece": {"type": "fixed", "value": 6, "clueSide": "back"}, - "Cosmos_311eb1": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Seventy Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Seven Hundred Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Base of the Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Enchanted Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Stairwell": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Basement Door_42fa87": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Basement Door": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Waiting Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Emergency Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Experimental Therapies Ward": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Records Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Foyer_9a9f9a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Room 245": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Hotel Roof": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Office_b3ed47": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Room 212": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Basement": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Second Floor Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Room 225": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Restaurant": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Suite Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Ulthar": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Dylath-Leen": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Mt. Ngranek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Baharna": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Zulan-Thek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Sarnath": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "City-Which-Appears-On-No-Map": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Celephaïs": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Nameless Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Kadatheron": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Ilek-Vad": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Ruins of Ib": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Temple of Unattainable Desires": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Hazuth-Kleg": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Serannian": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Mysterious Stairs": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Mysterious Stairs_df1a40": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Attic_10faf9": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unmarked Tomb": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Upstairs Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Front Porch": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Downstairs Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Downstairs Doorway_c93906": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Burial Ground": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Temple of the Moon Lizard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "City of the Moon-Beasts": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Moon-Forest": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Dark Crater": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Caverns Beneath the Moon": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Black Core": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Light Side of the Moon": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "City of Gugs": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Vaults of Zin": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Plain of the Ghouls": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Sea of Bones": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Vale of Pnath": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Crag of the Ghouls": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Sea of Pitch": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Plateau of Leng": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Cold Wastes": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Monastery of Leng": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Onyx Gates": {"type": "fixed", "value": 12, "clueSide": "back"}, - "Forsaken Tower": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "The Crater": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Quarantine Zone": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Quarantine Zone_5f2a9b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Quarantine Zone_4a8e9c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Quarantine Zone_5193e9": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Quarantine Zone_b3a920": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "The Great Web": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Great Web_39ace3": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Great Web_727790": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Great Web_5c5ec4": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Great Web_361fd7": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Great Web_dfdc8c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Expedition Camp": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Desert Oasis": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Untouched Vault": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Sands of Dashur": {"type": "perPlayer", "value": 0, "clueSide": "front"}, - "Sandswept Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Nile River": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Faceless Sphinx": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Dunes of the Sahara": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Streets of Cairo": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Cairo Bazaar": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Temple Courtyard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Museum of Egyptian Antiquities": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Outskirts of Cairo": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Eldritch Gate": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Mist-Filled Caverns": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Stairway to Sarkomand": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Tunnels under Ngranek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "The Great Abyss": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "A Dream Betwixt": {"type": "perPlayer", "value": 0, "clueSide": "front"}, - - "Velma's Doghouse": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Barkham City Pound": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Barkham Asylum": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Beasttown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Tailside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Slobbertown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Snoutside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Muttskatonic University": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Boneyard": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "St. Mary's Animal Hospital": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Unfamiliar Chamber": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Tidal Tunnel": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Tidal Tunnel_0f20fc": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Tidal Tunnel_d5566b": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Tidal Tunnel_dc9eb7": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Tidal Tunnel_513d82": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - - "First National Grocery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Marsh Refinery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Innsmouth Square": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Innsmouth Harbour": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Fish Street Bridge_b6b9b7": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Gilman House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Little Bookshop": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Innsmouth Jail_f63738": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "New Church Green_d1ef9c": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Sawbone Alley_899c2c": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "The House on Water Street_e4f53a": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Shoreward Slums_24e42d": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Esoteric Order of Dagon_28c301": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Esoteric Order of Dagon_ef8cef": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "New Church Green_921a9b": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Marsh Refinery_44c342": {"type": "fixed", "value": 1, "clueSide": "back"}, - "The House on Water Street_104e07": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Little Bookshop_a17a82": {"type": "fixed", "value": 1, "clueSide": "back"}, - "First National Grocery_9ae75c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Fish Street Bridge_a358fc": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Innsmouth Harbour_30b2c0": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Sawbone Alley_e58cff": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Gilman House_e589b8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Innsmouth Jail_755fc0": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Shoreward Slums_c0d0df": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Desolate Coastline": {"type": "fixed", "value": 1, "clueSide": "back"}, - - "XXXX": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "xxx": {"type": "perPlayer", "value": 2, "clueSide": "back"} - } - ]] - --[[ - Player cards with token counts and types - ]] - PLAYER_CARD_DATA_JSON = [[ - { - "Flashlight": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Shrivelling": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Shrivelling (3)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Grotesque Statue (4)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Forbidden Knowledge": { - "tokenType": "resource", - "tokenCount": 4 - }, - ".45 Automatic": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Shotgun (4)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Liquid Courage": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Song of the Dead (2)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Cover Up": { - "tokenType": "clue", - "tokenCount": 3 - }, - "Roland's .38 Special": { - "tokenType": "resource", - "tokenCount": 4 - }, - "First Aid": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scrying": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".41 Derringer": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Painkillers": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Smoking Pipe": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Clarity of Mind": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Rite of Seeking": { - "tokenType": "resource", - "tokenCount": 3 - }, - "M1918 BAR (4)": { - "tokenType": "resource", - "tokenCount": 8 - }, - "Ornate Bow (3)": { - "tokenType": "resource", - "tokenCount": 1 - }, - ".41 Derringer (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Suggestion (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Chicago Typewriter (4)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Lupara (3)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "First Aid (3)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Springfield M1903 (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Springfield M1903 (4) (Taboo)": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".32 Colt": { - "tokenType": "resource", - "tokenCount": 6 - }, - "Venturer": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Lockpicks (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Finn's Trusty .38": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".45 Automatic (2)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Lightning Gun (5)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Strange Solution (4)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Strange Solution (4):Acidic Ichor": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Strange Solution (4):Empowering Elixir": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Arcane Insight (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Archaic Glyphs (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "In the Know (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Rite of Seeking (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Alchemical Transmutation": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scrying (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Shrivelling (5)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Mists of R'lyeh": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Mists of R'lyeh (4)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Colt Vest Pocket": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Old Hunting Rifle (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Thermos": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Feed the Mind (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Seal of the Seventh Sign (5)": { - "tokenType": "resource", - "tokenCount": 7 - }, - "Flamethrower (5)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Flamethrower (5) (Taboo)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Pnakotic Manuscripts (5)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Kerosene (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Shards of the Void (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Try and Try Again (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Arcane Initiate": { - "tokenType": "doom", - "tokenCount": 1 - }, - "Detective's Colt 1911s": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Extra Ammunition (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Rite of Seeking (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Arcane Initiate (3)": { - "tokenType": "doom", - "tokenCount": 1 - }, - "Clarity of Mind (3)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Fingerprint Kit": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Truth from Fiction": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Enchanted Blade": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Tennessee Sour Mash": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Scroll of Secrets": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scroll of Secrets (Taboo)": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".45 Thompson": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Mr. \"Rook\"": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Mr. \"Rook\" (Taboo)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scroll of Secrets (3):Seeker": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scroll of Secrets (3) (Taboo):Seeker": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scroll of Secrets (3):Mystic": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Scroll of Secrets (3) (Taboo):Mystic": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Enchanted Blade (3):Guardian": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Enchanted Blade (3):Mystic": { - "tokenType": "resource", - "tokenCount": 4 - }, - ".45 Thompson (3)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Esoteric Atlas (1)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Tennessee Sour Mash (3):Rogue": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Tennessee Sour Mash (3):Survivor": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Mk 1 Grenades (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Dayana Esperence (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Pendant of the Queen": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".32 Colt (2)": { - "tokenType": "resource", - "tokenCount": 6 - }, - "Alchemical Transmutation (2)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Suggestion (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Gate Box": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Tony's .38 Long Colt": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Gregory Gry": { - "tokenType": "resource", - "tokenCount": 9 - }, - "Scroll of Prophecies": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Healing Words": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Otherworld Codex (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".35 Winchester": { - "tokenType": "resource", - "tokenCount": 5 - }, - ".35 Winchester (Taboo)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Old Book of Lore (3)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Sawed-Off Shotgun (5)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Mind's Eye (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Colt Vest Pocket (2)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Mists of R'lyeh (2)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "The Chthonian Stone (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Flesh Ward": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Physical Training (4)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Encyclopedia": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Feed the Mind": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Forbidden Tome": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Esoteric Atlas (2)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "The Necronomicon (5)": { - "tokenType": "resource", - "tokenCount": 6 - }, - "The Necronomicon (5) (Taboo)": { - "tokenType": "resource", - "tokenCount": 6 - }, - "Mauser C96": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Liquid Courage (1)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Mauser C96 (2)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Beretta M1918 (4)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Scrying Mirror": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Azure Flame": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Clairvoyance": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Ineffable Truth": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Grotesque Statue (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Azure Flame (3)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Clairvoyance (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Ineffable Truth (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Arcane Studies (4)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Azure Flame (5)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Clairvoyance (5)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Ineffable Truth (5)": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".18 Derringer": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Grimm's Fairy Tales": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Old Keyring": { - "tokenType": "resource", - "tokenCount": 2 - }, - ".18 Derringer (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Chainsaw (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Becky": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Book of Psalms": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Cryptographic Cipher": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".25 Automatic": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Obfuscation": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Eldritch Sophist": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Armageddon": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Eye of Chaos": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Shroud of Shadows": { - "tokenType": "resource", - "tokenCount": 3 - }, - "xxx": { - "tokenType": "resource", - "tokenCount": 3 - } - } - ]] - LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) - PLAYER_CARD_DATA = JSON.decode(PLAYER_CARD_DATA_JSON) - - PLAYER_CARD_TOKEN_OFFSETS = { - [1] = { - { 0, 3, -0.2 }, - }, - [2] = { - { 0.4, 3, -0.2 }, - { -0.4, 3, -0.2 }, - }, - [3] = { - { 0, 3, -0.9 }, - { 0.4, 3, -0.2 }, - { -0.4, 3, -0.2 }, - }, - [4] = { - { 0.4, 3, -0.9 }, - { -0.4, 3, -0.9 }, - { 0.4, 3, -0.2 }, - { -0.4, 3, -0.2 } - }, - [5] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.4, 3, -0.2 }, - { -0.4, 3, -0.2 } - }, - [6] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.7, 3, -0.2 }, - { 0, 3, -0.2 }, - { -0.7, 3, -0.2 }, - }, - [7] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.7, 3, -0.2 }, - { 0, 3, -0.2 }, - { -0.7, 3, -0.2 }, - { 0, 3, 0.5 }, - }, - [8] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.7, 3, -0.2 }, - { 0, 3, -0.2 }, - { -0.7, 3, -0.2 }, - { -0.35, 3, 0.5 }, - { 0.35, 3, 0.5 }, - }, - [9] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.7, 3, -0.2 }, - { 0, 3, -0.2 }, - { -0.7, 3, -0.2 }, - { 0.7, 3, 0.5 }, - { 0, 3, 0.5 }, - { -0.7, 3, 0.5 }, - }, - [12] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.7, 3, -0.2 }, - { 0, 3, -0.2 }, - { -0.7, 3, -0.2 }, - { 0.7, 3, 0.5 }, - { 0, 3, 0.5 }, - { -0.7, 3, 0.5 }, - { 0.7, 3, 1.2 }, - { 0, 3, 1.2 }, - { -0.7, 3, 1.2 }, - } - - } - - modeData = { - ['Core Set'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['The Devourer Below'] = { - easy = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, - normal = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, - hard = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, - expert = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' } - }, - -----------------The Dunwich Legacy - - ['The Dunwich Legacy'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'red', 'blue' } } - }, - ['The Miskatonic Museum'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Essex County Express'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Blood on the Altar'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Undimensioned and Unseen'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Where Doom Awaits'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Lost in Time and Space'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - -----------------The Path to Carcosa - - ['The Path to Carcosa'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'skull', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'red', 'blue' } } - }, - ['The Last King'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['Echoes of the Past'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['The Unspeakable Oath'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['A Phantom of Truth'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['The Pallid Mask'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['Black Stars Rise'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['Dim Carcosa'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' } } - }, - -----------------The Forgotten Age - - ['The Forgotten Age'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } - }, - ['The Doom of Eztli'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Threads of Fate'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Boundary Beyond'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The City of Archives'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Depths of Yoth'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Heart of the Elders'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Shattered Aeons'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } } - }, - - -----------------The Circle Undone - - ['The Circle Undone'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm6', 'm8', 'skull', 'skull', 'red', 'blue' } } - }, - ["At Death's Doorstep"] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Secret Name'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Wages of Sin'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['For the Greater Good'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Union and Disillusion'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['In the Clutches of Chaos'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Before the Black Throne'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - - - -----------------The Dream-Eaters - - ['TDE_A'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['TDE_B'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } - }, - ['The Search For Kadath'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['A Thousand Shapes of Horror'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } - }, - ['Dark Side of the Moon'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['Point of No Return'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } - }, - ['Where the Gods Dwell'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['Weaver of the Cosmos'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } - }, - - - -----------------The Innsmouth Conspiracy - ['The Innsmouth Conspiracy'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } , - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } - }, - ['In Too Deep'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } - }, - - -----------------The Side Missions - --official - ['Curse of the Rougarou'] = { - normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Carnevale of Horrors'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Labyrinths of Lunacy'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'red', 'blue' } }, - hard = { token = { 'p1', '0','m1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'red', 'blue' } } - }, - ['Guardians of the Abyss'] = { - normal = { token = { 'p1', 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Excelsior'] = { - normal = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Read or Die'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['All or Nothing'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - - ['Meowlathotep'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - - --fan-made - ['Carnevale of Spiders'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - - ['The Nephew Calls'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Outsider'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Stranger Things'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Winter Winds'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'skull', 'cultist', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'cultist', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'cultist', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'cultist', 'red', 'blue' } } - }, - ['The Festival'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Forbidding Desert'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['Happys Funhouse'] = { - normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm5', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Knightfall'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'cultist', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Last Call at Roxies'] = { - easy = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } - }, - ['The Limens of Belief'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['Blood Spilled in Salem'] = { - normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Bread and Circuses'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['Bridge of Sighs'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['The Collector'] = { - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['The Colour out of Space'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Curse of Amultep'] = { - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['The Dying Star'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'blue', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'blue', 'red', 'blue' } } - }, - ['Against the Wendigo'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Pensher Wyrm'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'elder', 'red', 'blue' } } - }, - ['Approaching Storm'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Into the Shadowlands'] = { - easy = { token = { 'p1', 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['London Set 1'] = { - easy = { token = { 'p2', 'p1', '0', '0', '0', 'm1', 'm2', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm2', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - }, - ['London Set 2'] = { - normal = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'elder', 'tablet', 'red', 'blue' } }, - }, - ['London Set 3'] = { - normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - }, - ['Delta Green'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Jennys Choice'] = { - easy = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4','skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Blob'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['The Initiation'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } - }, - ['Consternation'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'red', 'blue' } }, - }, - ['Of Sphinx'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'elder', 'cultist', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'elder', 'cultist', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'elder', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['Ordis'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['Darkness Falls'] = { - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['War of the Worlds'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } - }, - ['Alice in Wonderland'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } - }, - ['Pokemon'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Safari'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Cerulean'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Erich Zann'] = { - easy = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Kaimonogatari'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - expert = { token = { '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm6', 'm8', 'skull', 'skull', 'cultist', 'red', 'blue' } } - }, - ['Sleepy Hollow'] = { - normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Flesh'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - }, - ['Dark Matter'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } } - }, - ['XXXX'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - - } - - function onSave() - local globalState = JSON.encode(SPAWNED_PLAYER_CARD_GUIDS) - log('saving global state: ' .. globalState) - self.script_state = globalState - end - - function onload(save_state) - if save_state ~= '' then - log('loading global state: ' .. save_state) - SPAWNED_PLAYER_CARD_GUIDS = JSON.decode(save_state) - else - SPAWNED_PLAYER_CARD_GUIDS = {} - end - end - - function getSpawnedPlayerCardGuid(params) - local guid = params[1] - if SPAWNED_PLAYER_CARD_GUIDS == nil then - return nil - end - return SPAWNED_PLAYER_CARD_GUIDS[guid] - end - - function setSpawnedPlayerCardGuid(params) - local guid = params[1] - local value = params[2] - if SPAWNED_PLAYER_CARD_GUIDS ~= nil then - SPAWNED_PLAYER_CARD_GUIDS[guid] = value - return true - end - return false - end \ No newline at end of file +-- set true to enable debug logging +DEBUG = false + +function log(message) + if DEBUG then + print(message) + end +end + +--[[ +Known locations and clues. We check this to determine if we should +atttempt to spawn clues, first we look for _ and if +we find nothing we look for +format is [location_guid -> clueCount] +]] +LOCATIONS_DATA_JSON = [[ +{ + "Study": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Study_670914": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Attic_377b20": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Attic": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Cellar_5d3bcc": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Cellar": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Bathroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Bedroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Far Above Your House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Deep Below Your House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Northside_86faac": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Northside": {"type" : "perPlayer", "value": 2, "clueSide": "back"}, + "Graveyard": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Miskatonic University_cedb0a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Miskatonic University": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Downtown_1aa7cb": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Downtown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "St. Mary's Hospital": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Easttown_88245c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Easttown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Southside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Rivertown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Your House_377b20": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Your House_b28633": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Ritual Site": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Arkham Woods_e8e04b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Arkham Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "New Orleans_5ab18a": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "New Orleans": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Riverside_ab9d69": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Riverside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Wilderness_3c5ea8": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Wilderness": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unhallowed Land_552a1d": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Unhallowed Land": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Flooded Square": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Streets of Venice": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Rialto Bridge": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Venetian Garden": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Guardian": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Canal-side": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Accademia Bridge": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Bridge of Sighs": {"type": "fixed", "value": 2, "clueSide": "back"}, + + "Warren Observatory": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Science Building": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Orne Library": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Administration Building": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Student Union": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Humanities Building": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Dormitories": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + "Faculty Offices": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Faculty Offices_1c567d": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + + "La Bella Luna": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Back Hall Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Museum Entrance": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Security Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Security Office_fcb3e4": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Administration Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Administration Office_d2eb25": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Exhibit Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Exhibit Hall_563240": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Exhibit Hall_f3ffb6": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Exhibit Hall_0b0c58": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Exhibit Hall_2d87e6": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Exhibit Hall_da02ea": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + + "Train Car": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Train Car_f3f902": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Train Car_905f69": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Train Car_a3a321": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Train Car_464528": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Train Car_3cfca4": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Train Car_64ffb0": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Train Car_0fb5f0": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + "Engine Car": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "House in the Reeds": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Osborn's General Store": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Congregational Church": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Bishop's Brook": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Burned Ruins": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Schoolhouse": {"type": "fixed", "value": 1, "clueSide": "back"}, + + "Dunwich Village": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Dunwich Village_ac4427": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Cold Spring Glen": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Cold Spring Glen_e58475": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Ten-Acre Meadow": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Ten-Acre Meadow_05b0dd": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Blasted Heath": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Blasted Heath_995fe7": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Whateley Ruins": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Devil's Hop Yard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Devil's Hop Yard_f7dd31": {"type": "fixed", "value": 2, "clueSide": "back"}, + + "Base of the Hill": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Base of the Hill_80236e": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Ascending Path": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Ascending Path_d3ae26": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Sentinel Peak": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Diverging Path": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Diverging Path_7239aa": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Altered Path": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "The Edge of the Universe": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Tear Through Time": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Prismatic Cascade": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Towering Luminosity": {"type": "fixed", "value": 4, "clueSide": "front"}, + "Tear Through Space": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Endless Bridge": {"type": "fixed", "value": 2, "clueSide": "front"}, + "Dimensional Doorway": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Steps of Y'hagharl": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Unstable Vortex": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Indecipherable Stairs": {"type": "fixed", "value": 1, "clueSide": "front"}, + + "Backstage Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Backstage Doorway_0797a9": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Lobby Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Lobby Doorway_7605cf": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Lobby": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Backstage": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Foyer": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Historical Society": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Historical Society_40f79d": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Historical Society_b352f8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Historical Society_0cf5d5": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Historical Society_abc0cb": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Historical Society_ab6a72": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Hidden Library": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + + "Patient Confinement": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Asylum Halls": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Asylum Halls_f99530": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Asylum Halls_576595": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Infirmary": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Basement Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Yard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Garden": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Kitchen": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Mess Hall": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Grand Guignol": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Montmartre": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Montmartre_cbaacc": {"type": "perPlayer", "value": 0, "clueSide": "front"}, + "Montparnasse": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Notre-Dame": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Gare d'Orsay": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Opéra Garnier": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Canal Saint-Martin": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Le Marais": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Gardens of Luxembourg": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Père Lachaise Cemetery": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Catacombs": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Catacombs_29170f": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_f1237c": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_c3151e": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_14b1cb": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_81920c": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_c14c8b": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_ea2a55": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Catacombs_8bcab3": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Catacombs_7c7f4a": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Catacombs_80cf41": {"type": "fixed", "value": 0, "clueSide": "back"}, + + "Abbey Church": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Porte de l'Avancée": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Grand Rue": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Cloister": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Knight's Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Chœur Gothique": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Outer Wall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Outer Wall_014bd6": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "North Tower": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "North Tower_69eae5": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Chapel of St. Aubert": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + "Chapel of St. Aubert_e75ba8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Abbey Tower": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + "Abbey Tower_2f3d21": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Shores of Hali": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Dark Spires": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Palace of the King": {"type": "perPlayer", "value": 3, "clueSide": "front"}, + "Palace of the King_60d758": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Ruins of Carcosa": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Dim Streets": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Depths of Demhe": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Bleak Plains": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Recesses of Your Own Mind": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "The Throne Room": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Stage of the Ward Theatre": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Serpent’s Haven": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ruins of Eztli": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Rope Bridge": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Overgrown Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "River Canyon": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Path of Thorns": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Temple of the Fang": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Circuitous Trail": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Riverside Temple": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Waterfall": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Trail of the Dead": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Cloud Forest": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Chamber of Time": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ancient Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ancient Hall_b9acb8": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Grand Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Entryway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Underground Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Burial Pit": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Secret Passage": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Snake Pit": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Throne Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Mosaic Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Tomb of the Ancients": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Town Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Curiositie Shoppe": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "At the Station": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "At the Station_e0833c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Missing Persons": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Relic is Missing!": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Trial of the Huntress": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Search for the Meaning": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Seeking Trouble": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Seeking Trouble_42f93b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + + "Sacred Woods": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Chapultepec Hill": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Chapultepec Hill_baec21": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Canals of Tenochtitlán": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Lake Xochimilco": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Lake Xochimilco_59bf7d": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Templo Mayor": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Templo Mayor_fb0083": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Temples of Tenochtitlán": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Temples of Tenochtitlán_80cef8": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Mouth of K'n-yan_38a3e5": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Stone Altar": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Time-Wracked Woods": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Vast Passages": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Perilous Gulch": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Dark Hollow": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Hall of Idolatry": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Crystal Pillars": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ruins of K’n-yan": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Chthonian Depths": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Subterranean Swamp": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Treacherous Descent": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Interview Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Interview Room_b1861c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Halls of Pnakotus": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Deconstruction Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Towers of Pnakotus": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Laboratory of the Great Race": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Yithian Orrery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Great Library": {"type": "fixed", "value": 4, "clueSide": "back"}, + "Cyclopean Vaults": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Alien Conservatory": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "City of the Serpents": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Bridge over N'kai": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Abandoned Site": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Caverns of Yoth": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Hall of Heresy": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Bright Canyon": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Forked Path": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Nexus of N'kai": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "A Pocket in Time": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "City of the Unseen": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Valusia": {"type": "fixed", "value": 2, "clueSide": "front"}, + "Great Hall of Celeano": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Buenos Aires": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Ultima Thule": {"type": "fixed", "value": 2, "clueSide": "front"}, + + "Shores of R’lyeh": {"type": "fixed", "value": 2, "clueSide": "front"}, + "Atlantis": {"type": "fixed", "value": 2, "clueSide": "front"}, + "Pnakotus": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Ruins of New York": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Yuggoth": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Mu": {"type": "fixed", "value": 4, "clueSide": "front"}, + "Plateau of Leng_0ab6ff": {"type": "fixed", "value": 1, "clueSide": "front"}, + + "Billiards Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Billiards Room_33990b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Trophy Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Trophy Room_e9160a": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Master Bedroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Balcony_1b5483": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Office_a1bd9a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Witch-Haunted Woods_1539ea": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Witch-Haunted Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Witch-Haunted Woods_d3f8c3": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Witch-Haunted Woods_eca18e": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Paths into Twilight": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + + "The Imperial Entrance": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Dark Stairwell": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Stairway": {"type": "fixed", "value": 1, "clueSide": "back"}, + "The Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Back Booths": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Lobby": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Backroom Door": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Backroom Door_ed439d": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Dining Area": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Dance Floor": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Gateway to the East": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Back Alley": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Mingzhu Laundry": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Dragon's Den": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "The Phoenix's Nest": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Golden Temple of the Heavens": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Flea Market": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Zihao's House of Fighting Arts": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Daiyu's Tea Garden": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Moldy Halls": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Decrepit Door": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Walter Gilman's Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unknown Places_b538f8": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Unknown Places_7bea34": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Unknown Places": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Unknown Places_9a471d": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unknown Places_0ac3ea": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Strange Geometry": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Site of the Sacrifice": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + + "Hangman's Brook": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Abandoned Chapel": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Haunted Fields": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Lobby_1c2dfe": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Lobby_bcd556": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Lodge Gates_fa6a29": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Lodge Gates": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Lodge Cellar": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Lodge Cellar_8ea4fd": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Lounge": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Vault": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Inner Sanctum": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Library": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Library_47ccbc": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Sanctum Doorway": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Sanctum Doorway_4da6c3": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "The Geist-Trap": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Forbidding Shore": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unvisited Isle": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Rivertown_92ee68": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Rivertown_db4b20": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Southside_c898a0": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Southside_e7f5fa": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Silver Twilight Lodge": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Silver Twilight Lodge_17e686": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Hangman's Hill": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Hangman's Hill_5f4d8a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Cosmic Ingress": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Cosmos": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Cosmos_a89dbf": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Cosmos_1a0ad2": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Cosmos_30fc53": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Cosmos_8f3e16": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Cosmos_4e8ae3": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Cosmos_a8d84d": {"type": "fixed", "value": 4, "clueSide": "back"}, + "Cosmos_7a3ece": {"type": "fixed", "value": 6, "clueSide": "back"}, + "Cosmos_311eb1": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Seventy Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Seven Hundred Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Base of the Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Enchanted Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Stairwell": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Basement Door_42fa87": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Basement Door": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Waiting Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Emergency Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Experimental Therapies Ward": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Records Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Foyer_9a9f9a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Room 245": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Hotel Roof": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Office_b3ed47": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Room 212": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Basement": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Second Floor Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Room 225": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Restaurant": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Suite Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Ulthar": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Dylath-Leen": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Mt. Ngranek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Baharna": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Zulan-Thek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Sarnath": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "City-Which-Appears-On-No-Map": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Celephaïs": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Nameless Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Kadatheron": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Ilek-Vad": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Ruins of Ib": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Temple of Unattainable Desires": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Hazuth-Kleg": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Serannian": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Mysterious Stairs": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Mysterious Stairs_df1a40": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Attic_10faf9": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unmarked Tomb": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Upstairs Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Front Porch": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Downstairs Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Downstairs Doorway_c93906": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Burial Ground": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Temple of the Moon Lizard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "City of the Moon-Beasts": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Moon-Forest": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Dark Crater": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Caverns Beneath the Moon": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Black Core": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Light Side of the Moon": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "City of Gugs": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Vaults of Zin": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Plain of the Ghouls": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Sea of Bones": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Vale of Pnath": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Crag of the Ghouls": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Sea of Pitch": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Plateau of Leng": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Cold Wastes": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Monastery of Leng": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Onyx Gates": {"type": "fixed", "value": 12, "clueSide": "back"}, + "Forsaken Tower": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "The Crater": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Quarantine Zone": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Quarantine Zone_5f2a9b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Quarantine Zone_4a8e9c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Quarantine Zone_5193e9": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Quarantine Zone_b3a920": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "The Great Web": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Great Web_39ace3": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Great Web_727790": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Great Web_5c5ec4": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Great Web_361fd7": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Great Web_dfdc8c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Expedition Camp": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Desert Oasis": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Untouched Vault": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Sands of Dashur": {"type": "perPlayer", "value": 0, "clueSide": "front"}, + "Sandswept Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Nile River": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Faceless Sphinx": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Dunes of the Sahara": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Streets of Cairo": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Cairo Bazaar": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Temple Courtyard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Museum of Egyptian Antiquities": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Outskirts of Cairo": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Eldritch Gate": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Mist-Filled Caverns": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Stairway to Sarkomand": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Tunnels under Ngranek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "The Great Abyss": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "A Dream Betwixt": {"type": "perPlayer", "value": 0, "clueSide": "front"}, + + "Velma's Doghouse": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Barkham City Pound": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Barkham Asylum": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Beasttown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Tailside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Slobbertown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Snoutside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Muttskatonic University": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Boneyard": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "St. Mary's Animal Hospital": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Arkham": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Streets of New York City": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Penthouse": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Burning Pit": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Streets of Providence": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Athenaeum of the Empty Sky": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Arcade": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Streets of Montréal": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Chateau Ramezay": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Shrine of Magh’an Ark’at": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Unfamiliar Chamber": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Tidal Tunnel": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Tidal Tunnel_0f20fc": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Tidal Tunnel_d5566b": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Tidal Tunnel_dc9eb7": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Tidal Tunnel_513d82": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + + "First National Grocery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Marsh Refinery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Innsmouth Square": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Innsmouth Harbour": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Fish Street Bridge_b6b9b7": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Gilman House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Little Bookshop": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Innsmouth Jail_f63738": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "New Church Green_d1ef9c": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Sawbone Alley_899c2c": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "The House on Water Street_e4f53a": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Shoreward Slums_24e42d": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Esoteric Order of Dagon_28c301": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Esoteric Order of Dagon_ef8cef": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "New Church Green_921a9b": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Marsh Refinery_44c342": {"type": "fixed", "value": 1, "clueSide": "back"}, + "The House on Water Street_104e07": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Little Bookshop_a17a82": {"type": "fixed", "value": 1, "clueSide": "back"}, + "First National Grocery_9ae75c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Fish Street Bridge_a358fc": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Innsmouth Harbour_30b2c0": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Sawbone Alley_e58cff": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Gilman House_e589b8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Innsmouth Jail_755fc0": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Shoreward Slums_c0d0df": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Desolate Coastline": {"type": "fixed", "value": 1, "clueSide": "back"}, + + "Unfathomable Depths_cb5e3e": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Unfathomable Depths_7d180e": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unfathomable Depths_fdf43f": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Unfathomable Depths_431ca2": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unfathomable Depths_dfc9b4": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Unfathomable Depths_086743": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "XXXX": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "xxx": {"type": "perPlayer", "value": 2, "clueSide": "back"} +} +]] +--[[ +Player cards with token counts and types +]] +PLAYER_CARD_DATA_JSON = [[ +{ + "Flashlight": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Shrivelling": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Shrivelling (3)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Grotesque Statue (4)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Forbidden Knowledge": { + "tokenType": "resource", + "tokenCount": 4 + }, + ".45 Automatic": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Shotgun (4)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Liquid Courage": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Song of the Dead (2)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Cover Up": { + "tokenType": "clue", + "tokenCount": 3 + }, + "Roland's .38 Special": { + "tokenType": "resource", + "tokenCount": 4 + }, + "First Aid": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scrying": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".41 Derringer": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Painkillers": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Smoking Pipe": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Clarity of Mind": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Rite of Seeking": { + "tokenType": "resource", + "tokenCount": 3 + }, + "M1918 BAR (4)": { + "tokenType": "resource", + "tokenCount": 8 + }, + "Ornate Bow (3)": { + "tokenType": "resource", + "tokenCount": 1 + }, + ".41 Derringer (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Suggestion (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Chicago Typewriter (4)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Lupara (3)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "First Aid (3)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Springfield M1903 (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Springfield M1903 (4) (Taboo)": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".32 Colt": { + "tokenType": "resource", + "tokenCount": 6 + }, + "Venturer": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Lockpicks (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Finn's Trusty .38": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".45 Automatic (2)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Lightning Gun (5)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Strange Solution (4)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Strange Solution (4):Acidic Ichor": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Strange Solution (4):Empowering Elixir": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Arcane Insight (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Archaic Glyphs (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "In the Know (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Rite of Seeking (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Alchemical Transmutation": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scrying (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Shrivelling (5)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Mists of R'lyeh": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Mists of R'lyeh (4)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Colt Vest Pocket": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Old Hunting Rifle (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Thermos": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Feed the Mind (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Seal of the Seventh Sign (5)": { + "tokenType": "resource", + "tokenCount": 7 + }, + "Flamethrower (5)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Flamethrower (5) (Taboo)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Pnakotic Manuscripts (5)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Kerosene (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Shards of the Void (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Try and Try Again (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Arcane Initiate": { + "tokenType": "doom", + "tokenCount": 1 + }, + "Detective's Colt 1911s": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Extra Ammunition (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Rite of Seeking (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Arcane Initiate (3)": { + "tokenType": "doom", + "tokenCount": 1 + }, + "Clarity of Mind (3)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Fingerprint Kit": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Truth from Fiction": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Enchanted Blade": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Tennessee Sour Mash": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Scroll of Secrets": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scroll of Secrets (Taboo)": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".45 Thompson": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Mr. \"Rook\"": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Mr. \"Rook\" (Taboo)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scroll of Secrets (3):Seeker": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scroll of Secrets (3) (Taboo):Seeker": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scroll of Secrets (3):Mystic": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Scroll of Secrets (3) (Taboo):Mystic": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Enchanted Blade (3):Guardian": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Enchanted Blade (3):Mystic": { + "tokenType": "resource", + "tokenCount": 4 + }, + ".45 Thompson (3)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Esoteric Atlas (1)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Tennessee Sour Mash (3):Rogue": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Tennessee Sour Mash (3):Survivor": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Mk 1 Grenades (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Dayana Esperence (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Pendant of the Queen": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".32 Colt (2)": { + "tokenType": "resource", + "tokenCount": 6 + }, + "Alchemical Transmutation (2)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Suggestion (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Gate Box": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Tony's .38 Long Colt": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Gregory Gry": { + "tokenType": "resource", + "tokenCount": 9 + }, + "Scroll of Prophecies": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Healing Words": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Otherworld Codex (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".35 Winchester": { + "tokenType": "resource", + "tokenCount": 5 + }, + ".35 Winchester (Taboo)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Old Book of Lore (3)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Sawed-Off Shotgun (5)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Mind's Eye (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Colt Vest Pocket (2)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Mists of R'lyeh (2)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "The Chthonian Stone (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Flesh Ward": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Physical Training (4)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Encyclopedia": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Feed the Mind": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Forbidden Tome": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Esoteric Atlas (2)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "The Necronomicon (5)": { + "tokenType": "resource", + "tokenCount": 6 + }, + "The Necronomicon (5) (Taboo)": { + "tokenType": "resource", + "tokenCount": 6 + }, + "Mauser C96": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Liquid Courage (1)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Mauser C96 (2)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Beretta M1918 (4)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Scrying Mirror": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Azure Flame": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Clairvoyance": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Ineffable Truth": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Grotesque Statue (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Azure Flame (3)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Clairvoyance (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Ineffable Truth (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Arcane Studies (4)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Azure Flame (5)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Clairvoyance (5)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Ineffable Truth (5)": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".18 Derringer": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Grimm's Fairy Tales": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Old Keyring": { + "tokenType": "resource", + "tokenCount": 2 + }, + ".18 Derringer (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Chainsaw (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Becky": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Book of Psalms": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Cryptographic Cipher": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".25 Automatic": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Obfuscation": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Eldritch Sophist": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Armageddon": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Eye of Chaos": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Shroud of Shadows": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Tool Belt (0)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Tool Belt (3)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Gabriel": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Fingerprint Kit (5)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Old Keyring (5)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Flux Stabilizer": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Cultes des Goules": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Dragon Idol": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Elixir of Life": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Fetch Stick": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Heart of Winter": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Massa di Requiem per Shuggay": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Mi-Go Brain Case": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Milk of Shub-Niggurath": { + "tokenType": "resource", + "tokenCount": 1 + }, + "Ruby of R'yleh": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Sword of Saint Jerome": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Sword of Y'ha-Talla": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Vach-Viraj Chant": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Zanthu Tablets": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Lamp of Alhazred": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Soul Gem": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Book of the Believer": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Mask of Wisdom": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Key of Tawil At-Umr": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Warding Statue": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Yithian Rifle": { + "tokenType": "resource", + "tokenCount": 3 + }, + "xxx": { + "tokenType": "resource", + "tokenCount": 3 + } +} +]] +LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) +PLAYER_CARD_DATA = JSON.decode(PLAYER_CARD_DATA_JSON) + +PLAYER_CARD_TOKEN_OFFSETS = { + [1] = { + { 0, 3, -0.2 }, + }, + [2] = { + { 0.4, 3, -0.2 }, + { -0.4, 3, -0.2 }, + }, + [3] = { + { 0, 3, -0.9 }, + { 0.4, 3, -0.2 }, + { -0.4, 3, -0.2 }, + }, + [4] = { + { 0.4, 3, -0.9 }, + { -0.4, 3, -0.9 }, + { 0.4, 3, -0.2 }, + { -0.4, 3, -0.2 } + }, + [5] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.4, 3, -0.2 }, + { -0.4, 3, -0.2 } + }, + [6] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.7, 3, -0.2 }, + { 0, 3, -0.2 }, + { -0.7, 3, -0.2 }, + }, + [7] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.7, 3, -0.2 }, + { 0, 3, -0.2 }, + { -0.7, 3, -0.2 }, + { 0, 3, 0.5 }, + }, + [8] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.7, 3, -0.2 }, + { 0, 3, -0.2 }, + { -0.7, 3, -0.2 }, + { -0.35, 3, 0.5 }, + { 0.35, 3, 0.5 }, + }, + [9] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.7, 3, -0.2 }, + { 0, 3, -0.2 }, + { -0.7, 3, -0.2 }, + { 0.7, 3, 0.5 }, + { 0, 3, 0.5 }, + { -0.7, 3, 0.5 }, + }, + [12] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.7, 3, -0.2 }, + { 0, 3, -0.2 }, + { -0.7, 3, -0.2 }, + { 0.7, 3, 0.5 }, + { 0, 3, 0.5 }, + { -0.7, 3, 0.5 }, + { 0.7, 3, 1.2 }, + { 0, 3, 1.2 }, + { -0.7, 3, 1.2 }, + } + +} + +modeData = { + ['Core Set'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['The Devourer Below'] = { + easy = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, + normal = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, + hard = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, + expert = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' } + }, + -----------------The Dunwich Legacy + + ['The Dunwich Legacy'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'red', 'blue' } } + }, + ['The Miskatonic Museum'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Essex County Express'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Blood on the Altar'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Undimensioned and Unseen'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Where Doom Awaits'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Lost in Time and Space'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + -----------------The Path to Carcosa + + ['The Path to Carcosa'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'skull', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'red', 'blue' } } + }, + ['The Last King'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['Echoes of the Past'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['The Unspeakable Oath'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['A Phantom of Truth'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['The Pallid Mask'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['Black Stars Rise'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['Dim Carcosa'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' } } + }, + -----------------The Forgotten Age + + ['The Forgotten Age'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } + }, + ['The Doom of Eztli'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Threads of Fate'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Boundary Beyond'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The City of Archives'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Depths of Yoth'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Heart of the Elders'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Shattered Aeons'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } } + }, + + -----------------The Circle Undone + + ['The Circle Undone'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm6', 'm8', 'skull', 'skull', 'red', 'blue' } } + }, + ["At Death's Doorstep"] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Secret Name'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Wages of Sin'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['For the Greater Good'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Union and Disillusion'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['In the Clutches of Chaos'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Before the Black Throne'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + + + -----------------The Dream-Eaters + + ['TDE_A'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['TDE_B'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } + }, + ['The Search For Kadath'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['A Thousand Shapes of Horror'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } + }, + ['Dark Side of the Moon'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['Point of No Return'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } + }, + ['Where the Gods Dwell'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['Weaver of the Cosmos'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } + }, + + + -----------------The Innsmouth Conspiracy + ['The Innsmouth Conspiracy'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } , + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + ['The Vanishing of Elina Harper'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + ['In Too Deep'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + ['Devil Reef'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + + -----------------The Side Missions + --official + ['Curse of the Rougarou'] = { + normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Carnevale of Horrors'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Labyrinths of Lunacy'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'red', 'blue' } }, + hard = { token = { 'p1', '0','m1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'red', 'blue' } } + }, + ['Guardians of the Abyss'] = { + normal = { token = { 'p1', 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Excelsior'] = { + normal = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Read or Die'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['All or Nothing'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + + ['Meowlathotep'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + + ['WotOG'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'skull', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'skull', 'red', 'blue' } } + }, + + ['Bad Blood'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + + --fan-made + ['Carnevale of Spiders'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + + ['The Nephew Calls'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Outsider'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Stranger Things'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Winter Winds'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'skull', 'cultist', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'cultist', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'cultist', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'cultist', 'red', 'blue' } } + }, + ['The Festival'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Forbidding Desert'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['Happys Funhouse'] = { + normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm5', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Knightfall'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'cultist', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Last Call at Roxies'] = { + easy = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + ['The Limens of Belief'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['Blood Spilled in Salem'] = { + normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Bread and Circuses'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['Bridge of Sighs'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['The Collector'] = { + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['The Colour out of Space'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Curse of Amultep'] = { + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['The Dying Star'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'blue', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'blue', 'red', 'blue' } } + }, + ['Against the Wendigo'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Pensher Wyrm'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + ['Approaching Storm'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Into the Shadowlands'] = { + easy = { token = { 'p1', 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['London Set 1'] = { + easy = { token = { 'p2', 'p1', '0', '0', '0', 'm1', 'm2', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm2', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + }, + ['London Set 2'] = { + normal = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'elder', 'tablet', 'red', 'blue' } }, + }, + ['London Set 3'] = { + normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + }, + ['Delta Green'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Jennys Choice'] = { + easy = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4','skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Blob'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['The Initiation'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } + }, + ['Consternation'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'red', 'blue' } }, + }, + ['Of Sphinx'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'elder', 'cultist', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'elder', 'cultist', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'elder', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['Ordis'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['Darkness Falls'] = { + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['War of the Worlds'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } + }, + ['Alice in Wonderland'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } + }, + ['Pokemon'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Safari'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Cerulean'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Erich Zann'] = { + easy = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Kaimonogatari'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + expert = { token = { '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm6', 'm8', 'skull', 'skull', 'cultist', 'red', 'blue' } } + }, + ['Sleepy Hollow'] = { + normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Flesh'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + }, + ['Dark Matter'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } } + }, + ['XXXX'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + +} + +function onSave() + local globalState = JSON.encode(SPAWNED_PLAYER_CARD_GUIDS) + log('saving global state: ' .. globalState) + self.script_state = globalState +end + +function onload(save_state) + if save_state ~= '' then + log('loading global state: ' .. save_state) + SPAWNED_PLAYER_CARD_GUIDS = JSON.decode(save_state) + else + SPAWNED_PLAYER_CARD_GUIDS = {} + end +end + +function getSpawnedPlayerCardGuid(params) + local guid = params[1] + if SPAWNED_PLAYER_CARD_GUIDS == nil then + return nil + end + return SPAWNED_PLAYER_CARD_GUIDS[guid] +end + +function setSpawnedPlayerCardGuid(params) + local guid = params[1] + local value = params[2] + if SPAWNED_PLAYER_CARD_GUIDS ~= nil then + SPAWNED_PLAYER_CARD_GUIDS[guid] = value + return true + end + return false +end \ No newline at end of file diff --git a/unpacked/Custom_Tile Deck Importer 928c8e.yaml b/unpacked/Custom_Tile Deck Importer 928c8e.yaml deleted file mode 100644 index b3ee407f0..000000000 --- a/unpacked/Custom_Tile Deck Importer 928c8e.yaml +++ /dev/null @@ -1,72 +0,0 @@ -AttachedSnapPoints: -- Position: - x: -0.34 - y: 0.2 - z: 0.33 -- Position: - x: -0.85 - y: 0.2 - z: 0.33 -- Position: - x: 0.88 - y: 0.2 - z: 0.33 -- Position: - x: -1.36 - y: 0.2 - z: 0.33 -Autoraise: true -ColorDiffuse: - b: 0.0 - g: 0.5110329 - r: 0.7473869 -CustomImage: - CustomTile: - Stackable: false - Stretch: true - Thickness: 0.2 - Type: 3 - ImageScalar: 1.0 - ImageSecondaryURL: '' - ImageURL: https://i.imgur.com/8wYqD7B.jpg - WidthScale: 0.0 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: 928c8e -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: true -IgnoreFoW: false -Locked: true -LuaScript: !include 'Custom_Tile Deck Importer 928c8e.ttslua' -LuaScriptState: '' -MeasureMovement: false -Name: Custom_Tile -Nickname: Deck Importer -PhysicsMaterial: - BounceCombine: 0 - Bounciness: 0.0 - DynamicFriction: 0.6 - FrictionCombine: 0 - StaticFriction: 0.6 -Rigidbody: - AngularDrag: 0.1 - Drag: 0.1 - Mass: 1.732545 - UseGravity: true -Snap: true -Sticky: true -Tooltip: false -Transform: - posX: -61.66 - posY: 1.2 - posZ: -70.5 - rotX: 0.02 - rotY: 270.0 - rotZ: 0.02 - scaleX: 5.4 - scaleY: 1.0 - scaleZ: 5.4 -XmlUI: '' diff --git a/unpacked/Custom_Tile Deck Importer 928c8e.ttslua b/unpacked/Custom_Tile New Deck Importer edad66.ttslua similarity index 60% rename from unpacked/Custom_Tile Deck Importer 928c8e.ttslua rename to unpacked/Custom_Tile New Deck Importer edad66.ttslua index 9c7c3089f..58fb460b9 100644 --- a/unpacked/Custom_Tile Deck Importer 928c8e.ttslua +++ b/unpacked/Custom_Tile New Deck Importer edad66.ttslua @@ -1,574 +1,431 @@ ---[[ Lua code. See documentation: http://berserk-games.com/knowledgebase/scripting/ --]] - ---[[ The onLoad event is called after the game save finishes loading. --]] -function onLoad() - --[[ print('onLoad!') --]] - init() - -- Setup... - publicDeckURL="https://arkhamdb.com/api/public/decklist/" - privateDeckURL="https://arkhamdb.com/api/public/deck/" - cardURL="https://arkhamdb.com/api/public/card/" - tabooListURL="https://arkhamdb.com/api/public/taboos/" - subnameCards={{name="Randolph Carter",xp=0},{name="Dream Diary",xp=3},{name="Relic of Ages",xp=0},{name="The Necronomicon",xp=0},{name="Archaic Glyphs",xp=3},{name="Strange Solution",xp=4},{name="Forbidden Tome",xp=3},{name="Relic of Ages",xp=0}, {name="Ancient Stone",xp=4}, {"Dream Diary",xp=0},{name="Empower Self",xp=2}} - extraPermanents={["Duke"]=true,["Sophie"]=true,["Gate Box"]=true,["Dark Insight"]=true} - multiClassCards={{name=".45 Thompson",xp=3},{name="Scroll of Secrets",xp=3},{name="Tennessee Sour Mash",xp=3},{name="Enchanted Blade",xp=3},{name="Grisly Totem",xp=3}} - returningCards={{name="On Your Own"}} - advancedSignatures={{name="Daisy's Tote Bag"},{name="The Necronomicon"},{name="On the Lam"},{name="Hospital Debts"}} - bondedCardsOneThree={{name="Hallowed Mirror",bondedName="Soothing Melody",bondedCode=05314},{name="Occult Lexicon",bondedName="Blood-Rite",bondedCode=05317},{name="The Hungering Blade",bondedName="Bloodlust",bondedCode=06019},{name="Nightmare Bauble",bondedName="Dream Parasite",bondedCode=06331},{name="Miss Doyle",bondedName="Hope",bondedCode=06031,bondedNameSecond="Zeal",bondedCodeSecond=06032,bondedNameThird="Augur",bondedCodeThird=06033}} - bondedCardsBoolean = {{name="Gate Box",bondedName="Dream-Gate",bondedCode="06015a",bondCount=1},{name="Crystallizer of Dreams",bondedName="Guardian of the Crystallizer",bondedCode=06025,bondCount=2},{name="Dream Diary",bondedName="Essence of the Dream",bondedCode=06113,bondCount=1},{name="Empty Vessel",bondedName="Wish Eater",bondedCode=06277,bondCount=1},{name="Segment of Onyx",bondedName="Pendant of the Queen",bondedCode=06022,bondCount=1},{name="Stargazing",bondedName="The Stars Are Right",bondedCode=06028,bondCount=2},{name="Summoned Hound",bondedName="Unbound Beast",bondedCode=06283,bondCount=2}} - privateDeck = true - permanents = true - - local tileGUID = '928c8e' - tile = getObjectFromGUID(tileGUID) - makeText() - makeButton() - makeCheckboxPP() - makeCheckboxPerms() - - -- Get current taboolist - tabooList = {} - WebRequest.get(tabooListURL, self, 'tabooListCallback') -end - -function spawnZone() - -- Clean up scripting zone - if pcZone then - pcZone.destruct() - end - if weaknessZone then - weaknessZone.destruct() - end - deckPos = LocalPos(self,{-1.85,1.5,1.8}) - permPos = LocalPos(self,{-4.63,1.5,1.8}) - local pcZonePos = LocalPos(self,{4.75, 2.6 , 1.8}) - zoneSpawn = {position = pcZonePos - , scale = { 10.57, 5.1, 10.47 } - , type = 'ScriptingTrigger' --- , callback = 'zoneCallback' - , callback_owner = self - , rotation = self.getRotation() } - pcZone = spawnObject(zoneSpawn) - - -- get a scripting zone at the weakness deck - --local weaknessZonePosition = self.positionToWorld({-7.5, 2.6 , 1.8}) - local weaknessZonePosition = LocalPos(self, {-7.5, 0 , 1.8}) - weaknessZone = spawnObject({ - position = weaknessZonePosition, - type = 'ScriptingTrigger', - rotation = self.getRotation() - }) - - for i=1,1 do - coroutine.yield(0) - end - - local objectsInZone = pcZone.getObjects() - for i,v in pairs(objectsInZone) do - if v.tag == 'Deck' then - playerCardDeck = v - end - end - - local objectsInZone = weaknessZone.getObjects() - for i,v in pairs(objectsInZone) do - if v.getName() == 'All Weaknesses' then - weaknessDeck = v - end - end - - -- Get deck from ArkhamDB.. - local deckURL - if privateDeck then deckURL = privateDeckURL - else deckURL = publicDeckURL - end - - WebRequest.get(deckURL .. deckID, self, 'deckReadCallback') - - return 1 -end - -function init() - cardList = {} - doneSlots = 0 - playerCardDeck = {} - weaknessDeck = {} - totalCards = 0 - tabooID = 0 -end - -function buttonClicked() - -- Reset - init() - -- Spawn scripting zone - startLuaCoroutine(self, "spawnZone") -end - -function checkboxPPClicked() - buttons = tile.getButtons() - for k,v in pairs(buttons) do - if (v.label == "Private deck") then - local button_parameters = {} - button_parameters.label = "Published deck" - button_parameters.index = v.index - tile.editButton(button_parameters) - privateDeck = false - else - if (v.label == "Published deck") then - local button_parameters = {} - button_parameters.label = "Private deck" - button_parameters.index = v.index - tile.editButton(button_parameters) - privateDeck = true - end - end - end -end - -function checkboxPermsClicked() - buttons = tile.getButtons() - for k,v in pairs(buttons) do - if (v.label == "Permanents") then - local button_parameters = {} - button_parameters.label = "No permanents" - button_parameters.index = v.index - tile.editButton(button_parameters) - permanents = false - else - if (v.label == "No permanents") then - local button_parameters = {} - button_parameters.label = "Permanents" - button_parameters.index = v.index - tile.editButton(button_parameters) - permanents = true - end - end - end -end - -function deckReadCallback(req) - -- Result check.. - if req.is_done and not req.is_error - then - if string.find(req.text, "") - then - broadcastToAll("Private deck "..deckID.." is not shared", {0.5,0.5,0.5}) - return - end - JsonDeckRes = JSON.decode(req.text) - else - print (req.error) - return - end - if (JsonDeckRes == nil) - then - broadcastToAll("Deck not found!", {0.5,0.5,0.5}) - return - else - print("Found decklist: "..JsonDeckRes.name) - end - -- Count number of cards in decklist - numSlots=0 - for cardid,number in - pairs(JsonDeckRes.slots) - do - numSlots = numSlots + 1 - end - - -- Check for taboos - tabooID = JsonDeckRes.taboo_id - if tabooID - then - print("Using List of Taboos from "..tabooList[tabooID].date..".") - end - - -- Save card id, number in table and request card info from ArkhamDB - for cardID,number in pairs(JsonDeckRes.slots) - do - local row = {} - row.cardName = "" - row.cardCount = number - cardList[cardID] = row - WebRequest.get(cardURL .. cardID, self, 'cardReadCallback') - totalCards = totalCards + number - end -end - -function cardReadCallback(req) - -- Result check.. - if req.is_done and not req.is_error - then - -- Find unicode before using JSON.decode since it doesnt handle hex UTF-16 - local tmpText = string.gsub(req.text,"\\u(%w%w%w%w)", convertHexToDec) - JsonCardRes = JSON.decode(tmpText) - else - print(req.error) - return - end - - -- Update card name in table - if(JsonCardRes.xp == nil or JsonCardRes.xp == 0) - then - cardList[JsonCardRes.code].cardName = JsonCardRes.real_name - else - cardList[JsonCardRes.code].cardName = JsonCardRes.real_name .. " (" .. JsonCardRes.xp .. ")" - end - - -- Make Subname blank if it does not exist - if (JsonCardRes.subname == nil and (JsonCardRes.subtype_name ~= "Basic Weakness" and JsonCardRes.subtype_name ~= "Weakness")) - then - cardList[JsonCardRes.code].subName = "" - end - - -- Check for subname - for k,v in pairs(subnameCards) do - if (v.name == JsonCardRes.real_name and (v.xp == JsonCardRes.xp or JsonCardRes.xp == nil)) - then - cardList[JsonCardRes.code].subName = JsonCardRes.subname - end - end - - -- Check for multiclass - for k,v in pairs(multiClassCards) do - if (v.name == JsonCardRes.real_name and (v.xp == JsonCardRes.xp or JsonCardRes.xp == nil)) - then - cardList[JsonCardRes.code].subName = JsonCardRes.faction_name - end - end - - -- Check for returning cards (cards with the same name/level but different and from a new set) - for k,v in pairs(returningCards) do - if (v.name == JsonCardRes.real_name and JsonCardRes.pack_name == "Return to the Forgotten Age") - then - cardList[JsonCardRes.code].subName = "Permanent" - end - end - - -- Check for advanced signature cards (this happens after subname check, so it should be fine) - for k,v in pairs(advancedSignatures) do - if (v.name == JsonCardRes.real_name) - then - if (JsonCardRes.pack_name == "Read or Die" or JsonCardRes.pack_name == "All or Nothing") - then - if (v.name == "The Necronomicon") - then - cardList[JsonCardRes.code].subName = "John Dee Translation (Advanced)" - else - cardList[JsonCardRes.code].subName = "Advanced" - end - end - end - end - - -- Check if card is permanent (if separation is selected) - if permanents then - if (JsonCardRes.permanent == true or extraPermanents[JsonCardRes.real_name]) then - cardList[JsonCardRes.code].permanent = true - else - cardList[JsonCardRes.code].permanent = false - end - else - cardList[JsonCardRes.code].permanent = false - end - - -- Check for '1:3' bonding cards, which always brings in 3 bonded cards, where the original card is limit 1 per deck. - for k,v in pairs(bondedCardsOneThree) do - if (v.name == JsonCardRes.real_name) - then - - -- Check for Miss Doyle, who has a special exception since her 3 cards are different - if (v.name == "Miss Doyle") - then - local row = {} - local rowSecond = {} - local rowThird = {} - row.cardName = v.bondedName - rowSecond.cardName = v.bondedNameSecond - rowThird.cardName = v.bondedNameThird - row.cardCount = 1 - rowSecond.cardCount = 1 - rowThird.cardCount = 1 - row.permanent = true - rowSecond.permanent = true - rowThird.permanent = true - cardList[v.bondedCode] = row - cardList[v.bondedCodeSecond] = rowSecond - cardList[v.bondedCodeThird] = rowThird - else - local row = {} - row.cardName = v.bondedName - row.cardCount = 3 - row.permanent = true - cardList[v.bondedCode] = row - end - end - end - - -- Check for more complicated bonding cards - for k,v in pairs(bondedCardsBoolean) do - if (v.name == JsonCardRes.real_name and cardList[v.bondedCode] == nil) - then - local row = {} - row.cardName = v.bondedName - row.cardCount = v.bondCount - row.permanent = true - cardList[v.bondedCode] = row - end - end - - - -- Check for Taboos (add " (Taboo)" to card name) - if tabooID then - for k,v in pairs(tabooList[tabooID].cards) do - if v.code == JsonCardRes.code - then - cardList[JsonCardRes.code].cardName = cardList[JsonCardRes.code].cardName .. " (Taboo)" - end - end - end - - -- Update number of processed slots, if complete, start building the deck - doneSlots = doneSlots + 1 - if (doneSlots == numSlots) - then - createDeck() - end -end - -function tabooListCallback(req) - -- Result check.. - if req.is_done and not req.is_error - then - -- Find unicode before using JSON.decode since it doesnt handle hex UTF-16 - local tmpText = string.gsub(req.text,"\\u(%w%w%w%w)", convertHexToDec) - JsonTabooRes = JSON.decode(tmpText) - else - print(req.error) - return - end - for k,v in pairs(JsonTabooRes) do - local row = {} - row.date = v.date_start - row.cards = JSON.decode(v.cards) - tabooList[v.id] = row - end -end - -function createDeck() - -- Create clone of playerCardDeck to use for drawing cards - local cloneParams = {} - cloneParams.position = {0,0,50} - tmpDeck = playerCardDeck.clone(cloneParams) - - for k,v in pairs(cardList) do - searchForCard(v.cardName, v.subName, v.cardCount, v.permanent) - end - - tmpDeck.destruct() -end - -function searchForCard(cardName, subName, cardCount, permanent) - if cardName == 'Random Basic Weakness' and weaknessDeck then - -- pull a weakness card instead - weaknessDeck.shuffle() - local taken = weaknessDeck.takeObject({ - position = deckPos, - index = 0, - smooth = false, - params = { cardName, cardCount, false } - }) - -- just special case the one permanent for now - if taken.getName() == 'Indebted' then - taken.setPosition(permPos) - end - broadcastToAll("Drew random basic weakness: " .. taken.getName()) - return - end - allCards = tmpDeck.getObjects() - for k,v in pairs(allCards) do - if (v.nickname == cardName) - then - if(subName == nil or v.description == subName) - then - tmpDeck.takeObject({ - position = {10, 0, 20}, - callback = 'cardTaken', - callback_owner=self, - index = v.index, - smooth = false, - params = { cardName, cardCount, permanent, v.guid } - }) - print('Added '.. cardCount .. ' of ' .. cardName) - return - end - end - end - broadcastToAll("Card not found: "..cardName, {0.5,0.5,0.5}) -end - -function cardTaken(card, params) - -- Check destination deck (permanent?) - local destPos - if (params[3] == true) then -- permanent card - destPos = permPos - else - destPos = deckPos - end - - if (card.getName() == params[1]) then - for i=1,params[2]-1,1 do - local cloneParams = {} - cloneParams.position=destPos - card.clone(cloneParams) - end - card.setPosition(destPos) - else - print('Wrong card: ' .. card.getName()) - tmpDeck.putObject(card) - end -end - -function makeText() - -- Create textbox - local input_parameters = {} - input_parameters.input_function = "inputTyped" - input_parameters.function_owner = self - input_parameters.position = {0.8,0.2,-0.3} - input_parameters.width = 2220 - input_parameters.scale = {0.1,0.1,0.1} - input_parameters.height = 600 - input_parameters.font_size = 500 - input_parameters.tooltip = "*****PLEASE USE AN UNPUBLISHED DECK IF JUST FOR TTS TO AVOID FLOODING ARKHAMDB PUBLISHED DECK LISTS!*****\nInput deck ID from ArkhamDB URL of the deck\nExample: For the URL 'https://arkhamdb.com/decklist/view/101/knowledge-overwhelming-solo-deck-1.0', you should input '101'" - input_parameters.alignment = 3 -- (1 = Automatic, 2 = Left, 3 = Center, 4 = Right, 5 = Justified) –Optional - input_parameters.value="" - tile.createInput(input_parameters) -end - -function makeButton() - -- Create Button - local button_parameters = {} - button_parameters.click_function = "buttonClicked" - button_parameters.function_owner = self - button_parameters.position = {-0.26,0.1,0.37} - button_parameters.width = 300 - button_parameters.height = 4 - button_parameters.tooltip = "Click to build your deck!" - tile.createButton(button_parameters) -end - -function makeCheckboxPP() - local checkbox_parameters = {} - checkbox_parameters.click_function = "checkboxPPClicked" - checkbox_parameters.function_owner = self - checkbox_parameters.position = {-0.8,0.2,-0.3} - checkbox_parameters.width = 2600 - checkbox_parameters.height = 500 - checkbox_parameters.tooltip = "Click to toggle Private/Published deck ID" - checkbox_parameters.label = "Private deck" - checkbox_parameters.font_size = 350 - checkbox_parameters.scale = {0.1,0.1,0.1} - tile.createButton(checkbox_parameters) -end - -function makeCheckboxPerms() - local checkbox_parameters = {} - checkbox_parameters.click_function = "checkboxPermsClicked" - checkbox_parameters.function_owner = self - checkbox_parameters.position = {-0.2,0.2,-0.3} - checkbox_parameters.width = 2200 - checkbox_parameters.height = 500 - checkbox_parameters.tooltip = "Click to toggle separate permanents" - checkbox_parameters.label = "Permanents" - checkbox_parameters.font_size = 350 - checkbox_parameters.scale = {0.1,0.1,0.1} - tile.createButton(checkbox_parameters) -end - --- Function to convert utf-16 hex to actual character since JSON.decode doesn't seem to handle utf-16 hex very well.. -function convertHexToDec(a) - return string.char(tonumber(a,16)) -end --------------- --------------- --- Start of Dzikakulka's positioning script - - --- Return position "position" in "object"'s frame of reference --- (most likely the only function you want to directly access) -function LocalPos(object, position) - local rot = object.getRotation() - local lPos = {position[1], position[2], position[3]} - - -- Z-X-Y extrinsic - local zRot = RotMatrix('z', rot['z']) - lPos = RotateVector(zRot, lPos) - local xRot = RotMatrix('x', rot['x']) - lPos = RotateVector(xRot, lPos) - local yRot = RotMatrix('y', rot['y']) - lPos = RotateVector(yRot, lPos) - - return Vect_Sum(lPos, object.getPosition()) -end - --- Build rotation matrix --- 1st table = 1st row, 2nd table = 2nd row etc -function RotMatrix(axis, angDeg) - local ang = math.rad(angDeg) - local cs = math.cos - local sn = math.sin - - if axis == 'x' then - return { - { 1, 0, 0 }, - { 0, cs(ang), -1*sn(ang) }, - { 0, sn(ang), cs(ang) } - } - elseif axis == 'y' then - return { - { cs(ang), 0, sn(ang) }, - { 0, 1, 0 }, - { -1*sn(ang), 0, cs(ang) } - } - elseif axis == 'z' then - return { - { cs(ang), -1*sn(ang), 0 }, - { sn(ang), cs(ang), 0 }, - { 0, 0, 1 } - } - end -end - --- Apply given rotation matrix on given vector --- (multiply matrix and column vector) -function RotateVector(rotMat, vect) - local out = {0, 0, 0} - for i=1,3,1 do - for j=1,3,1 do - out[i] = out[i] + rotMat[i][j]*vect[j] - end - end - return out -end - --- Sum of two vectors (of any size) -function Vect_Sum(vec1, vec2) - local out = {} - local k = 1 - while vec1[k] ~= nil and vec2[k] ~= nil do - out[k] = vec1[k] + vec2[k] - k = k+1 - end - return out -end - --- End Dzikakulka's positioning script - - -function inputTyped(objectInputTyped, playerColorTyped, input_value, selected) - deckID = input_value -end - ---[[ The onUpdate event is called once per frame. --]] -function onUpdate () - --[[ print('onUpdate loop!') --]] -end \ No newline at end of file +--[[ Lua code. See documentation: https://api.tabletopsimulator.com/ --]] + +--[[ The onLoad event is called after the game save finishes loading. --]] +function onLoad() + init() + -- Setup... + publicDeckURL="https://arkhamdb.com/api/public/decklist/" + privateDeckURL="https://arkhamdb.com/api/public/deck/" + cardURL="https://arkhamdb.com/api/public/card/" + tabooListURL="https://arkhamdb.com/api/public/taboos/" + subnameCards={{name="Randolph Carter",xp=0},{name="Dream Diary",xp=3},{name="Relic of Ages",xp=0},{name="The Necronomicon",xp=0},{name="Archaic Glyphs",xp=3},{name="Strange Solution",xp=4},{name="Forbidden Tome",xp=3},{name="Relic of Ages",xp=0}, {name="Ancient Stone",xp=4}, {"Dream Diary",xp=0},{name="Empower Self",xp=2}} + extraPermanents={["Duke"]=true,["Sophie"]=true,["Gate Box"]=true,["Dark Insight"]=true} + multiClassCards={{name=".45 Thompson",xp=3},{name="Scroll of Secrets",xp=3},{name="Tennessee Sour Mash",xp=3},{name="Enchanted Blade",xp=3},{name="Grisly Totem",xp=3}} + returningCards={{name="On Your Own"}} + advancedSignatures={{name="Daisy's Tote Bag"},{name="The Necronomicon"},{name="On the Lam"},{name="Hospital Debts"},{name="Dark Memory"},{name="Heirloom of Hyperborea"}} + bondedCardsOneThree={{name="Hallowed Mirror",bondedName="Soothing Melody",bondedCode=05314},{name="Occult Lexicon",bondedName="Blood-Rite",bondedCode=05317},{name="The Hungering Blade",bondedName="Bloodlust",bondedCode=06019},{name="Nightmare Bauble",bondedName="Dream Parasite",bondedCode=06331},{name="Miss Doyle",bondedName="Hope",bondedCode=06031,bondedNameSecond="Zeal",bondedCodeSecond=06032,bondedNameThird="Augur",bondedCodeThird=06033}} + bondedCardsBoolean = {{name="Gate Box",bondedName="Dream-Gate",bondedCode="06015a",bondCount=1},{name="Crystallizer of Dreams",bondedName="Guardian of the Crystallizer",bondedCode=06025,bondCount=2},{name="Dream Diary",bondedName="Essence of the Dream",bondedCode=06113,bondCount=1},{name="Empty Vessel",bondedName="Wish Eater",bondedCode=06277,bondCount=1},{name="Segment of Onyx",bondedName="Pendant of the Queen",bondedCode=06022,bondCount=1},{name="Stargazing",bondedName="The Stars Are Right",bondedCode=06028,bondCount=2},{name="Summoned Hound",bondedName="Unbound Beast",bondedCode=06283,bondCount=2}} + privateDeck = true + + makeText() + makeButton() + makeCheckboxPP() + + all_cards_bag = getObjectFromGUID("15bb07") + weaknesses_bag = getObjectFromGUID("770c4e") + + -- Get current taboolist + tabooList = {} + WebRequest.get(tabooListURL, self, 'tabooListCallback') +end + +function init() + cardList = {} + doneSlots = 0 + totalCards = 0 + tabooID = 0 +end + +-- Previously this was "spawnZone" +function get_deck() + if deckID == nil then + broadcastToAll("Deck ID required", {0.5,0.5,0.5}) + return 1 + end + + deckPos = self.positionToWorld({0.285,1.5,0.48}) + permPos = self.positionToWorld({-0.285,1.5,0.48}) + + -- Get deck from ArkhamDB.. + local deckURL + if privateDeck then deckURL = privateDeckURL + else deckURL = publicDeckURL + end + + WebRequest.get(deckURL .. deckID, self, 'deckReadCallback') +end + +function deckReadCallback(req) + -- Result check.. + if req.is_done and not req.is_error + then + if string.find(req.text, "") + then + broadcastToAll("Private deck "..deckID.." is not shared", {0.5,0.5,0.5}) + return + end + JsonDeckRes = JSON.decode(req.text) + else + print (req.error) + return + end + if (JsonDeckRes == nil) + then + broadcastToAll("Deck not found!", {0.5,0.5,0.5}) + return + else + print("Found decklist: "..JsonDeckRes.name) + end + -- Count number of cards in decklist + numSlots=0 + for cardid,number in + pairs(JsonDeckRes.slots) + do + numSlots = numSlots + 1 + end + + -- Check for taboos + tabooID = JsonDeckRes.taboo_id + if tabooID + then + print("Using List of Taboos from "..tabooList[tabooID].date..".") + end + + -- Save card id, number in table and request card info from ArkhamDB + for cardID,number in pairs(JsonDeckRes.slots) + do + local row = {} + row.cardName = "" + row.cardCount = number + cardList[cardID] = row + WebRequest.get(cardURL .. cardID, self, 'cardReadCallback') + totalCards = totalCards + number + end +end + +function cardReadCallback(req) + -- Result check.. + if req.is_done and not req.is_error + then + -- Find unicode before using JSON.decode since it doesnt handle hex UTF-16 + local tmpText = string.gsub(req.text,"\\u(%w%w%w%w)", convertHexToDec) + JsonCardRes = JSON.decode(tmpText) + else + print(req.error) + return + end + + -- Update card name in table + if(JsonCardRes.xp == nil or JsonCardRes.xp == 0) + then + cardList[JsonCardRes.code].cardName = JsonCardRes.real_name + else + cardList[JsonCardRes.code].cardName = JsonCardRes.real_name .. " (" .. JsonCardRes.xp .. ")" + end + + -- Make Subname blank if it does not exist + if (JsonCardRes.subname == nil and (JsonCardRes.subtype_name ~= "Basic Weakness" and JsonCardRes.subtype_name ~= "Weakness")) + then + cardList[JsonCardRes.code].subName = JsonCardRes.subname + end + + -- Check for subname + for k,v in pairs(subnameCards) do + if (v.name == JsonCardRes.real_name and (v.xp == JsonCardRes.xp or JsonCardRes.xp == nil)) + then + cardList[JsonCardRes.code].subName = nil + end + end + + -- Check for multiclass + for k,v in pairs(multiClassCards) do + if (v.name == JsonCardRes.real_name and (v.xp == JsonCardRes.xp or JsonCardRes.xp == nil)) + then + cardList[JsonCardRes.code].subName = JsonCardRes.faction_name + end + end + + -- Check for returning cards (cards with the same name/level but different and from a new set) + for k,v in pairs(returningCards) do + if (v.name == JsonCardRes.real_name and JsonCardRes.pack_name == "Return to the Forgotten Age") + then + cardList[JsonCardRes.code].subName = "Permanent" + end + end + + -- Check for advanced signature cards (this happens after subname check, so it should be fine) + for k,v in pairs(advancedSignatures) do + if (v.name == JsonCardRes.real_name) then + --The Necronomicon is a whole can of worms, so handle it separately + if (JsonCardRes.real_name == "The Necronomicon") then + if (JsonCardRes.pack_name == "Read or Die") then + cardList[JsonCardRes.code].subName = "John Dee Translation (Advanced)" + elseif (JsonCardRes.pack_name == "The Miskatonic Museum") then + cardList[JsonCardRes.code].subName = "Olaus Wormius Translation" + elseif (JsonCardRes.pack_name == "Harvey Walters") then + cardList[JsonCardRes.code].subName = "Petrus de Dacia Translation" + else + cardList[JsonCardRes.code].subName = "John Dee Translation" + end + elseif (JsonCardRes.pack_name == "Read or Die" or JsonCardRes.pack_name == "All or Nothing" or JsonCardRes.pack_name == "Bad Blood") then + if (v.name == "Heirloom of Hyperborea") then + cardList[JsonCardRes.code].subName = "Artifact from Another Life (Advanced)" + else + cardList[JsonCardRes.code].subName = "Advanced" + end + else + if (cardList[JsonCardRes.code].subName == nil) then + if (v.name == "Heirloom of Hyperborea") then + cardList[JsonCardRes.code].subName = "Artifact from Another Life" + else + cardList[JsonCardRes.code].subName = "Signature" + end + end + end + end + end + + -- Check if card is permanent (always) + if (JsonCardRes.permanent == true or extraPermanents[JsonCardRes.real_name]) then + cardList[JsonCardRes.code].permanent = true + else + cardList[JsonCardRes.code].permanent = false + end + + -- Check for '1:3' bonding cards, which always brings in 3 bonded cards, where the original card is limit 1 per deck. + for k,v in pairs(bondedCardsOneThree) do + if (v.name == JsonCardRes.real_name) + then + + -- Check for Miss Doyle, who has a special exception since her 3 cards are different + if (v.name == "Miss Doyle") + then + local row = {} + local rowSecond = {} + local rowThird = {} + row.cardName = v.bondedName + rowSecond.cardName = v.bondedNameSecond + rowThird.cardName = v.bondedNameThird + row.cardCount = 1 + rowSecond.cardCount = 1 + rowThird.cardCount = 1 + row.permanent = true + rowSecond.permanent = true + rowThird.permanent = true + cardList[v.bondedCode] = row + cardList[v.bondedCodeSecond] = rowSecond + cardList[v.bondedCodeThird] = rowThird + else + local row = {} + row.cardName = v.bondedName + row.cardCount = 3 + row.permanent = true + cardList[v.bondedCode] = row + end + end + end + + -- Check for more complicated bonding cards + for k,v in pairs(bondedCardsBoolean) do + if (v.name == JsonCardRes.real_name and cardList[v.bondedCode] == nil) + then + local row = {} + row.cardName = v.bondedName + row.cardCount = v.bondCount + row.permanent = true + cardList[v.bondedCode] = row + end + end + + + -- Check for Taboos (add " (Taboo)" to card name) + if tabooID then + for k,v in pairs(tabooList[tabooID].cards) do + if v.code == JsonCardRes.code + then + cardList[JsonCardRes.code].cardName = cardList[JsonCardRes.code].cardName .. " (Taboo)" + end + end + end + + -- Update number of processed slots, if complete, start building the deck + doneSlots = doneSlots + 1 + if (doneSlots == numSlots) + then + createDeck() + end +end + +function createDeck() + for k,v in pairs(cardList) do + searchForCard(v.cardName, v.subName, v.cardCount, v.permanent) + end +end + +function searchForCard(cardName, subName, cardCount, permanent) + if cardName == 'Random Basic Weakness' then + -- pull a weakness card instead + weaknesses_bag.shuffle() + local taken = weaknesses_bag.takeObject({ + position = deckPos, + index = 0, + smooth = false, + params = { cardName, cardCount, false } + }) + -- just special case the one permanent for now + if taken.getName() == 'Indebted' then + taken.setPosition(permPos) + end + broadcastToAll("Drew random basic weakness: " .. taken.getName()) + return + end + + allCards = all_cards_bag.getObjects() + for k,v in pairs(allCards) do + if (v.nickname == cardName) + then + if(subName == nil or v.description == subName) + then + all_cards_bag.takeObject({ + position = {0, 1.5, 0}, + callback = 'cardTaken', + callback_owner=self, + index = v.index, + smooth = false, + params = { cardName, cardCount, permanent, v.guid } + }) + print('Added '.. cardCount .. ' of ' .. cardName) + return + end + end + end + broadcastToAll("Card not found: "..cardName, {0.5,0.5,0.5}) +end + +function cardTaken(card, params) + -- Check destination deck (permanent?) + local destPos + local rotation = self.getRotation() + if (params[3] == true) then -- permanent card + destPos = permPos + else + destPos = deckPos + rotation = rotation + Vector(0, 0, 180) -- Flip non-permanents facedown + end + + if (card.getName() == params[1]) then + for i=1, params[2] do + local cloneParams = {} + cloneParams.position=destPos + card.clone(cloneParams).setRotation(rotation) + end + all_cards_bag.putObject(card) + else + print('Wrong card: ' .. card.getName()) + all_cards_bag.putObject(card) + end +end + +function tabooListCallback(req) + -- Result check.. + if req.is_done and not req.is_error + then + -- Find unicode before using JSON.decode since it doesnt handle hex UTF-16 + local tmpText = string.gsub(req.text,"\\u(%w%w%w%w)", convertHexToDec) + JsonTabooRes = JSON.decode(tmpText) + else + print(req.error) + return + end + for k,v in pairs(JsonTabooRes) do + local row = {} + row.date = v.date_start + row.cards = JSON.decode(v.cards) + tabooList[v.id] = row + end +end + +function makeText() + -- Create textbox + local input_parameters = {} + input_parameters.input_function = "inputTyped" + input_parameters.function_owner = self + input_parameters.position = {0.33,0.1,-0.255} + input_parameters.width = 2200 + input_parameters.scale = {0.1,0.1,0.1} + input_parameters.height = 500 + input_parameters.font_size = 450 + input_parameters.tooltip = "*****PLEASE USE AN UNPUBLISHED DECK IF JUST FOR TTS TO AVOID FLOODING ARKHAMDB PUBLISHED DECK LISTS!*****\nInput deck ID from ArkhamDB URL of the deck\nExample: For the URL 'https://arkhamdb.com/decklist/view/101/knowledge-overwhelming-solo-deck-1.0', you should input '101'" + input_parameters.alignment = 3 -- (1 = Automatic, 2 = Left, 3 = Center, 4 = Right, 5 = Justified) –Optional + input_parameters.value="" + input_parameters.color = {0.9,0.7,0.5} + input_parameters.validation = 2 + self.createInput(input_parameters) +end + +function inputTyped(objectInputTyped, playerColorTyped, input_value, selected) + deckID = input_value +end + +function makeButton() + -- Create Button + local button_parameters = {} + button_parameters.click_function = "buttonClicked" + button_parameters.function_owner = self + button_parameters.position = {0,0.05,-0.1} + button_parameters.width = 300 + button_parameters.height = 100 + button_parameters.tooltip = "Click to build your deck!" + button_parameters.scale = {1,1,0.6} + self.createButton(button_parameters) +end + +function buttonClicked() + -- Reset + init() + + get_deck() +end + +function makeCheckboxPP() + -- Create Private/Published checkbox + local checkbox_parameters = {} + checkbox_parameters.click_function = "checkboxPPClicked" + checkbox_parameters.function_owner = self + checkbox_parameters.position = {-0.33,0.1,-0.255} + checkbox_parameters.width = 2100 + checkbox_parameters.height = 500 + checkbox_parameters.tooltip = "Click to toggle Private/Published deck ID" + checkbox_parameters.label = "Private" + checkbox_parameters.font_size = 350 + checkbox_parameters.scale = {0.1,0.1,0.1} + checkbox_parameters.color = {0.9,0.7,0.5} + checkbox_parameters.hover_color = {0.4,0.6,0.8} + self.createButton(checkbox_parameters) +end + +function checkboxPPClicked() + buttons = self.getButtons() + for k,v in pairs(buttons) do + if (v.label == "Private") then + local button_parameters = {} + button_parameters.label = "Published" + button_parameters.index = v.index + self.editButton(button_parameters) + privateDeck = false + else + if (v.label == "Published") then + local button_parameters = {} + button_parameters.label = "Private" + button_parameters.index = v.index + self.editButton(button_parameters) + privateDeck = true + end + end + end +end + +-- Function to convert utf-16 hex to actual character since JSON.decode doesn't seem to handle utf-16 hex very well.. +function convertHexToDec(a) + return string.char(tonumber(a,16)) +end diff --git a/unpacked/Custom_Tile New Deck Importer edad66.yaml b/unpacked/Custom_Tile New Deck Importer edad66.yaml new file mode 100644 index 000000000..ffe43dce6 --- /dev/null +++ b/unpacked/Custom_Tile New Deck Importer edad66.yaml @@ -0,0 +1,44 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 3 + ImageScalar: 1.0 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/7jvVCBV.jpg + WidthScale: 0.0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: edad66 +Grid: false +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: true +LuaScript: !include 'Custom_Tile New Deck Importer edad66.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: New Deck Importer +Snap: false +Sticky: true +Tooltip: false +Transform: + posX: -60.0 + posY: 1.2 + posZ: -70.5 + rotX: 0.0 + rotY: 270.0 + rotZ: 0.0 + scaleX: 6.59 + scaleY: 1.0 + scaleZ: 6.59 +XmlUI: '' diff --git a/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua b/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua index b49bf41d4..8db8db16a 100644 --- a/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua +++ b/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua @@ -1,405 +1,407 @@ --- set true to enable debug logging -DEBUG = false --- we use this to turn off collision handling (for clue spawning) --- until after load is complete (probably a better way to do this) -COLLISION_ENABLED = false --- position offsets, adjust these to reposition things relative to mat [x,y,z] -DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} -DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} -DISCARD_BUTTON_OFFSETS = { - {-0.98, 0.2, -0.945}, - {-0.525, 0.2, -0.945}, - {-0.07, 0.2, -0.945}, - {0.39, 0.2, -0.945}, - {0.84, 0.2, -0.945}, -} --- draw deck and discard zone -DECK_POSITION = { x=-1.4, y=0, z=0.3 } -DECK_ZONE_SCALE = { x=3, y=5, z=8 } -DRAW_DECK_POSITION = { x=-55, y=2.5, z=4.5 } - --- play zone -PLAYER_COLOR = "White" -PLAY_ZONE_POSITION = { x=-55, y=4, z=17 } -PLAY_ZONE_ROTATION = { x=0, y=270, z=0 } -PLAY_ZONE_SCALE = { x=30, y=5, z=15 } - -RESOURCE_COUNTER_GUID = "4406f0" - --- the position of the global discard pile --- TODO: delegate to global for any auto discard actions -DISCARD_POSITION = {-3.85, 3, 10.38} - -function log(message) - if DEBUG then - print(message) - end -end - --- builds a function that discards things in searchPostion to discardPostition -function makeDiscardHandlerFor(searchPosition, discardPosition) - return function (_) - local discardItemList = findObjectsAtPosition(searchPosition) - for _, obj in ipairs(discardItemList) do - obj.setPositionSmooth(discardPosition, false, true) - obj.setRotation({0, -90, 0}) - end - end -end - --- build a discard button at position to discard from searchPosition to discardPosition --- number must be unique -function makeDiscardButton(position, searchPosition, discardPosition, number) - local handler = makeDiscardHandlerFor(searchPosition, discardPosition) - local handlerName = 'handler' .. number - self.setVar(handlerName, handler) - self.createButton({ - label = "Discard", - click_function= handlerName, - function_owner= self, - position = position, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180, - }) -end - -function onload(save_state) - self.interactable = DEBUG - DATA_HELPER = getObjectFromGUID('708279') - PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') - PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') - - -- positions of encounter card slots - local encounterSlots = { - {1, 0, -0.7}, - {0.55, 0, -0.7}, - {0.1, 0, -0.7}, - {-0.35, 0, -0.7}, - {-0.8, 0, -0.7} - } - - local i = 1 - while i <= 5 do - makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) - i = i + 1 - end - - self.createButton({ - label = " ", - click_function = "drawEncountercard", - function_owner = self, - position = {-1.45,0,-0.7}, - rotation = {0,-15,0}, - width = 170, - height = 255, - font_size = 50 - }) - - self.createButton({ - label=" ", - click_function = "drawChaostokenButton", - function_owner = self, - position = {1.48,0.0,-0.74}, - rotation = {0,-45,0}, - width = 125, - height = 125, - font_size = 50 - }) - - self.createButton({ - label="Upkeep", - click_function = "doUpkeep", - function_owner = self, - position = {1.48,0.1,-0.4}, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180 - }) - - local state = JSON.decode(save_state) - if state ~= nil and state.zoneID ~= nil then - zoneID = state.zoneID - Wait.time(checkDeckZoneExists, 30) - else - spawnDeckZone() - end - - COLLISION_ENABLED = true -end - -function onSave() - return JSON.encode({ zoneID=zoneID }) -end - -function doUpkeep(obj, color, alt_click) - -- right-click binds to new player color - if alt_click then - PLAYER_COLOR = color - printToColor("Upkeep button bound to " .. color, color) - return - end - - -- unexhaust cards in play zone - local objs = Physics.cast({ - origin = PLAY_ZONE_POSITION, - direction = { x=0, y=1, z=0 }, - type = 3, - size = PLAY_ZONE_SCALE, - orientation = PLAY_ZONE_ROTATION - }) - - local y = PLAY_ZONE_ROTATION.y - - local investigator = nil - for i,v in ipairs(objs) do - local obj = v.hit_object - local props = obj.getCustomObject() - if obj.tag == "Card" and not obj.is_face_down then - if props ~= nil and props.unique_back then - local name = obj.getName() - if string.match(name, "Jenny Barnes") ~= nil then - investigator = "Jenny Barnes" - elseif name == "Patrice Hathaway" then - investigator = name - end - else - local r = obj.getRotation() - if (r.y - y > 10) or (y - r.y > 10) then - obj.setRotationSmooth(PLAY_ZONE_ROTATION) - end - end - end - end - - -- gain resource - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - if investigator == "Jenny Barnes" then - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) - end - - -- draw card (shuffle discard if necessary) - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - drawDeck = nil - discardPile = nil - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Deck" or object.tag == "Card" then - if object.is_face_down then - drawDeck = object - else - discardPile = object - end - end - end - - if investigator == "Patrice Hathaway" then - patriceDraw() - return - end - - if drawDeck == nil then - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(1), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) - else - drawCards(1) - end -end - -function drawCards(numCards) - if drawDeck == nil then return end - drawDeck.deal(numCards, PLAYER_COLOR) -end - -function shuffleDiscardIntoDeck() - discardPile.flip() - discardPile.shuffle() - discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) - drawDeck = discardPile - discardPile = nil -end - -function patriceDraw() - local handSize = #Player[PLAYER_COLOR].getHandObjects() - if handSize >= 5 then return end - local cardsToDraw = 5 - handSize - local deckSize - printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) - if drawDeck == nil then - deckSize = 0 - elseif drawDeck.tag == "Deck" then - deckSize = #drawDeck.getObjects() - else - deckSize = 1 - end - - if deckSize >= cardsToDraw then - drawCards(cardsToDraw) - return - end - - drawCards(deckSize) - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(cardsToDraw - deckSize), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) -end - -function checkDeckZoneExists() - if getObjectFromGUID(zoneID) ~= nil then return end - spawnDeckZone() -end - -function spawnDeckZone() - local pos = self.positionToWorld(DECK_POSITION) - local zoneProps = { - position = pos, - scale = DECK_ZONE_SCALE, - type = 'ScriptingTrigger', - callback = 'zoneCallback', - callback_owner = self, - rotation = self.getRotation() - } - spawnObject(zoneProps) -end - -function zoneCallback(zone) - zoneID = zone.getGUID() -end - -function findObjectsAtPosition(localPos) - local globalPos = self.positionToWorld(localPos) - local objList = Physics.cast({ - origin=globalPos, --Where the cast takes place - direction={0,1,0}, --Which direction it moves (up is shown) - type=2, --Type. 2 is "sphere" - size={2,2,2}, --How large that sphere is - max_distance=1, --How far it moves. Just a little bit - debug=false --If it displays the sphere when casting. - }) - local decksAndCards = {} - for _, obj in ipairs(objList) do - if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then - table.insert(decksAndCards, obj.hit_object) - end - end - return decksAndCards -end - -function spawnTokenOn(object, offsets, tokenType) - local tokenPosition = object.positionToWorld(offsets) - spawnToken(tokenPosition, tokenType) -end - --- spawn a group of tokens of the given type on the object -function spawnTokenGroup(object, tokenType, tokenCount) - local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] - if offsets == nil then - error("couldn't find offsets for " .. tokenCount .. ' tokens') - end - local i = 0 - while i < tokenCount do - local offset = offsets[i + 1] - spawnTokenOn(object, offset, tokenType) - i = i + 1 - end -end - -function buildPlayerCardKey(object) - return object.getName() .. ':' .. object.getDescription() -end - -function getPlayerCardData(object) - return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] -end - -function shouldSpawnTokens(object) - -- we assume we shouldn't spawn tokens if in doubt, this should - -- only ever happen on load and in that case prevents respawns - local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) - local canSpawn = getPlayerCardData(object) - return not spawned and canSpawn -end - -function markSpawned(object) - local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) - if not saved then - error('attempt to mark player card spawned before data loaded') - end -end - -function spawnTokensFor(object) - local data = getPlayerCardData(object) - if data == nil then - error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') - end - log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) - spawnTokenGroup(object, data['tokenType'], data['tokenCount']) - markSpawned(object) -end - -function resetSpawnState() - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Card" then - local guid = object.getGUID() - if guid ~= nil then unmarkSpawned(guid, true) end - elseif object.tag == "Deck" then - local cards = object.getObjects() - if (cards ~= nil) then - for i,v in ipairs(cards) do - if v.guid ~= nil then unmarkSpawned(v.guid) end - end - end - end - end -end - -function unmarkSpawned(guid, force) - if not force and getObjectFromGUID(guid) ~= nil then return end - DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) -end - -function onCollisionEnter(collision_info) - if not COLLISION_ENABLED then - return - end - - local object = collision_info.collision_object - Wait.time(resetSpawnState, 1) - -- anything to the left of this is legal to spawn - local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) - local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) - if boundaryLocalToCard.x > 0 then - log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) - return - end - if not object.is_face_down and shouldSpawnTokens(object) then - spawnTokensFor(object) - end -end - --- functions delegated to Global -function drawChaostokenButton(object, player, isRightClick) - -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) - Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) -end - -function drawEncountercard(object, player, isRightClick) -local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) -Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) -end - -function spawnToken(position, tokenType) - Global.call('spawnToken', {position, tokenType}) +-- set true to enable debug logging +DEBUG = false +-- we use this to turn off collision handling (for clue spawning) +-- until after load is complete (probably a better way to do this) +COLLISION_ENABLED = false +-- position offsets, adjust these to reposition things relative to mat [x,y,z] +DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} +DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} +DISCARD_BUTTON_OFFSETS = { + {-0.98, 0.2, -0.945}, + {-0.525, 0.2, -0.945}, + {-0.07, 0.2, -0.945}, + {0.39, 0.2, -0.945}, + {0.84, 0.2, -0.945}, +} +-- draw deck and discard zone +DECK_POSITION = { x=-1.4, y=0, z=0.3 } +DECK_ZONE_SCALE = { x=3, y=5, z=8 } +DRAW_DECK_POSITION = { x=-55, y=2.5, z=4.5 } + +-- play zone +PLAYER_COLOR = "White" +PLAY_ZONE_POSITION = { x=-55, y=4, z=17 } +PLAY_ZONE_ROTATION = { x=0, y=270, z=0 } +PLAY_ZONE_SCALE = { x=30, y=5, z=15 } + +RESOURCE_COUNTER_GUID = "4406f0" + +-- the position of the global discard pile +-- TODO: delegate to global for any auto discard actions +DISCARD_POSITION = {-3.85, 3, 10.38} + +function log(message) + if DEBUG then + print(message) + end +end + +-- builds a function that discards things in searchPostion to discardPostition +function makeDiscardHandlerFor(searchPosition, discardPosition) + return function (_) + local discardItemList = findObjectsAtPosition(searchPosition) + for _, obj in ipairs(discardItemList) do + obj.setPositionSmooth(discardPosition, false, true) + obj.setRotation({0, -90, 0}) + end + end +end + +-- build a discard button at position to discard from searchPosition to discardPosition +-- number must be unique +function makeDiscardButton(position, searchPosition, discardPosition, number) + local handler = makeDiscardHandlerFor(searchPosition, discardPosition) + local handlerName = 'handler' .. number + self.setVar(handlerName, handler) + self.createButton({ + label = "Discard", + click_function= handlerName, + function_owner= self, + position = position, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180, + }) +end + +function onload(save_state) + self.interactable = DEBUG + DATA_HELPER = getObjectFromGUID('708279') + PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') + PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') + + -- positions of encounter card slots + local encounterSlots = { + {1, 0, -0.7}, + {0.55, 0, -0.7}, + {0.1, 0, -0.7}, + {-0.35, 0, -0.7}, + {-0.8, 0, -0.7} + } + + local i = 1 + while i <= 5 do + makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) + i = i + 1 + end + + self.createButton({ + label = " ", + click_function = "drawEncountercard", + function_owner = self, + position = {-1.45,0,-0.7}, + rotation = {0,-15,0}, + width = 170, + height = 255, + font_size = 50 + }) + + self.createButton({ + label=" ", + click_function = "drawChaostokenButton", + function_owner = self, + position = {1.48,0.0,-0.74}, + rotation = {0,-45,0}, + width = 125, + height = 125, + font_size = 50 + }) + + self.createButton({ + label="Upkeep", + click_function = "doUpkeep", + function_owner = self, + position = {1.48,0.1,-0.4}, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180 + }) + + local state = JSON.decode(save_state) + if state ~= nil and state.zoneID ~= nil then + zoneID = state.zoneID + Wait.time(checkDeckZoneExists, 30) + else + spawnDeckZone() + end + + COLLISION_ENABLED = true +end + +function onSave() + return JSON.encode({ zoneID=zoneID }) +end + +function doUpkeep(obj, color, alt_click) + -- right-click binds to new player color + if alt_click then + PLAYER_COLOR = color + printToColor("Upkeep button bound to " .. color, color) + return + end + + -- unexhaust cards in play zone + local objs = Physics.cast({ + origin = PLAY_ZONE_POSITION, + direction = { x=0, y=1, z=0 }, + type = 3, + size = PLAY_ZONE_SCALE, + orientation = PLAY_ZONE_ROTATION + }) + + local y = PLAY_ZONE_ROTATION.y + + local investigator = nil + for i,v in ipairs(objs) do + local obj = v.hit_object + local props = obj.getCustomObject() + if obj.tag == "Card" and not obj.is_face_down then + if props ~= nil and props.unique_back then + local name = obj.getName() + if string.match(name, "Jenny Barnes") ~= nil then + investigator = "Jenny Barnes" + elseif name == "Patrice Hathaway" then + investigator = name + end + else + local r = obj.getRotation() + if (r.y - y > 10) or (y - r.y > 10) then + obj.setRotationSmooth(PLAY_ZONE_ROTATION) + end + end + elseif obj.tag == "Board" and obj.getDescription() == "Action token" then + if obj.is_face_down then obj.flip() end + end + end + + -- gain resource + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + if investigator == "Jenny Barnes" then + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) + end + + -- draw card (shuffle discard if necessary) + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + drawDeck = nil + discardPile = nil + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Deck" or object.tag == "Card" then + if object.is_face_down then + drawDeck = object + else + discardPile = object + end + end + end + + if investigator == "Patrice Hathaway" then + patriceDraw() + return + end + + if drawDeck == nil then + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(1), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) + else + drawCards(1) + end +end + +function drawCards(numCards) + if drawDeck == nil then return end + drawDeck.deal(numCards, PLAYER_COLOR) +end + +function shuffleDiscardIntoDeck() + discardPile.flip() + discardPile.shuffle() + discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) + drawDeck = discardPile + discardPile = nil +end + +function patriceDraw() + local handSize = #Player[PLAYER_COLOR].getHandObjects() + if handSize >= 5 then return end + local cardsToDraw = 5 - handSize + local deckSize + printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) + if drawDeck == nil then + deckSize = 0 + elseif drawDeck.tag == "Deck" then + deckSize = #drawDeck.getObjects() + else + deckSize = 1 + end + + if deckSize >= cardsToDraw then + drawCards(cardsToDraw) + return + end + + drawCards(deckSize) + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(cardsToDraw - deckSize), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) +end + +function checkDeckZoneExists() + if getObjectFromGUID(zoneID) ~= nil then return end + spawnDeckZone() +end + +function spawnDeckZone() + local pos = self.positionToWorld(DECK_POSITION) + local zoneProps = { + position = pos, + scale = DECK_ZONE_SCALE, + type = 'ScriptingTrigger', + callback = 'zoneCallback', + callback_owner = self, + rotation = self.getRotation() + } + spawnObject(zoneProps) +end + +function zoneCallback(zone) + zoneID = zone.getGUID() +end + +function findObjectsAtPosition(localPos) + local globalPos = self.positionToWorld(localPos) + local objList = Physics.cast({ + origin=globalPos, --Where the cast takes place + direction={0,1,0}, --Which direction it moves (up is shown) + type=2, --Type. 2 is "sphere" + size={2,2,2}, --How large that sphere is + max_distance=1, --How far it moves. Just a little bit + debug=false --If it displays the sphere when casting. + }) + local decksAndCards = {} + for _, obj in ipairs(objList) do + if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then + table.insert(decksAndCards, obj.hit_object) + end + end + return decksAndCards +end + +function spawnTokenOn(object, offsets, tokenType) + local tokenPosition = object.positionToWorld(offsets) + spawnToken(tokenPosition, tokenType) +end + +-- spawn a group of tokens of the given type on the object +function spawnTokenGroup(object, tokenType, tokenCount) + local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] + if offsets == nil then + error("couldn't find offsets for " .. tokenCount .. ' tokens') + end + local i = 0 + while i < tokenCount do + local offset = offsets[i + 1] + spawnTokenOn(object, offset, tokenType) + i = i + 1 + end +end + +function buildPlayerCardKey(object) + return object.getName() .. ':' .. object.getDescription() +end + +function getPlayerCardData(object) + return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] +end + +function shouldSpawnTokens(object) + -- we assume we shouldn't spawn tokens if in doubt, this should + -- only ever happen on load and in that case prevents respawns + local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) + local canSpawn = getPlayerCardData(object) + return not spawned and canSpawn +end + +function markSpawned(object) + local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) + if not saved then + error('attempt to mark player card spawned before data loaded') + end +end + +function spawnTokensFor(object) + local data = getPlayerCardData(object) + if data == nil then + error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') + end + log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) + spawnTokenGroup(object, data['tokenType'], data['tokenCount']) + markSpawned(object) +end + +function resetSpawnState() + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Card" then + local guid = object.getGUID() + if guid ~= nil then unmarkSpawned(guid, true) end + elseif object.tag == "Deck" then + local cards = object.getObjects() + if (cards ~= nil) then + for i,v in ipairs(cards) do + if v.guid ~= nil then unmarkSpawned(v.guid) end + end + end + end + end +end + +function unmarkSpawned(guid, force) + if not force and getObjectFromGUID(guid) ~= nil then return end + DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) +end + +function onCollisionEnter(collision_info) + if not COLLISION_ENABLED then + return + end + + local object = collision_info.collision_object + Wait.time(resetSpawnState, 1) + -- anything to the left of this is legal to spawn + local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) + local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) + if boundaryLocalToCard.x > 0 then + log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) + return + end + if not object.is_face_down and shouldSpawnTokens(object) then + spawnTokensFor(object) + end +end + +-- functions delegated to Global +function drawChaostokenButton(object, player, isRightClick) + -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) + Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) +end + +function drawEncountercard(object, player, isRightClick) +local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) +Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) +end + +function spawnToken(position, tokenType) + Global.call('spawnToken', {position, tokenType}) end \ No newline at end of file diff --git a/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua b/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua index c94483537..2fd4e8020 100644 --- a/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua +++ b/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua @@ -1,405 +1,407 @@ --- set true to enable debug logging -DEBUG = false --- we use this to turn off collision handling (for clue spawning) --- until after load is complete (probably a better way to do this) -COLLISION_ENABLED = false --- position offsets, adjust these to reposition things relative to mat [x,y,z] -DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} -DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} -DISCARD_BUTTON_OFFSETS = { - {-0.98, 0.2, -0.945}, - {-0.525, 0.2, -0.945}, - {-0.07, 0.2, -0.945}, - {0.39, 0.2, -0.945}, - {0.84, 0.2, -0.945}, -} --- draw deck and discard zone -DECK_POSITION = { x=-1.4, y=0, z=0.3 } -DECK_ZONE_SCALE = { x=3, y=5, z=8 } -DRAW_DECK_POSITION = { x=-55, y=2.5, z=-22.7 } - --- play zone -PLAYER_COLOR = "Orange" -PLAY_ZONE_POSITION = { x=-55, y=4, z=-17 } -PLAY_ZONE_ROTATION = { x=0, y=270, z=0 } -PLAY_ZONE_SCALE = { x=30, y=5, z=15 } - -RESOURCE_COUNTER_GUID = "816d84" - --- the position of the global discard pile --- TODO: delegate to global for any auto discard actions -DISCARD_POSITION = {-3.85, 3, 10.38} - -function log(message) - if DEBUG then - print(message) - end -end - --- builds a function that discards things in searchPostion to discardPostition -function makeDiscardHandlerFor(searchPosition, discardPosition) - return function (_) - local discardItemList = findObjectsAtPosition(searchPosition) - for _, obj in ipairs(discardItemList) do - obj.setPositionSmooth(discardPosition, false, true) - obj.setRotation({0, -90, 0}) - end - end -end - --- build a discard button at position to discard from searchPosition to discardPosition --- number must be unique -function makeDiscardButton(position, searchPosition, discardPosition, number) - local handler = makeDiscardHandlerFor(searchPosition, discardPosition) - local handlerName = 'handler' .. number - self.setVar(handlerName, handler) - self.createButton({ - label = "Discard", - click_function= handlerName, - function_owner= self, - position = position, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180, - }) -end - -function onload(save_state) - self.interactable = DEBUG - DATA_HELPER = getObjectFromGUID('708279') - PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') - PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') - - -- positions of encounter card slots - local encounterSlots = { - {1, 0, -0.7}, - {0.55, 0, -0.7}, - {0.1, 0, -0.7}, - {-0.35, 0, -0.7}, - {-0.8, 0, -0.7} - } - - local i = 1 - while i <= 5 do - makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) - i = i + 1 - end - - self.createButton({ - label = " ", - click_function = "drawEncountercard", - function_owner = self, - position = {-1.45,0,-0.7}, - rotation = {0,-15,0}, - width = 170, - height = 255, - font_size = 50 - }) - - self.createButton({ - label=" ", - click_function = "drawChaostokenButton", - function_owner = self, - position = {1.48,0.0,-0.74}, - rotation = {0,-45,0}, - width = 125, - height = 125, - font_size = 50 - }) - - self.createButton({ - label="Upkeep", - click_function = "doUpkeep", - function_owner = self, - position = {1.48,0.1,-0.4}, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180 - }) - - local state = JSON.decode(save_state) - if state ~= nil and state.zoneID ~= nil then - zoneID = state.zoneID - Wait.time(checkDeckZoneExists, 30) - else - spawnDeckZone() - end - - COLLISION_ENABLED = true -end - -function onSave() - return JSON.encode({ zoneID=zoneID }) -end - -function doUpkeep(obj, color, alt_click) - -- right-click binds to new player color - if alt_click then - PLAYER_COLOR = color - printToColor("Upkeep button bound to " .. color, color) - return - end - - -- unexhaust cards in play zone - local objs = Physics.cast({ - origin = PLAY_ZONE_POSITION, - direction = { x=0, y=1, z=0 }, - type = 3, - size = PLAY_ZONE_SCALE, - orientation = PLAY_ZONE_ROTATION - }) - - local y = PLAY_ZONE_ROTATION.y - - local investigator = nil - for i,v in ipairs(objs) do - local obj = v.hit_object - local props = obj.getCustomObject() - if obj.tag == "Card" and not obj.is_face_down then - if props ~= nil and props.unique_back then - local name = obj.getName() - if string.match(name, "Jenny Barnes") ~= nil then - investigator = "Jenny Barnes" - elseif name == "Patrice Hathaway" then - investigator = name - end - else - local r = obj.getRotation() - if (r.y - y > 10) or (y - r.y > 10) then - obj.setRotationSmooth(PLAY_ZONE_ROTATION) - end - end - end - end - - -- gain resource - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - if investigator == "Jenny Barnes" then - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) - end - - -- draw card (shuffle discard if necessary) - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - drawDeck = nil - discardPile = nil - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Deck" or object.tag == "Card" then - if object.is_face_down then - drawDeck = object - else - discardPile = object - end - end - end - - if investigator == "Patrice Hathaway" then - patriceDraw() - return - end - - if drawDeck == nil then - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(1), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) - else - drawCards(1) - end -end - -function drawCards(numCards) - if drawDeck == nil then return end - drawDeck.deal(numCards, PLAYER_COLOR) -end - -function shuffleDiscardIntoDeck() - discardPile.flip() - discardPile.shuffle() - discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) - drawDeck = discardPile - discardPile = nil -end - -function patriceDraw() - local handSize = #Player[PLAYER_COLOR].getHandObjects() - if handSize >= 5 then return end - local cardsToDraw = 5 - handSize - local deckSize - printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) - if drawDeck == nil then - deckSize = 0 - elseif drawDeck.tag == "Deck" then - deckSize = #drawDeck.getObjects() - else - deckSize = 1 - end - - if deckSize >= cardsToDraw then - drawCards(cardsToDraw) - return - end - - drawCards(deckSize) - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(cardsToDraw - deckSize), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) -end - -function checkDeckZoneExists() - if getObjectFromGUID(zoneID) ~= nil then return end - spawnDeckZone() -end - -function spawnDeckZone() - local pos = self.positionToWorld(DECK_POSITION) - local zoneProps = { - position = pos, - scale = DECK_ZONE_SCALE, - type = 'ScriptingTrigger', - callback = 'zoneCallback', - callback_owner = self, - rotation = self.getRotation() - } - spawnObject(zoneProps) -end - -function zoneCallback(zone) - zoneID = zone.getGUID() -end - -function findObjectsAtPosition(localPos) - local globalPos = self.positionToWorld(localPos) - local objList = Physics.cast({ - origin=globalPos, --Where the cast takes place - direction={0,1,0}, --Which direction it moves (up is shown) - type=2, --Type. 2 is "sphere" - size={2,2,2}, --How large that sphere is - max_distance=1, --How far it moves. Just a little bit - debug=false --If it displays the sphere when casting. - }) - local decksAndCards = {} - for _, obj in ipairs(objList) do - if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then - table.insert(decksAndCards, obj.hit_object) - end - end - return decksAndCards -end - -function spawnTokenOn(object, offsets, tokenType) - local tokenPosition = object.positionToWorld(offsets) - spawnToken(tokenPosition, tokenType) -end - --- spawn a group of tokens of the given type on the object -function spawnTokenGroup(object, tokenType, tokenCount) - local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] - if offsets == nil then - error("couldn't find offsets for " .. tokenCount .. ' tokens') - end - local i = 0 - while i < tokenCount do - local offset = offsets[i + 1] - spawnTokenOn(object, offset, tokenType) - i = i + 1 - end -end - -function buildPlayerCardKey(object) - return object.getName() .. ':' .. object.getDescription() -end - -function getPlayerCardData(object) - return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] -end - -function shouldSpawnTokens(object) - -- we assume we shouldn't spawn tokens if in doubt, this should - -- only ever happen on load and in that case prevents respawns - local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) - local canSpawn = getPlayerCardData(object) - return not spawned and canSpawn -end - -function markSpawned(object) - local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) - if not saved then - error('attempt to mark player card spawned before data loaded') - end -end - -function spawnTokensFor(object) - local data = getPlayerCardData(object) - if data == nil then - error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') - end - log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) - spawnTokenGroup(object, data['tokenType'], data['tokenCount']) - markSpawned(object) -end - -function resetSpawnState() - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Card" then - local guid = object.getGUID() - if guid ~= nil then unmarkSpawned(guid, true) end - elseif object.tag == "Deck" then - local cards = object.getObjects() - if (cards ~= nil) then - for i,v in ipairs(cards) do - if v.guid ~= nil then unmarkSpawned(v.guid) end - end - end - end - end -end - -function unmarkSpawned(guid, force) - if not force and getObjectFromGUID(guid) ~= nil then return end - DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) -end - -function onCollisionEnter(collision_info) - if not COLLISION_ENABLED then - return - end - - local object = collision_info.collision_object - Wait.time(resetSpawnState, 1) - -- anything to the left of this is legal to spawn - local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) - local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) - if boundaryLocalToCard.x > 0 then - log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) - return - end - if not object.is_face_down and shouldSpawnTokens(object) then - spawnTokensFor(object) - end -end - --- functions delegated to Global -function drawChaostokenButton(object, player, isRightClick) - -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) - Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) -end - -function drawEncountercard(object, player, isRightClick) -local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) -Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) -end - -function spawnToken(position, tokenType) - Global.call('spawnToken', {position, tokenType}) +-- set true to enable debug logging +DEBUG = false +-- we use this to turn off collision handling (for clue spawning) +-- until after load is complete (probably a better way to do this) +COLLISION_ENABLED = false +-- position offsets, adjust these to reposition things relative to mat [x,y,z] +DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} +DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} +DISCARD_BUTTON_OFFSETS = { + {-0.98, 0.2, -0.945}, + {-0.525, 0.2, -0.945}, + {-0.07, 0.2, -0.945}, + {0.39, 0.2, -0.945}, + {0.84, 0.2, -0.945}, +} +-- draw deck and discard zone +DECK_POSITION = { x=-1.4, y=0, z=0.3 } +DECK_ZONE_SCALE = { x=3, y=5, z=8 } +DRAW_DECK_POSITION = { x=-55, y=2.5, z=-22.7 } + +-- play zone +PLAYER_COLOR = "Orange" +PLAY_ZONE_POSITION = { x=-55, y=4, z=-17 } +PLAY_ZONE_ROTATION = { x=0, y=270, z=0 } +PLAY_ZONE_SCALE = { x=30, y=5, z=15 } + +RESOURCE_COUNTER_GUID = "816d84" + +-- the position of the global discard pile +-- TODO: delegate to global for any auto discard actions +DISCARD_POSITION = {-3.85, 3, 10.38} + +function log(message) + if DEBUG then + print(message) + end +end + +-- builds a function that discards things in searchPostion to discardPostition +function makeDiscardHandlerFor(searchPosition, discardPosition) + return function (_) + local discardItemList = findObjectsAtPosition(searchPosition) + for _, obj in ipairs(discardItemList) do + obj.setPositionSmooth(discardPosition, false, true) + obj.setRotation({0, -90, 0}) + end + end +end + +-- build a discard button at position to discard from searchPosition to discardPosition +-- number must be unique +function makeDiscardButton(position, searchPosition, discardPosition, number) + local handler = makeDiscardHandlerFor(searchPosition, discardPosition) + local handlerName = 'handler' .. number + self.setVar(handlerName, handler) + self.createButton({ + label = "Discard", + click_function= handlerName, + function_owner= self, + position = position, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180, + }) +end + +function onload(save_state) + self.interactable = DEBUG + DATA_HELPER = getObjectFromGUID('708279') + PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') + PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') + + -- positions of encounter card slots + local encounterSlots = { + {1, 0, -0.7}, + {0.55, 0, -0.7}, + {0.1, 0, -0.7}, + {-0.35, 0, -0.7}, + {-0.8, 0, -0.7} + } + + local i = 1 + while i <= 5 do + makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) + i = i + 1 + end + + self.createButton({ + label = " ", + click_function = "drawEncountercard", + function_owner = self, + position = {-1.45,0,-0.7}, + rotation = {0,-15,0}, + width = 170, + height = 255, + font_size = 50 + }) + + self.createButton({ + label=" ", + click_function = "drawChaostokenButton", + function_owner = self, + position = {1.48,0.0,-0.74}, + rotation = {0,-45,0}, + width = 125, + height = 125, + font_size = 50 + }) + + self.createButton({ + label="Upkeep", + click_function = "doUpkeep", + function_owner = self, + position = {1.48,0.1,-0.4}, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180 + }) + + local state = JSON.decode(save_state) + if state ~= nil and state.zoneID ~= nil then + zoneID = state.zoneID + Wait.time(checkDeckZoneExists, 30) + else + spawnDeckZone() + end + + COLLISION_ENABLED = true +end + +function onSave() + return JSON.encode({ zoneID=zoneID }) +end + +function doUpkeep(obj, color, alt_click) + -- right-click binds to new player color + if alt_click then + PLAYER_COLOR = color + printToColor("Upkeep button bound to " .. color, color) + return + end + + -- unexhaust cards in play zone + local objs = Physics.cast({ + origin = PLAY_ZONE_POSITION, + direction = { x=0, y=1, z=0 }, + type = 3, + size = PLAY_ZONE_SCALE, + orientation = PLAY_ZONE_ROTATION + }) + + local y = PLAY_ZONE_ROTATION.y + + local investigator = nil + for i,v in ipairs(objs) do + local obj = v.hit_object + local props = obj.getCustomObject() + if obj.tag == "Card" and not obj.is_face_down then + if props ~= nil and props.unique_back then + local name = obj.getName() + if string.match(name, "Jenny Barnes") ~= nil then + investigator = "Jenny Barnes" + elseif name == "Patrice Hathaway" then + investigator = name + end + else + local r = obj.getRotation() + if (r.y - y > 10) or (y - r.y > 10) then + obj.setRotationSmooth(PLAY_ZONE_ROTATION) + end + end + elseif obj.tag == "Board" and obj.getDescription() == "Action token" then + if obj.is_face_down then obj.flip() end + end + end + + -- gain resource + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + if investigator == "Jenny Barnes" then + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) + end + + -- draw card (shuffle discard if necessary) + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + drawDeck = nil + discardPile = nil + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Deck" or object.tag == "Card" then + if object.is_face_down then + drawDeck = object + else + discardPile = object + end + end + end + + if investigator == "Patrice Hathaway" then + patriceDraw() + return + end + + if drawDeck == nil then + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(1), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) + else + drawCards(1) + end +end + +function drawCards(numCards) + if drawDeck == nil then return end + drawDeck.deal(numCards, PLAYER_COLOR) +end + +function shuffleDiscardIntoDeck() + discardPile.flip() + discardPile.shuffle() + discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) + drawDeck = discardPile + discardPile = nil +end + +function patriceDraw() + local handSize = #Player[PLAYER_COLOR].getHandObjects() + if handSize >= 5 then return end + local cardsToDraw = 5 - handSize + local deckSize + printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) + if drawDeck == nil then + deckSize = 0 + elseif drawDeck.tag == "Deck" then + deckSize = #drawDeck.getObjects() + else + deckSize = 1 + end + + if deckSize >= cardsToDraw then + drawCards(cardsToDraw) + return + end + + drawCards(deckSize) + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(cardsToDraw - deckSize), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) +end + +function checkDeckZoneExists() + if getObjectFromGUID(zoneID) ~= nil then return end + spawnDeckZone() +end + +function spawnDeckZone() + local pos = self.positionToWorld(DECK_POSITION) + local zoneProps = { + position = pos, + scale = DECK_ZONE_SCALE, + type = 'ScriptingTrigger', + callback = 'zoneCallback', + callback_owner = self, + rotation = self.getRotation() + } + spawnObject(zoneProps) +end + +function zoneCallback(zone) + zoneID = zone.getGUID() +end + +function findObjectsAtPosition(localPos) + local globalPos = self.positionToWorld(localPos) + local objList = Physics.cast({ + origin=globalPos, --Where the cast takes place + direction={0,1,0}, --Which direction it moves (up is shown) + type=2, --Type. 2 is "sphere" + size={2,2,2}, --How large that sphere is + max_distance=1, --How far it moves. Just a little bit + debug=false --If it displays the sphere when casting. + }) + local decksAndCards = {} + for _, obj in ipairs(objList) do + if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then + table.insert(decksAndCards, obj.hit_object) + end + end + return decksAndCards +end + +function spawnTokenOn(object, offsets, tokenType) + local tokenPosition = object.positionToWorld(offsets) + spawnToken(tokenPosition, tokenType) +end + +-- spawn a group of tokens of the given type on the object +function spawnTokenGroup(object, tokenType, tokenCount) + local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] + if offsets == nil then + error("couldn't find offsets for " .. tokenCount .. ' tokens') + end + local i = 0 + while i < tokenCount do + local offset = offsets[i + 1] + spawnTokenOn(object, offset, tokenType) + i = i + 1 + end +end + +function buildPlayerCardKey(object) + return object.getName() .. ':' .. object.getDescription() +end + +function getPlayerCardData(object) + return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] +end + +function shouldSpawnTokens(object) + -- we assume we shouldn't spawn tokens if in doubt, this should + -- only ever happen on load and in that case prevents respawns + local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) + local canSpawn = getPlayerCardData(object) + return not spawned and canSpawn +end + +function markSpawned(object) + local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) + if not saved then + error('attempt to mark player card spawned before data loaded') + end +end + +function spawnTokensFor(object) + local data = getPlayerCardData(object) + if data == nil then + error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') + end + log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) + spawnTokenGroup(object, data['tokenType'], data['tokenCount']) + markSpawned(object) +end + +function resetSpawnState() + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Card" then + local guid = object.getGUID() + if guid ~= nil then unmarkSpawned(guid, true) end + elseif object.tag == "Deck" then + local cards = object.getObjects() + if (cards ~= nil) then + for i,v in ipairs(cards) do + if v.guid ~= nil then unmarkSpawned(v.guid) end + end + end + end + end +end + +function unmarkSpawned(guid, force) + if not force and getObjectFromGUID(guid) ~= nil then return end + DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) +end + +function onCollisionEnter(collision_info) + if not COLLISION_ENABLED then + return + end + + local object = collision_info.collision_object + Wait.time(resetSpawnState, 1) + -- anything to the left of this is legal to spawn + local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) + local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) + if boundaryLocalToCard.x > 0 then + log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) + return + end + if not object.is_face_down and shouldSpawnTokens(object) then + spawnTokensFor(object) + end +end + +-- functions delegated to Global +function drawChaostokenButton(object, player, isRightClick) + -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) + Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) +end + +function drawEncountercard(object, player, isRightClick) +local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) +Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) +end + +function spawnToken(position, tokenType) + Global.call('spawnToken', {position, tokenType}) end \ No newline at end of file diff --git a/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua b/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua index 77cdf233e..f0f52edf0 100644 --- a/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua +++ b/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua @@ -1,405 +1,407 @@ --- set true to enable debug logging -DEBUG = false --- we use this to turn off collision handling (for clue spawning) --- until after load is complete (probably a better way to do this) -COLLISION_ENABLED = false --- position offsets, adjust these to reposition things relative to mat [x,y,z] -DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} -DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} -DISCARD_BUTTON_OFFSETS = { - {-0.98, 0.2, -0.945}, - {-0.525, 0.2, -0.945}, - {-0.07, 0.2, -0.945}, - {0.39, 0.2, -0.945}, - {0.84, 0.2, -0.945}, -} --- draw deck and discard zone -DECK_POSITION = { x=-1.4, y=0, z=0.3 } -DECK_ZONE_SCALE = { x=3, y=5, z=8 } -DRAW_DECK_POSITION = { x=-37, y=2.5, z=26.5 } - --- play zone -PLAYER_COLOR = "Green" -PLAY_ZONE_POSITION = { x=-25, y=4, z=27 } -PLAY_ZONE_ROTATION = { x=0, y=0, z=0 } -PLAY_ZONE_SCALE = { x=30, y=5, z=15 } - -RESOURCE_COUNTER_GUID = "cd15ac" - --- the position of the global discard pile --- TODO: delegate to global for any auto discard actions -DISCARD_POSITION = {-3.85, 3, 10.38} - -function log(message) - if DEBUG then - print(message) - end -end - --- builds a function that discards things in searchPostion to discardPostition -function makeDiscardHandlerFor(searchPosition, discardPosition) - return function (_) - local discardItemList = findObjectsAtPosition(searchPosition) - for _, obj in ipairs(discardItemList) do - obj.setPositionSmooth(discardPosition, false, true) - obj.setRotation({0, -90, 0}) - end - end -end - --- build a discard button at position to discard from searchPosition to discardPosition --- number must be unique -function makeDiscardButton(position, searchPosition, discardPosition, number) - local handler = makeDiscardHandlerFor(searchPosition, discardPosition) - local handlerName = 'handler' .. number - self.setVar(handlerName, handler) - self.createButton({ - label = "Discard", - click_function= handlerName, - function_owner= self, - position = position, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180, - }) -end - -function onload(save_state) - self.interactable = DEBUG - DATA_HELPER = getObjectFromGUID('708279') - PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') - PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') - - -- positions of encounter card slots - local encounterSlots = { - {1, 0, -0.7}, - {0.55, 0, -0.7}, - {0.1, 0, -0.7}, - {-0.35, 0, -0.7}, - {-0.8, 0, -0.7} - } - - local i = 1 - while i <= 5 do - makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) - i = i + 1 - end - - self.createButton({ - label = " ", - click_function = "drawEncountercard", - function_owner = self, - position = {-1.45,0,-0.7}, - rotation = {0,-15,0}, - width = 170, - height = 255, - font_size = 50 - }) - - self.createButton({ - label=" ", - click_function = "drawChaostokenButton", - function_owner = self, - position = {1.48,0.0,-0.74}, - rotation = {0,-45,0}, - width = 125, - height = 125, - font_size = 50 - }) - - self.createButton({ - label="Upkeep", - click_function = "doUpkeep", - function_owner = self, - position = {1.48,0.1,-0.4}, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180 - }) - - local state = JSON.decode(save_state) - if state ~= nil and state.zoneID ~= nil then - zoneID = state.zoneID - Wait.time(checkDeckZoneExists, 30) - else - spawnDeckZone() - end - - COLLISION_ENABLED = true -end - -function onSave() - return JSON.encode({ zoneID=zoneID }) -end - -function doUpkeep(obj, color, alt_click) - -- right-click binds to new player color - if alt_click then - PLAYER_COLOR = color - printToColor("Upkeep button bound to " .. color, color) - return - end - - -- unexhaust cards in play zone - local objs = Physics.cast({ - origin = PLAY_ZONE_POSITION, - direction = { x=0, y=1, z=0 }, - type = 3, - size = PLAY_ZONE_SCALE, - orientation = PLAY_ZONE_ROTATION - }) - - local y = PLAY_ZONE_ROTATION.y - - local investigator = nil - for i,v in ipairs(objs) do - local obj = v.hit_object - local props = obj.getCustomObject() - if obj.tag == "Card" and not obj.is_face_down then - if props ~= nil and props.unique_back then - local name = obj.getName() - if string.match(name, "Jenny Barnes") ~= nil then - investigator = "Jenny Barnes" - elseif name == "Patrice Hathaway" then - investigator = name - end - else - local r = obj.getRotation() - if (r.y - y > 10) or (y - r.y > 10) then - obj.setRotationSmooth(PLAY_ZONE_ROTATION) - end - end - end - end - - -- gain resource - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - if investigator == "Jenny Barnes" then - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) - end - - -- draw card (shuffle discard if necessary) - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - drawDeck = nil - discardPile = nil - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Deck" or object.tag == "Card" then - if object.is_face_down then - drawDeck = object - else - discardPile = object - end - end - end - - if investigator == "Patrice Hathaway" then - patriceDraw() - return - end - - if drawDeck == nil then - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(1), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) - else - drawCards(1) - end -end - -function drawCards(numCards) - if drawDeck == nil then return end - drawDeck.deal(numCards, PLAYER_COLOR) -end - -function shuffleDiscardIntoDeck() - discardPile.flip() - discardPile.shuffle() - discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) - drawDeck = discardPile - discardPile = nil -end - -function patriceDraw() - local handSize = #Player[PLAYER_COLOR].getHandObjects() - if handSize >= 5 then return end - local cardsToDraw = 5 - handSize - local deckSize - printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) - if drawDeck == nil then - deckSize = 0 - elseif drawDeck.tag == "Deck" then - deckSize = #drawDeck.getObjects() - else - deckSize = 1 - end - - if deckSize >= cardsToDraw then - drawCards(cardsToDraw) - return - end - - drawCards(deckSize) - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(cardsToDraw - deckSize), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) -end - -function checkDeckZoneExists() - if getObjectFromGUID(zoneID) ~= nil then return end - spawnDeckZone() -end - -function spawnDeckZone() - local pos = self.positionToWorld(DECK_POSITION) - local zoneProps = { - position = pos, - scale = DECK_ZONE_SCALE, - type = 'ScriptingTrigger', - callback = 'zoneCallback', - callback_owner = self, - rotation = self.getRotation() - } - spawnObject(zoneProps) -end - -function zoneCallback(zone) - zoneID = zone.getGUID() -end - -function findObjectsAtPosition(localPos) - local globalPos = self.positionToWorld(localPos) - local objList = Physics.cast({ - origin=globalPos, --Where the cast takes place - direction={0,1,0}, --Which direction it moves (up is shown) - type=2, --Type. 2 is "sphere" - size={2,2,2}, --How large that sphere is - max_distance=1, --How far it moves. Just a little bit - debug=false --If it displays the sphere when casting. - }) - local decksAndCards = {} - for _, obj in ipairs(objList) do - if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then - table.insert(decksAndCards, obj.hit_object) - end - end - return decksAndCards -end - -function spawnTokenOn(object, offsets, tokenType) - local tokenPosition = object.positionToWorld(offsets) - spawnToken(tokenPosition, tokenType) -end - --- spawn a group of tokens of the given type on the object -function spawnTokenGroup(object, tokenType, tokenCount) - local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] - if offsets == nil then - error("couldn't find offsets for " .. tokenCount .. ' tokens') - end - local i = 0 - while i < tokenCount do - local offset = offsets[i + 1] - spawnTokenOn(object, offset, tokenType) - i = i + 1 - end -end - -function buildPlayerCardKey(object) - return object.getName() .. ':' .. object.getDescription() -end - -function getPlayerCardData(object) - return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] -end - -function shouldSpawnTokens(object) - -- we assume we shouldn't spawn tokens if in doubt, this should - -- only ever happen on load and in that case prevents respawns - local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) - local canSpawn = getPlayerCardData(object) - return not spawned and canSpawn -end - -function markSpawned(object) - local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) - if not saved then - error('attempt to mark player card spawned before data loaded') - end -end - -function spawnTokensFor(object) - local data = getPlayerCardData(object) - if data == nil then - error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') - end - log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) - spawnTokenGroup(object, data['tokenType'], data['tokenCount']) - markSpawned(object) -end - -function resetSpawnState() - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Card" then - local guid = object.getGUID() - if guid ~= nil then unmarkSpawned(guid, true) end - elseif object.tag == "Deck" then - local cards = object.getObjects() - if (cards ~= nil) then - for i,v in ipairs(cards) do - if v.guid ~= nil then unmarkSpawned(v.guid) end - end - end - end - end -end - -function unmarkSpawned(guid, force) - if not force and getObjectFromGUID(guid) ~= nil then return end - DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) -end - -function onCollisionEnter(collision_info) - if not COLLISION_ENABLED then - return - end - - local object = collision_info.collision_object - Wait.time(resetSpawnState, 1) - -- anything to the left of this is legal to spawn - local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) - local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) - if boundaryLocalToCard.x > 0 then - log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) - return - end - if not object.is_face_down and shouldSpawnTokens(object) then - spawnTokensFor(object) - end -end - --- functions delegated to Global -function drawChaostokenButton(object, player, isRightClick) - -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) - Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) -end - -function drawEncountercard(object, player, isRightClick) -local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) -Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) -end - -function spawnToken(position, tokenType) - Global.call('spawnToken', {position, tokenType}) +-- set true to enable debug logging +DEBUG = false +-- we use this to turn off collision handling (for clue spawning) +-- until after load is complete (probably a better way to do this) +COLLISION_ENABLED = false +-- position offsets, adjust these to reposition things relative to mat [x,y,z] +DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} +DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} +DISCARD_BUTTON_OFFSETS = { + {-0.98, 0.2, -0.945}, + {-0.525, 0.2, -0.945}, + {-0.07, 0.2, -0.945}, + {0.39, 0.2, -0.945}, + {0.84, 0.2, -0.945}, +} +-- draw deck and discard zone +DECK_POSITION = { x=-1.4, y=0, z=0.3 } +DECK_ZONE_SCALE = { x=3, y=5, z=8 } +DRAW_DECK_POSITION = { x=-37, y=2.5, z=26.5 } + +-- play zone +PLAYER_COLOR = "Green" +PLAY_ZONE_POSITION = { x=-25, y=4, z=27 } +PLAY_ZONE_ROTATION = { x=0, y=0, z=0 } +PLAY_ZONE_SCALE = { x=30, y=5, z=15 } + +RESOURCE_COUNTER_GUID = "cd15ac" + +-- the position of the global discard pile +-- TODO: delegate to global for any auto discard actions +DISCARD_POSITION = {-3.85, 3, 10.38} + +function log(message) + if DEBUG then + print(message) + end +end + +-- builds a function that discards things in searchPostion to discardPostition +function makeDiscardHandlerFor(searchPosition, discardPosition) + return function (_) + local discardItemList = findObjectsAtPosition(searchPosition) + for _, obj in ipairs(discardItemList) do + obj.setPositionSmooth(discardPosition, false, true) + obj.setRotation({0, -90, 0}) + end + end +end + +-- build a discard button at position to discard from searchPosition to discardPosition +-- number must be unique +function makeDiscardButton(position, searchPosition, discardPosition, number) + local handler = makeDiscardHandlerFor(searchPosition, discardPosition) + local handlerName = 'handler' .. number + self.setVar(handlerName, handler) + self.createButton({ + label = "Discard", + click_function= handlerName, + function_owner= self, + position = position, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180, + }) +end + +function onload(save_state) + self.interactable = DEBUG + DATA_HELPER = getObjectFromGUID('708279') + PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') + PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') + + -- positions of encounter card slots + local encounterSlots = { + {1, 0, -0.7}, + {0.55, 0, -0.7}, + {0.1, 0, -0.7}, + {-0.35, 0, -0.7}, + {-0.8, 0, -0.7} + } + + local i = 1 + while i <= 5 do + makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) + i = i + 1 + end + + self.createButton({ + label = " ", + click_function = "drawEncountercard", + function_owner = self, + position = {-1.45,0,-0.7}, + rotation = {0,-15,0}, + width = 170, + height = 255, + font_size = 50 + }) + + self.createButton({ + label=" ", + click_function = "drawChaostokenButton", + function_owner = self, + position = {1.48,0.0,-0.74}, + rotation = {0,-45,0}, + width = 125, + height = 125, + font_size = 50 + }) + + self.createButton({ + label="Upkeep", + click_function = "doUpkeep", + function_owner = self, + position = {1.48,0.1,-0.4}, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180 + }) + + local state = JSON.decode(save_state) + if state ~= nil and state.zoneID ~= nil then + zoneID = state.zoneID + Wait.time(checkDeckZoneExists, 30) + else + spawnDeckZone() + end + + COLLISION_ENABLED = true +end + +function onSave() + return JSON.encode({ zoneID=zoneID }) +end + +function doUpkeep(obj, color, alt_click) + -- right-click binds to new player color + if alt_click then + PLAYER_COLOR = color + printToColor("Upkeep button bound to " .. color, color) + return + end + + -- unexhaust cards in play zone + local objs = Physics.cast({ + origin = PLAY_ZONE_POSITION, + direction = { x=0, y=1, z=0 }, + type = 3, + size = PLAY_ZONE_SCALE, + orientation = PLAY_ZONE_ROTATION + }) + + local y = PLAY_ZONE_ROTATION.y + + local investigator = nil + for i,v in ipairs(objs) do + local obj = v.hit_object + local props = obj.getCustomObject() + if obj.tag == "Card" and not obj.is_face_down then + if props ~= nil and props.unique_back then + local name = obj.getName() + if string.match(name, "Jenny Barnes") ~= nil then + investigator = "Jenny Barnes" + elseif name == "Patrice Hathaway" then + investigator = name + end + else + local r = obj.getRotation() + if (r.y - y > 10) or (y - r.y > 10) then + obj.setRotationSmooth(PLAY_ZONE_ROTATION) + end + end + elseif obj.tag == "Board" and obj.getDescription() == "Action token" then + if obj.is_face_down then obj.flip() end + end + end + + -- gain resource + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + if investigator == "Jenny Barnes" then + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) + end + + -- draw card (shuffle discard if necessary) + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + drawDeck = nil + discardPile = nil + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Deck" or object.tag == "Card" then + if object.is_face_down then + drawDeck = object + else + discardPile = object + end + end + end + + if investigator == "Patrice Hathaway" then + patriceDraw() + return + end + + if drawDeck == nil then + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(1), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) + else + drawCards(1) + end +end + +function drawCards(numCards) + if drawDeck == nil then return end + drawDeck.deal(numCards, PLAYER_COLOR) +end + +function shuffleDiscardIntoDeck() + discardPile.flip() + discardPile.shuffle() + discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) + drawDeck = discardPile + discardPile = nil +end + +function patriceDraw() + local handSize = #Player[PLAYER_COLOR].getHandObjects() + if handSize >= 5 then return end + local cardsToDraw = 5 - handSize + local deckSize + printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) + if drawDeck == nil then + deckSize = 0 + elseif drawDeck.tag == "Deck" then + deckSize = #drawDeck.getObjects() + else + deckSize = 1 + end + + if deckSize >= cardsToDraw then + drawCards(cardsToDraw) + return + end + + drawCards(deckSize) + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(cardsToDraw - deckSize), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) +end + +function checkDeckZoneExists() + if getObjectFromGUID(zoneID) ~= nil then return end + spawnDeckZone() +end + +function spawnDeckZone() + local pos = self.positionToWorld(DECK_POSITION) + local zoneProps = { + position = pos, + scale = DECK_ZONE_SCALE, + type = 'ScriptingTrigger', + callback = 'zoneCallback', + callback_owner = self, + rotation = self.getRotation() + } + spawnObject(zoneProps) +end + +function zoneCallback(zone) + zoneID = zone.getGUID() +end + +function findObjectsAtPosition(localPos) + local globalPos = self.positionToWorld(localPos) + local objList = Physics.cast({ + origin=globalPos, --Where the cast takes place + direction={0,1,0}, --Which direction it moves (up is shown) + type=2, --Type. 2 is "sphere" + size={2,2,2}, --How large that sphere is + max_distance=1, --How far it moves. Just a little bit + debug=false --If it displays the sphere when casting. + }) + local decksAndCards = {} + for _, obj in ipairs(objList) do + if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then + table.insert(decksAndCards, obj.hit_object) + end + end + return decksAndCards +end + +function spawnTokenOn(object, offsets, tokenType) + local tokenPosition = object.positionToWorld(offsets) + spawnToken(tokenPosition, tokenType) +end + +-- spawn a group of tokens of the given type on the object +function spawnTokenGroup(object, tokenType, tokenCount) + local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] + if offsets == nil then + error("couldn't find offsets for " .. tokenCount .. ' tokens') + end + local i = 0 + while i < tokenCount do + local offset = offsets[i + 1] + spawnTokenOn(object, offset, tokenType) + i = i + 1 + end +end + +function buildPlayerCardKey(object) + return object.getName() .. ':' .. object.getDescription() +end + +function getPlayerCardData(object) + return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] +end + +function shouldSpawnTokens(object) + -- we assume we shouldn't spawn tokens if in doubt, this should + -- only ever happen on load and in that case prevents respawns + local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) + local canSpawn = getPlayerCardData(object) + return not spawned and canSpawn +end + +function markSpawned(object) + local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) + if not saved then + error('attempt to mark player card spawned before data loaded') + end +end + +function spawnTokensFor(object) + local data = getPlayerCardData(object) + if data == nil then + error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') + end + log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) + spawnTokenGroup(object, data['tokenType'], data['tokenCount']) + markSpawned(object) +end + +function resetSpawnState() + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Card" then + local guid = object.getGUID() + if guid ~= nil then unmarkSpawned(guid, true) end + elseif object.tag == "Deck" then + local cards = object.getObjects() + if (cards ~= nil) then + for i,v in ipairs(cards) do + if v.guid ~= nil then unmarkSpawned(v.guid) end + end + end + end + end +end + +function unmarkSpawned(guid, force) + if not force and getObjectFromGUID(guid) ~= nil then return end + DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) +end + +function onCollisionEnter(collision_info) + if not COLLISION_ENABLED then + return + end + + local object = collision_info.collision_object + Wait.time(resetSpawnState, 1) + -- anything to the left of this is legal to spawn + local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) + local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) + if boundaryLocalToCard.x > 0 then + log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) + return + end + if not object.is_face_down and shouldSpawnTokens(object) then + spawnTokensFor(object) + end +end + +-- functions delegated to Global +function drawChaostokenButton(object, player, isRightClick) + -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) + Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) +end + +function drawEncountercard(object, player, isRightClick) +local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) +Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) +end + +function spawnToken(position, tokenType) + Global.call('spawnToken', {position, tokenType}) end \ No newline at end of file diff --git a/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua b/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua index 9351f882d..cddb3d0b4 100644 --- a/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua +++ b/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua @@ -1,405 +1,407 @@ --- set true to enable debug logging -DEBUG = false --- we use this to turn off collision handling (for clue spawning) --- until after load is complete (probably a better way to do this) -COLLISION_ENABLED = false --- position offsets, adjust these to reposition things relative to mat [x,y,z] -DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} -DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} -DISCARD_BUTTON_OFFSETS = { - {-0.98, 0.2, -0.945}, - {-0.525, 0.2, -0.945}, - {-0.07, 0.2, -0.945}, - {0.39, 0.2, -0.945}, - {0.84, 0.2, -0.945}, -} --- draw deck and discard zone -DECK_POSITION = { x=-1.4, y=0, z=0.3 } -DECK_ZONE_SCALE = { x=3, y=5, z=8 } -DRAW_DECK_POSITION = { x=-18.9, y=2.5, z=-26.7 } - --- play zone -PLAYER_COLOR = "Red" -PLAY_ZONE_POSITION = { x=-25, y=4, z=-27 } -PLAY_ZONE_ROTATION = { x=0, y=180, z=0 } -PLAY_ZONE_SCALE = { x=30, y=5, z=15 } - -RESOURCE_COUNTER_GUID = "a4b60d" - --- the position of the global discard pile --- TODO: delegate to global for any auto discard actions -DISCARD_POSITION = {-3.85, 3, 10.38} - -function log(message) - if DEBUG then - print(message) - end -end - --- builds a function that discards things in searchPostion to discardPostition -function makeDiscardHandlerFor(searchPosition, discardPosition) - return function (_) - local discardItemList = findObjectsAtPosition(searchPosition) - for _, obj in ipairs(discardItemList) do - obj.setPositionSmooth(discardPosition, false, true) - obj.setRotation({0, -90, 0}) - end - end -end - --- build a discard button at position to discard from searchPosition to discardPosition --- number must be unique -function makeDiscardButton(position, searchPosition, discardPosition, number) - local handler = makeDiscardHandlerFor(searchPosition, discardPosition) - local handlerName = 'handler' .. number - self.setVar(handlerName, handler) - self.createButton({ - label = "Discard", - click_function= handlerName, - function_owner= self, - position = position, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180, - }) -end - -function onload(save_state) - self.interactable = DEBUG - DATA_HELPER = getObjectFromGUID('708279') - PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') - PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') - - -- positions of encounter card slots - local encounterSlots = { - {1, 0, -0.7}, - {0.55, 0, -0.7}, - {0.1, 0, -0.7}, - {-0.35, 0, -0.7}, - {-0.8, 0, -0.7} - } - - local i = 1 - while i <= 5 do - makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) - i = i + 1 - end - - self.createButton({ - label = " ", - click_function = "drawEncountercard", - function_owner = self, - position = {-1.45,0,-0.7}, - rotation = {0,-15,0}, - width = 170, - height = 255, - font_size = 50 - }) - - self.createButton({ - label=" ", - click_function = "drawChaostokenButton", - function_owner = self, - position = {1.48,0.0,-0.74}, - rotation = {0,-45,0}, - width = 125, - height = 125, - font_size = 50 - }) - - self.createButton({ - label="Upkeep", - click_function = "doUpkeep", - function_owner = self, - position = {1.48,0.1,-0.4}, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180 - }) - - local state = JSON.decode(save_state) - if state ~= nil and state.zoneID ~= nil then - zoneID = state.zoneID - Wait.time(checkDeckZoneExists, 30) - else - spawnDeckZone() - end - - COLLISION_ENABLED = true -end - -function onSave() - return JSON.encode({ zoneID=zoneID }) -end - -function doUpkeep(obj, color, alt_click) - -- right-click binds to new player color - if alt_click then - PLAYER_COLOR = color - printToColor("Upkeep button bound to " .. color, color) - return - end - - -- unexhaust cards in play zone - local objs = Physics.cast({ - origin = PLAY_ZONE_POSITION, - direction = { x=0, y=1, z=0 }, - type = 3, - size = PLAY_ZONE_SCALE, - orientation = PLAY_ZONE_ROTATION - }) - - local y = PLAY_ZONE_ROTATION.y - - local investigator = nil - for i,v in ipairs(objs) do - local obj = v.hit_object - local props = obj.getCustomObject() - if obj.tag == "Card" and not obj.is_face_down then - if props ~= nil and props.unique_back then - local name = obj.getName() - if string.match(name, "Jenny Barnes") ~= nil then - investigator = "Jenny Barnes" - elseif name == "Patrice Hathaway" then - investigator = name - end - else - local r = obj.getRotation() - if (r.y - y > 10) or (y - r.y > 10) then - obj.setRotationSmooth(PLAY_ZONE_ROTATION) - end - end - end - end - - -- gain resource - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - if investigator == "Jenny Barnes" then - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) - end - - -- draw card (shuffle discard if necessary) - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - drawDeck = nil - discardPile = nil - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Deck" or object.tag == "Card" then - if object.is_face_down then - drawDeck = object - else - discardPile = object - end - end - end - - if investigator == "Patrice Hathaway" then - patriceDraw() - return - end - - if drawDeck == nil then - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(1), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) - else - drawCards(1) - end -end - -function drawCards(numCards) - if drawDeck == nil then return end - drawDeck.deal(numCards, PLAYER_COLOR) -end - -function shuffleDiscardIntoDeck() - discardPile.flip() - discardPile.shuffle() - discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) - drawDeck = discardPile - discardPile = nil -end - -function patriceDraw() - local handSize = #Player[PLAYER_COLOR].getHandObjects() - if handSize >= 5 then return end - local cardsToDraw = 5 - handSize - local deckSize - printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) - if drawDeck == nil then - deckSize = 0 - elseif drawDeck.tag == "Deck" then - deckSize = #drawDeck.getObjects() - else - deckSize = 1 - end - - if deckSize >= cardsToDraw then - drawCards(cardsToDraw) - return - end - - drawCards(deckSize) - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(cardsToDraw - deckSize), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) -end - -function checkDeckZoneExists() - if getObjectFromGUID(zoneID) ~= nil then return end - spawnDeckZone() -end - -function spawnDeckZone() - local pos = self.positionToWorld(DECK_POSITION) - local zoneProps = { - position = pos, - scale = DECK_ZONE_SCALE, - type = 'ScriptingTrigger', - callback = 'zoneCallback', - callback_owner = self, - rotation = self.getRotation() - } - spawnObject(zoneProps) -end - -function zoneCallback(zone) - zoneID = zone.getGUID() -end - -function findObjectsAtPosition(localPos) - local globalPos = self.positionToWorld(localPos) - local objList = Physics.cast({ - origin=globalPos, --Where the cast takes place - direction={0,1,0}, --Which direction it moves (up is shown) - type=2, --Type. 2 is "sphere" - size={2,2,2}, --How large that sphere is - max_distance=1, --How far it moves. Just a little bit - debug=false --If it displays the sphere when casting. - }) - local decksAndCards = {} - for _, obj in ipairs(objList) do - if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then - table.insert(decksAndCards, obj.hit_object) - end - end - return decksAndCards -end - -function spawnTokenOn(object, offsets, tokenType) - local tokenPosition = object.positionToWorld(offsets) - spawnToken(tokenPosition, tokenType) -end - --- spawn a group of tokens of the given type on the object -function spawnTokenGroup(object, tokenType, tokenCount) - local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] - if offsets == nil then - error("couldn't find offsets for " .. tokenCount .. ' tokens') - end - local i = 0 - while i < tokenCount do - local offset = offsets[i + 1] - spawnTokenOn(object, offset, tokenType) - i = i + 1 - end -end - -function buildPlayerCardKey(object) - return object.getName() .. ':' .. object.getDescription() -end - -function getPlayerCardData(object) - return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] -end - -function shouldSpawnTokens(object) - -- we assume we shouldn't spawn tokens if in doubt, this should - -- only ever happen on load and in that case prevents respawns - local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) - local canSpawn = getPlayerCardData(object) - return not spawned and canSpawn -end - -function markSpawned(object) - local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) - if not saved then - error('attempt to mark player card spawned before data loaded') - end -end - -function spawnTokensFor(object) - local data = getPlayerCardData(object) - if data == nil then - error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') - end - log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) - spawnTokenGroup(object, data['tokenType'], data['tokenCount']) - markSpawned(object) -end - -function resetSpawnState() - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Card" then - local guid = object.getGUID() - if guid ~= nil then unmarkSpawned(guid, true) end - elseif object.tag == "Deck" then - local cards = object.getObjects() - if (cards ~= nil) then - for i,v in ipairs(cards) do - if v.guid ~= nil then unmarkSpawned(v.guid) end - end - end - end - end -end - -function unmarkSpawned(guid, force) - if not force and getObjectFromGUID(guid) ~= nil then return end - DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) -end - -function onCollisionEnter(collision_info) - if not COLLISION_ENABLED then - return - end - - local object = collision_info.collision_object - Wait.time(resetSpawnState, 1) - -- anything to the left of this is legal to spawn - local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) - local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) - if boundaryLocalToCard.x > 0 then - log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) - return - end - if not object.is_face_down and shouldSpawnTokens(object) then - spawnTokensFor(object) - end -end - --- functions delegated to Global -function drawChaostokenButton(object, player, isRightClick) - -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) - Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) -end - -function drawEncountercard(object, player, isRightClick) -local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) -Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) -end - -function spawnToken(position, tokenType) - Global.call('spawnToken', {position, tokenType}) +-- set true to enable debug logging +DEBUG = false +-- we use this to turn off collision handling (for clue spawning) +-- until after load is complete (probably a better way to do this) +COLLISION_ENABLED = false +-- position offsets, adjust these to reposition things relative to mat [x,y,z] +DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} +DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} +DISCARD_BUTTON_OFFSETS = { + {-0.98, 0.2, -0.945}, + {-0.525, 0.2, -0.945}, + {-0.07, 0.2, -0.945}, + {0.39, 0.2, -0.945}, + {0.84, 0.2, -0.945}, +} +-- draw deck and discard zone +DECK_POSITION = { x=-1.4, y=0, z=0.3 } +DECK_ZONE_SCALE = { x=3, y=5, z=8 } +DRAW_DECK_POSITION = { x=-18.9, y=2.5, z=-26.7 } + +-- play zone +PLAYER_COLOR = "Red" +PLAY_ZONE_POSITION = { x=-25, y=4, z=-27 } +PLAY_ZONE_ROTATION = { x=0, y=180, z=0 } +PLAY_ZONE_SCALE = { x=30, y=5, z=15 } + +RESOURCE_COUNTER_GUID = "a4b60d" + +-- the position of the global discard pile +-- TODO: delegate to global for any auto discard actions +DISCARD_POSITION = {-3.85, 3, 10.38} + +function log(message) + if DEBUG then + print(message) + end +end + +-- builds a function that discards things in searchPostion to discardPostition +function makeDiscardHandlerFor(searchPosition, discardPosition) + return function (_) + local discardItemList = findObjectsAtPosition(searchPosition) + for _, obj in ipairs(discardItemList) do + obj.setPositionSmooth(discardPosition, false, true) + obj.setRotation({0, -90, 0}) + end + end +end + +-- build a discard button at position to discard from searchPosition to discardPosition +-- number must be unique +function makeDiscardButton(position, searchPosition, discardPosition, number) + local handler = makeDiscardHandlerFor(searchPosition, discardPosition) + local handlerName = 'handler' .. number + self.setVar(handlerName, handler) + self.createButton({ + label = "Discard", + click_function= handlerName, + function_owner= self, + position = position, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180, + }) +end + +function onload(save_state) + self.interactable = DEBUG + DATA_HELPER = getObjectFromGUID('708279') + PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') + PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') + + -- positions of encounter card slots + local encounterSlots = { + {1, 0, -0.7}, + {0.55, 0, -0.7}, + {0.1, 0, -0.7}, + {-0.35, 0, -0.7}, + {-0.8, 0, -0.7} + } + + local i = 1 + while i <= 5 do + makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) + i = i + 1 + end + + self.createButton({ + label = " ", + click_function = "drawEncountercard", + function_owner = self, + position = {-1.45,0,-0.7}, + rotation = {0,-15,0}, + width = 170, + height = 255, + font_size = 50 + }) + + self.createButton({ + label=" ", + click_function = "drawChaostokenButton", + function_owner = self, + position = {1.48,0.0,-0.74}, + rotation = {0,-45,0}, + width = 125, + height = 125, + font_size = 50 + }) + + self.createButton({ + label="Upkeep", + click_function = "doUpkeep", + function_owner = self, + position = {1.48,0.1,-0.4}, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180 + }) + + local state = JSON.decode(save_state) + if state ~= nil and state.zoneID ~= nil then + zoneID = state.zoneID + Wait.time(checkDeckZoneExists, 30) + else + spawnDeckZone() + end + + COLLISION_ENABLED = true +end + +function onSave() + return JSON.encode({ zoneID=zoneID }) +end + +function doUpkeep(obj, color, alt_click) + -- right-click binds to new player color + if alt_click then + PLAYER_COLOR = color + printToColor("Upkeep button bound to " .. color, color) + return + end + + -- unexhaust cards in play zone + local objs = Physics.cast({ + origin = PLAY_ZONE_POSITION, + direction = { x=0, y=1, z=0 }, + type = 3, + size = PLAY_ZONE_SCALE, + orientation = PLAY_ZONE_ROTATION + }) + + local y = PLAY_ZONE_ROTATION.y + + local investigator = nil + for i,v in ipairs(objs) do + local obj = v.hit_object + local props = obj.getCustomObject() + if obj.tag == "Card" and not obj.is_face_down then + if props ~= nil and props.unique_back then + local name = obj.getName() + if string.match(name, "Jenny Barnes") ~= nil then + investigator = "Jenny Barnes" + elseif name == "Patrice Hathaway" then + investigator = name + end + else + local r = obj.getRotation() + if (r.y - y > 10) or (y - r.y > 10) then + obj.setRotationSmooth(PLAY_ZONE_ROTATION) + end + end + elseif obj.tag == "Board" and obj.getDescription() == "Action token" then + if obj.is_face_down then obj.flip() end + end + end + + -- gain resource + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + if investigator == "Jenny Barnes" then + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) + end + + -- draw card (shuffle discard if necessary) + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + drawDeck = nil + discardPile = nil + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Deck" or object.tag == "Card" then + if object.is_face_down then + drawDeck = object + else + discardPile = object + end + end + end + + if investigator == "Patrice Hathaway" then + patriceDraw() + return + end + + if drawDeck == nil then + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(1), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) + else + drawCards(1) + end +end + +function drawCards(numCards) + if drawDeck == nil then return end + drawDeck.deal(numCards, PLAYER_COLOR) +end + +function shuffleDiscardIntoDeck() + discardPile.flip() + discardPile.shuffle() + discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) + drawDeck = discardPile + discardPile = nil +end + +function patriceDraw() + local handSize = #Player[PLAYER_COLOR].getHandObjects() + if handSize >= 5 then return end + local cardsToDraw = 5 - handSize + local deckSize + printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) + if drawDeck == nil then + deckSize = 0 + elseif drawDeck.tag == "Deck" then + deckSize = #drawDeck.getObjects() + else + deckSize = 1 + end + + if deckSize >= cardsToDraw then + drawCards(cardsToDraw) + return + end + + drawCards(deckSize) + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(cardsToDraw - deckSize), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) +end + +function checkDeckZoneExists() + if getObjectFromGUID(zoneID) ~= nil then return end + spawnDeckZone() +end + +function spawnDeckZone() + local pos = self.positionToWorld(DECK_POSITION) + local zoneProps = { + position = pos, + scale = DECK_ZONE_SCALE, + type = 'ScriptingTrigger', + callback = 'zoneCallback', + callback_owner = self, + rotation = self.getRotation() + } + spawnObject(zoneProps) +end + +function zoneCallback(zone) + zoneID = zone.getGUID() +end + +function findObjectsAtPosition(localPos) + local globalPos = self.positionToWorld(localPos) + local objList = Physics.cast({ + origin=globalPos, --Where the cast takes place + direction={0,1,0}, --Which direction it moves (up is shown) + type=2, --Type. 2 is "sphere" + size={2,2,2}, --How large that sphere is + max_distance=1, --How far it moves. Just a little bit + debug=false --If it displays the sphere when casting. + }) + local decksAndCards = {} + for _, obj in ipairs(objList) do + if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then + table.insert(decksAndCards, obj.hit_object) + end + end + return decksAndCards +end + +function spawnTokenOn(object, offsets, tokenType) + local tokenPosition = object.positionToWorld(offsets) + spawnToken(tokenPosition, tokenType) +end + +-- spawn a group of tokens of the given type on the object +function spawnTokenGroup(object, tokenType, tokenCount) + local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] + if offsets == nil then + error("couldn't find offsets for " .. tokenCount .. ' tokens') + end + local i = 0 + while i < tokenCount do + local offset = offsets[i + 1] + spawnTokenOn(object, offset, tokenType) + i = i + 1 + end +end + +function buildPlayerCardKey(object) + return object.getName() .. ':' .. object.getDescription() +end + +function getPlayerCardData(object) + return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] +end + +function shouldSpawnTokens(object) + -- we assume we shouldn't spawn tokens if in doubt, this should + -- only ever happen on load and in that case prevents respawns + local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) + local canSpawn = getPlayerCardData(object) + return not spawned and canSpawn +end + +function markSpawned(object) + local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) + if not saved then + error('attempt to mark player card spawned before data loaded') + end +end + +function spawnTokensFor(object) + local data = getPlayerCardData(object) + if data == nil then + error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') + end + log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) + spawnTokenGroup(object, data['tokenType'], data['tokenCount']) + markSpawned(object) +end + +function resetSpawnState() + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Card" then + local guid = object.getGUID() + if guid ~= nil then unmarkSpawned(guid, true) end + elseif object.tag == "Deck" then + local cards = object.getObjects() + if (cards ~= nil) then + for i,v in ipairs(cards) do + if v.guid ~= nil then unmarkSpawned(v.guid) end + end + end + end + end +end + +function unmarkSpawned(guid, force) + if not force and getObjectFromGUID(guid) ~= nil then return end + DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) +end + +function onCollisionEnter(collision_info) + if not COLLISION_ENABLED then + return + end + + local object = collision_info.collision_object + Wait.time(resetSpawnState, 1) + -- anything to the left of this is legal to spawn + local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) + local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) + if boundaryLocalToCard.x > 0 then + log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) + return + end + if not object.is_face_down and shouldSpawnTokens(object) then + spawnTokensFor(object) + end +end + +-- functions delegated to Global +function drawChaostokenButton(object, player, isRightClick) + -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) + Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) +end + +function drawEncountercard(object, player, isRightClick) +local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) +Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) +end + +function spawnToken(position, tokenType) + Global.call('spawnToken', {position, tokenType}) end \ No newline at end of file diff --git a/unpacked/Custom_Token b7b45b.ttslua b/unpacked/Custom_Token b7b45b.ttslua index d80e1b252..cba82b051 100644 --- a/unpacked/Custom_Token b7b45b.ttslua +++ b/unpacked/Custom_Token b7b45b.ttslua @@ -1,199 +1,199 @@ - - -function onSave() - saved_data = JSON.encode({tid=tableImageData, cd=checkData}) - --saved_data = "" - return saved_data -end - -function onload(saved_data) - --Loads the tracking for if the game has started yet - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - tableImageData = loaded_data.tid - checkData = loaded_data.cd - else - tableImageData = {} - checkData = {move=false, scale=false} - end - - --Disables interactable status of objects with GUID in list - for _, guid in ipairs(ref_noninteractable) do - local obj = getObjectFromGUID(guid) - if obj then obj.interactable = false end - end - - - - obj_surface = getObjectFromGUID("721ba2") - - - controlActive = false - createOpenCloseButton() -end - - - ---Activation/deactivation of control panel - - - ---Activated by clicking on -function click_toggleControl(_, color) - if permissionCheck(color) then - if not controlActive then - --Activate control panel - controlActive = true - self.clearButtons() - createOpenCloseButton() - createSurfaceInput() - createSurfaceButtons() - - else - --Deactivate control panel - controlActive = false - self.clearButtons() - self.clearInputs() - createOpenCloseButton() - - end - end -end - - - - ---Table surface control - - - ---Changes table surface -function click_applySurface(_, color) - if permissionCheck(color) then - updateSurface() - broadcastToAll("New Playmat Image Applied", {0.2,0.9,0.2}) - end -end - ---Updates surface from the values in the input field -function updateSurface() - local customInfo = obj_surface.getCustomObject() - customInfo.image = self.getInputs()[1].value - obj_surface.setCustomObject(customInfo) - obj_surface = obj_surface.reload() -end - - - ---Information gathering - - - ---Checks if a color is promoted or host -function permissionCheck(color) - if Player[color].host==true or Player[color].promoted==true then - return true - else - return false - end -end - ---Locates a string saved within memory file -function findInImageDataIndex(...) - for _, str in ipairs({...}) do - for i, v in ipairs(tableImageData) do - if v.url == str or v.name == str then - return i - end - end - end - return nil -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end - ---Locates a button with a helper function -function findButton(obj, func) - if func==nil then error("No func supplied to findButton") end - for _, v in ipairs(obj.getButtons()) do - if func(v) then - return v - end - end - return nil -end - - - ---Creation of buttons/inputs - - - -function createOpenCloseButton() - local tooltip = "Open Playmat Panel" - if controlActive then - tooltip = "Close Playmat Panel" - end - self.createButton({ - click_function="click_toggleControl", function_owner=self, - position={0,0,0}, rotation={-45,0,0}, height=1500, width=1500, - color={1,1,1,0}, tooltip=tooltip - }) -end - -function createSurfaceInput() - local currentURL = obj_surface.getCustomObject().diffuse - local nickname = "" - if findInImageDataIndex(currentURL) ~= nil then - nickname = tableImageData[findInImageDataIndex(currentURL)].name - end - - self.createInput({ - label="URL", input_function="none", function_owner=self, - alignment=3, position={0,0.15,3}, height=224, width=4000, - font_size=200, tooltip="Enter URL for playmat image", - value=currentURL - }) -end - -function createSurfaceButtons() - --Label - self.createButton({ - label="Playmat Image Swapper", click_function="none", - position={0,0.15,2.2}, height=0, width=0, font_size=300, font_color={1,1,1} - }) - --Functional - self.createButton({ - label="Apply Image\nTo Playmat", click_function="click_applySurface", - function_owner=self, tooltip="Apply URL as playmat image", - position={0,0.15,4}, height=440, width=1400, font_size=200, - }) - -end - - - - - - ---Data tables - - - - -ref_noninteractable = { - "afc863","c8edca","393bf7","12c65e","f938a2","9f95fd","35b95f", - "5af8f2","4ee1f2","bd69bd" -} - -ref_playerColor = { - "White", "Brown", "Red", "Orange", "Yellow", - "Green", "Teal", "Blue", "Purple", "Pink", "Black" -} - ---Dummy function, absorbs unwanted triggers + + +function onSave() + saved_data = JSON.encode({tid=tableImageData, cd=checkData}) + --saved_data = "" + return saved_data +end + +function onload(saved_data) + --Loads the tracking for if the game has started yet + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + tableImageData = loaded_data.tid + checkData = loaded_data.cd + else + tableImageData = {} + checkData = {move=false, scale=false} + end + + --Disables interactable status of objects with GUID in list + for _, guid in ipairs(ref_noninteractable) do + local obj = getObjectFromGUID(guid) + if obj then obj.interactable = false end + end + + + + obj_surface = getObjectFromGUID("721ba2") + + + controlActive = false + createOpenCloseButton() +end + + + +--Activation/deactivation of control panel + + + +--Activated by clicking on +function click_toggleControl(_, color) + if permissionCheck(color) then + if not controlActive then + --Activate control panel + controlActive = true + self.clearButtons() + createOpenCloseButton() + createSurfaceInput() + createSurfaceButtons() + + else + --Deactivate control panel + controlActive = false + self.clearButtons() + self.clearInputs() + createOpenCloseButton() + + end + end +end + + + + +--Table surface control + + + +--Changes table surface +function click_applySurface(_, color) + if permissionCheck(color) then + updateSurface() + broadcastToAll("New Playmat Image Applied", {0.2,0.9,0.2}) + end +end + +--Updates surface from the values in the input field +function updateSurface() + local customInfo = obj_surface.getCustomObject() + customInfo.image = self.getInputs()[1].value + obj_surface.setCustomObject(customInfo) + obj_surface = obj_surface.reload() +end + + + +--Information gathering + + + +--Checks if a color is promoted or host +function permissionCheck(color) + if Player[color].host==true or Player[color].promoted==true then + return true + else + return false + end +end + +--Locates a string saved within memory file +function findInImageDataIndex(...) + for _, str in ipairs({...}) do + for i, v in ipairs(tableImageData) do + if v.url == str or v.name == str then + return i + end + end + end + return nil +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end + +--Locates a button with a helper function +function findButton(obj, func) + if func==nil then error("No func supplied to findButton") end + for _, v in ipairs(obj.getButtons()) do + if func(v) then + return v + end + end + return nil +end + + + +--Creation of buttons/inputs + + + +function createOpenCloseButton() + local tooltip = "Open Playmat Panel" + if controlActive then + tooltip = "Close Playmat Panel" + end + self.createButton({ + click_function="click_toggleControl", function_owner=self, + position={0,0,0}, rotation={-45,0,0}, height=1500, width=1500, + color={1,1,1,0}, tooltip=tooltip + }) +end + +function createSurfaceInput() + local currentURL = obj_surface.getCustomObject().diffuse + local nickname = "" + if findInImageDataIndex(currentURL) ~= nil then + nickname = tableImageData[findInImageDataIndex(currentURL)].name + end + + self.createInput({ + label="URL", input_function="none", function_owner=self, + alignment=3, position={0,0.15,3}, height=224, width=4000, + font_size=200, tooltip="Enter URL for playmat image", + value=currentURL + }) +end + +function createSurfaceButtons() + --Label + self.createButton({ + label="Playmat Image Swapper", click_function="none", + position={0,0.15,2.2}, height=0, width=0, font_size=300, font_color={1,1,1} + }) + --Functional + self.createButton({ + label="Apply Image\nTo Playmat", click_function="click_applySurface", + function_owner=self, tooltip="Apply URL as playmat image", + position={0,0.15,4}, height=440, width=1400, font_size=200, + }) + +end + + + + + + +--Data tables + + + + +ref_noninteractable = { + "afc863","c8edca","393bf7","12c65e","f938a2","9f95fd","35b95f", + "5af8f2","4ee1f2","bd69bd" +} + +ref_playerColor = { + "White", "Brown", "Red", "Orange", "Yellow", + "Green", "Teal", "Blue", "Purple", "Pink", "Black" +} + +--Dummy function, absorbs unwanted triggers function none() end \ No newline at end of file diff --git a/unpacked/Custom_Token b7b45b.yaml b/unpacked/Custom_Token b7b45b.yaml index 07f832c4d..b3144f099 100644 --- a/unpacked/Custom_Token b7b45b.yaml +++ b/unpacked/Custom_Token b7b45b.yaml @@ -1,8 +1,8 @@ Autoraise: true ColorDiffuse: - b: 0.3745352 - g: 0.3745352 - r: 0.3745352 + b: 0.3745344 + g: 0.3745344 + r: 0.3745344 CustomImage: CustomToken: MergeDistancePixels: 15.0 diff --git a/unpacked/Custom_Token Agenda Deck 85c4c6.ttslua b/unpacked/Custom_Token Agenda Deck 85c4c6.ttslua index 7aacde2cb..ee5b7a827 100644 --- a/unpacked/Custom_Token Agenda Deck 85c4c6.ttslua +++ b/unpacked/Custom_Token Agenda Deck 85c4c6.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {1,1,1,95} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {1,1,1,95} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Chaos Bag Stat Tracker 766620.ttslua b/unpacked/Custom_Token Chaos Bag Stat Tracker 766620.ttslua index 56ef4b7fe..11d95d262 100644 --- a/unpacked/Custom_Token Chaos Bag Stat Tracker 766620.ttslua +++ b/unpacked/Custom_Token Chaos Bag Stat Tracker 766620.ttslua @@ -1,101 +1,101 @@ -function onload(saved_data) - light_mode = false - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - end - createAll() -end - --- functions delegated to Global -function printStats(object, player, isRightClick) - -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) - if isRightClick then - Global.call("resetStats") - else - Global.call("printStats") - end -end - -function updateSave() - local data_to_save = {light_mode } - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {1,1,1,95} - else - f_color = {0,0,0,100} - end - - self.createButton({ - click_function="printStats", - function_owner=self, - position={0,0.05,0}, - height=600, - width=1000, - alignment = 3, - tooltip = "Left Click to print stats. Right Click to reset them.", - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={0,0,0,0} - }) - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = "Left click to show stats. Right click to reset them." - }) -end - -function keepSample(_obj, _string, value) - reloadAll() -end - -function onDestroy() - Timer.destroy(timerID) +function onload(saved_data) + light_mode = false + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + end + createAll() +end + +-- functions delegated to Global +function printStats(object, player, isRightClick) + -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) + if isRightClick then + Global.call("resetStats") + else + Global.call("printStats") + end +end + +function updateSave() + local data_to_save = {light_mode } + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {1,1,1,95} + else + f_color = {0,0,0,100} + end + + self.createButton({ + click_function="printStats", + function_owner=self, + position={0,0.05,0}, + height=600, + width=1000, + alignment = 3, + tooltip = "Left Click to print stats. Right Click to reset them.", + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={0,0,0,0} + }) + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = "Left click to show stats. Right click to reset them." + }) +end + +function keepSample(_obj, _string, value) + reloadAll() +end + +function onDestroy() + Timer.destroy(timerID) end \ No newline at end of file diff --git a/unpacked/Custom_Token Damage 1f5a0a.ttslua b/unpacked/Custom_Token Damage 1f5a0a.ttslua index 690cc9178..3a20df99e 100644 --- a/unpacked/Custom_Token Damage 1f5a0a.ttslua +++ b/unpacked/Custom_Token Damage 1f5a0a.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0.1,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0.1,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Damage 591a45.ttslua b/unpacked/Custom_Token Damage 591a45.ttslua index 690cc9178..3a20df99e 100644 --- a/unpacked/Custom_Token Damage 591a45.ttslua +++ b/unpacked/Custom_Token Damage 591a45.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0.1,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0.1,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Damage e64eec.ttslua b/unpacked/Custom_Token Damage e64eec.ttslua index 690cc9178..3a20df99e 100644 --- a/unpacked/Custom_Token Damage e64eec.ttslua +++ b/unpacked/Custom_Token Damage e64eec.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0.1,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0.1,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Damage eb08d6.ttslua b/unpacked/Custom_Token Damage eb08d6.ttslua index 690cc9178..3a20df99e 100644 --- a/unpacked/Custom_Token Damage eb08d6.ttslua +++ b/unpacked/Custom_Token Damage eb08d6.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0.1,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0.1,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Horror 0257d9.ttslua b/unpacked/Custom_Token Horror 0257d9.ttslua index 895f01f1f..639b2e969 100644 --- a/unpacked/Custom_Token Horror 0257d9.ttslua +++ b/unpacked/Custom_Token Horror 0257d9.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Horror 468e88.ttslua b/unpacked/Custom_Token Horror 468e88.ttslua index 895f01f1f..639b2e969 100644 --- a/unpacked/Custom_Token Horror 468e88.ttslua +++ b/unpacked/Custom_Token Horror 468e88.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Horror 7b5729.ttslua b/unpacked/Custom_Token Horror 7b5729.ttslua index 895f01f1f..639b2e969 100644 --- a/unpacked/Custom_Token Horror 7b5729.ttslua +++ b/unpacked/Custom_Token Horror 7b5729.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Horror beb964.ttslua b/unpacked/Custom_Token Horror beb964.ttslua index 895f01f1f..639b2e969 100644 --- a/unpacked/Custom_Token Horror beb964.ttslua +++ b/unpacked/Custom_Token Horror beb964.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua b/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua index 507874c32..07c0cf077 100644 --- a/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua +++ b/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua @@ -1,158 +1,158 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - p1ClueCounter = getObjectFromGUID("37be78") - p2ClueCounter = getObjectFromGUID("1769ed") - p3ClueCounter = getObjectFromGUID("032300") - p4ClueCounter = getObjectFromGUID("d86b7c") - - timerID = self.getGUID()..math.random(9999999999999) - Timer.create({ - identifier=timerID, - function_name="totalCounters", function_owner=self, - repetitions=0, delay=1 - }) - createAll() -end - -function loadPlayerCounters() - p1ClueCounter = getObjectFromGUID("37be78") - p2ClueCounter = getObjectFromGUID("1769ed") - p3ClueCounter = getObjectFromGUID("032300") - p4ClueCounter = getObjectFromGUID("d86b7c") -end - - -function totalCounters() - if p1ClueCounter == nil or p2ClueCounter == nil or p3ClueCounter == nil or p4ClueCounter == nil then - loadPlayerCounters() - end - local p1ClueCount = p1ClueCounter.getVar("exposedValue") - local p2ClueCount = p2ClueCounter.getVar("exposedValue") - local p3ClueCount = p3ClueCounter.getVar("exposedValue") - local p4ClueCount = p4ClueCounter.getVar("exposedValue") - val = tonumber(p1ClueCount) + tonumber(p2ClueCount) + tonumber(p3ClueCount) + tonumber(p4ClueCount) - updateVal() - updateSave() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {1,1,1,95} - else - f_color = {0,0,0,100} - end - - self.createButton({ - label=tostring(val), - click_function="removeAllPlayerClues", - function_owner=self, - position={0,0.05,0}, - height=600, - width=1000, - alignment = 3, - tooltip = "Click button to remove all clues from all investigators", - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={0,0,0,0} - }) - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function removeAllPlayerClues() - p1ClueCounter.call("removeAllClues") - p2ClueCounter.call("removeAllClues") - p3ClueCounter.call("removeAllClues") - p4ClueCounter.call("removeAllClues") -end - - -function reloadAll() - removeAll() - createAll() - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function updateVal() - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = "Click button to remove all clues from all investigators" - }) - self.editButton({ - index = 0, - value = tostring(val), - - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() -end +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + p1ClueCounter = getObjectFromGUID("37be78") + p2ClueCounter = getObjectFromGUID("1769ed") + p3ClueCounter = getObjectFromGUID("032300") + p4ClueCounter = getObjectFromGUID("d86b7c") + + timerID = self.getGUID()..math.random(9999999999999) + Timer.create({ + identifier=timerID, + function_name="totalCounters", function_owner=self, + repetitions=0, delay=1 + }) + createAll() +end + +function loadPlayerCounters() + p1ClueCounter = getObjectFromGUID("37be78") + p2ClueCounter = getObjectFromGUID("1769ed") + p3ClueCounter = getObjectFromGUID("032300") + p4ClueCounter = getObjectFromGUID("d86b7c") +end + + +function totalCounters() + if p1ClueCounter == nil or p2ClueCounter == nil or p3ClueCounter == nil or p4ClueCounter == nil then + loadPlayerCounters() + end + local p1ClueCount = p1ClueCounter.getVar("exposedValue") + local p2ClueCount = p2ClueCounter.getVar("exposedValue") + local p3ClueCount = p3ClueCounter.getVar("exposedValue") + local p4ClueCount = p4ClueCounter.getVar("exposedValue") + val = tonumber(p1ClueCount) + tonumber(p2ClueCount) + tonumber(p3ClueCount) + tonumber(p4ClueCount) + updateVal() + updateSave() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {1,1,1,95} + else + f_color = {0,0,0,100} + end + + self.createButton({ + label=tostring(val), + click_function="removeAllPlayerClues", + function_owner=self, + position={0,0.05,0}, + height=600, + width=1000, + alignment = 3, + tooltip = "Click button to remove all clues from all investigators", + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={0,0,0,0} + }) + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function removeAllPlayerClues() + p1ClueCounter.call("removeAllClues") + p2ClueCounter.call("removeAllClues") + p3ClueCounter.call("removeAllClues") + p4ClueCounter.call("removeAllClues") +end + + +function reloadAll() + removeAll() + createAll() + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function updateVal() + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = "Click button to remove all clues from all investigators" + }) + self.editButton({ + index = 0, + value = tostring(val), + + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() +end function onDestroy() Timer.destroy(timerID) diff --git a/unpacked/Custom_Token Playarea 721ba2.ttslua b/unpacked/Custom_Token Playarea 721ba2.ttslua index 8eefcaa64..4f133e507 100644 --- a/unpacked/Custom_Token Playarea 721ba2.ttslua +++ b/unpacked/Custom_Token Playarea 721ba2.ttslua @@ -1,214 +1,214 @@ --- set true to enable debug logging -DEBUG = false - --- we use this to turn off collision handling (for clue spawning) --- until after load is complete (probably a better way to do this) -COLLISION_ENABLED = false - --- TODO get the log function from global instead --- log = Global.call('getLogFunction', this) -function getLogFunction(object) - return function (message) - if DEBUG then - print(message) - end - end -end - -log = getLogFunction(self) - -function onload(save_state) - self.interactable = DEBUG - local dataHelper = getObjectFromGUID('708279') - LOCATIONS = dataHelper.getTable('LOCATIONS_DATA') - - TOKEN_PLAYER_ONE = Global.getTable('tokenplayerone') - COUNTER = getObjectFromGUID('f182ee') - log('attempting to load state: ' .. save_state) - if save_state ~= '' then - SPAWNED_LOCATION_GUIDS = JSON.decode(save_state) - end - - COLLISION_ENABLED = true -end - -function onSave() - local spawned_locations = JSON.encode(SPAWNED_LOCATION_GUIDS) - self.script_state = spawned_locations -end - ---[[ -records locations we have spawned clues for, we write this to the save -file onsave() so we don't spawn clues again after a load -]] -SPAWNED_LOCATION_GUIDS = {} - -function isAlreadySpawned(object) - return SPAWNED_LOCATION_GUIDS[object.getGUID()] ~= nil -end - -function markSpawned(object) - SPAWNED_LOCATION_GUIDS[object.getGUID()] = 1 -end - -function buildKey(object) - return object.getName() .. '_' .. object.getGUID() -end - --- try the compound key then the name alone as default -function getLocation(object) - return LOCATIONS[buildKey(object)] or LOCATIONS[object.getName()] -end - -function isLocationWithClues(object) - return getLocation(object) ~= nil -end - ---[[ -Return the number of clues to spawn on this location -]] -function getClueCount(object, isFaceDown, playerCount) - if not isLocationWithClues(object) then - error('attempted to get clue for unexpected object: ' .. object.getName()) - end - local details = getLocation(object) - log(object.getName() .. ' : ' .. details['type'] .. ' : ' .. details['value'] .. ' : ' .. details['clueSide']) - if ((isFaceDown and details['clueSide'] == 'back') - or (not isFaceDown and details['clueSide'] == 'front')) then - if details['type'] == 'fixed' then - return details['value'] - elseif details['type'] == 'perPlayer' then - return details['value'] * playerCount - end - error('unexpected location type: ' .. details['type']) - end - return 0 -end - -function spawnToken(position, number) - local obj_parameters = { - position = position, - rotation = {3.87674022, -90, 0.239081308} - } - local custom = { - thickness = 0.1, - stackable = true - } - - if number == '1' or number == '2' then - obj_parameters.type = 'Custom_Token' - custom.merge_distance = 5.0 - local token = spawnObject(obj_parameters) - if number == '1' then - custom.image = TOKEN_PLAYER_ONE.damageone - token.setCustomObject(custom) - token.scale {0.17, 1, 0.17} - return token - end - - if number == '2' then - custom.image = TOKEN_PLAYER_ONE.damagethree - token.setCustomObject(custom) - token.scale {0.18, 1, 0.18} - return token - end - end - - if number == '3' or number == '4' then - obj_parameters.type = 'Custom_Tile' - custom.type = 2 - local token = spawnObject(obj_parameters) - if number == '3' then - custom.image = TOKEN_PLAYER_ONE.clue - custom.image_bottom = TOKEN_PLAYER_ONE.doom - token.setCustomObject(custom) - token.scale {0.25, 1, 0.25} - token.use_snap_points=false - return token - end - - if number == '4' then - custom.image = TOKEN_PLAYER_ONE.doom - custom.image_bottom = TOKEN_PLAYER_ONE.clue - token.setCustomObject(custom) - token.scale {0.25, 1, 0.25} - token.use_snap_points=false - return token - end - end - -end - - -function spawnCluesAtLocation(clueCount, collision_info) - local object = collision_info.collision_object - if isAlreadySpawned(object) then - error('tried to spawn clue for already spawned location:' .. object.getName()) - end - - local obj_parameters = {} - obj_parameters.type = 'Custom_Token' - obj_parameters.position = { - object.getPosition()[1], - object.getPosition()[2] + 1, - object.getPosition()[3] - } - - log('spawning clues for ' .. object.getName() .. '_' .. object.getGUID()) - local playerCount = COUNTER.getVar('val') - log('player count is ' .. playerCount .. ', clue count is ' .. clueCount) - -- mark this location as spawned, can't happen again - markSpawned(object) - i = 0 - while i < clueCount do - if i < 4 then - obj_parameters.position = { - collision_info.collision_object.getPosition()[1] + 0.3, - collision_info.collision_object.getPosition()[2] + 0.2, - collision_info.collision_object.getPosition()[3] - 0.8 + (0.55 * i) - } - elseif i < 8 then - obj_parameters.position = { - collision_info.collision_object.getPosition()[1] + 0.85, - collision_info.collision_object.getPosition()[2] + 0.2, - collision_info.collision_object.getPosition()[3] - 3 + (0.55 * i) - } - else - obj_parameters.position = { - collision_info.collision_object.getPosition()[1] + 0.575, - collision_info.collision_object.getPosition()[2] + 0.4, - collision_info.collision_object.getPosition()[3] - 5.2 + (0.55 * i)} - end - spawnToken(obj_parameters.position, '3') - i = i + 1 - end -end - - -function updateLocations(args) - local custom_data_helper = getObjectFromGUID(args[1]) - data_locations = custom_data_helper.getTable("LOCATIONS_DATA") - for k, v in pairs(data_locations) do - LOCATIONS[k] = v - end -end - -function onCollisionEnter(collision_info) - -- short circuit all collision stuff until we've loaded state - if not COLLISION_ENABLED then - return - end - - -- check if we should spawn clues here - local object = collision_info.collision_object - if isLocationWithClues(object) and not isAlreadySpawned(object) then - -- this isn't an either/or as down/up here means at a relatively low angle - -- local isFaceUp = not object.is_face_down - -- local isFaceDown = (object.getRotation()[3] > 160 and object.getRotation()[3] < 200) - local playerCount = COUNTER.getVar('val') - local clueCount = getClueCount(object, object.is_face_down, playerCount) - if clueCount > 0 then - spawnCluesAtLocation(clueCount, collision_info) - end - end +-- set true to enable debug logging +DEBUG = false + +-- we use this to turn off collision handling (for clue spawning) +-- until after load is complete (probably a better way to do this) +COLLISION_ENABLED = false + +-- TODO get the log function from global instead +-- log = Global.call('getLogFunction', this) +function getLogFunction(object) + return function (message) + if DEBUG then + print(message) + end + end +end + +log = getLogFunction(self) + +function onload(save_state) + self.interactable = DEBUG + local dataHelper = getObjectFromGUID('708279') + LOCATIONS = dataHelper.getTable('LOCATIONS_DATA') + + TOKEN_PLAYER_ONE = Global.getTable('tokenplayerone') + COUNTER = getObjectFromGUID('f182ee') + log('attempting to load state: ' .. save_state) + if save_state ~= '' then + SPAWNED_LOCATION_GUIDS = JSON.decode(save_state) + end + + COLLISION_ENABLED = true +end + +function onSave() + local spawned_locations = JSON.encode(SPAWNED_LOCATION_GUIDS) + self.script_state = spawned_locations +end + +--[[ +records locations we have spawned clues for, we write this to the save +file onsave() so we don't spawn clues again after a load +]] +SPAWNED_LOCATION_GUIDS = {} + +function isAlreadySpawned(object) + return SPAWNED_LOCATION_GUIDS[object.getGUID()] ~= nil +end + +function markSpawned(object) + SPAWNED_LOCATION_GUIDS[object.getGUID()] = 1 +end + +function buildKey(object) + return object.getName() .. '_' .. object.getGUID() +end + +-- try the compound key then the name alone as default +function getLocation(object) + return LOCATIONS[buildKey(object)] or LOCATIONS[object.getName()] +end + +function isLocationWithClues(object) + return getLocation(object) ~= nil +end + +--[[ +Return the number of clues to spawn on this location +]] +function getClueCount(object, isFaceDown, playerCount) + if not isLocationWithClues(object) then + error('attempted to get clue for unexpected object: ' .. object.getName()) + end + local details = getLocation(object) + log(object.getName() .. ' : ' .. details['type'] .. ' : ' .. details['value'] .. ' : ' .. details['clueSide']) + if ((isFaceDown and details['clueSide'] == 'back') + or (not isFaceDown and details['clueSide'] == 'front')) then + if details['type'] == 'fixed' then + return details['value'] + elseif details['type'] == 'perPlayer' then + return details['value'] * playerCount + end + error('unexpected location type: ' .. details['type']) + end + return 0 +end + +function spawnToken(position, number) + local obj_parameters = { + position = position, + rotation = {3.87674022, -90, 0.239081308} + } + local custom = { + thickness = 0.1, + stackable = true + } + + if number == '1' or number == '2' then + obj_parameters.type = 'Custom_Token' + custom.merge_distance = 5.0 + local token = spawnObject(obj_parameters) + if number == '1' then + custom.image = TOKEN_PLAYER_ONE.damageone + token.setCustomObject(custom) + token.scale {0.17, 1, 0.17} + return token + end + + if number == '2' then + custom.image = TOKEN_PLAYER_ONE.damagethree + token.setCustomObject(custom) + token.scale {0.18, 1, 0.18} + return token + end + end + + if number == '3' or number == '4' then + obj_parameters.type = 'Custom_Tile' + custom.type = 2 + local token = spawnObject(obj_parameters) + if number == '3' then + custom.image = TOKEN_PLAYER_ONE.clue + custom.image_bottom = TOKEN_PLAYER_ONE.doom + token.setCustomObject(custom) + token.scale {0.25, 1, 0.25} + token.use_snap_points=false + return token + end + + if number == '4' then + custom.image = TOKEN_PLAYER_ONE.doom + custom.image_bottom = TOKEN_PLAYER_ONE.clue + token.setCustomObject(custom) + token.scale {0.25, 1, 0.25} + token.use_snap_points=false + return token + end + end + +end + + +function spawnCluesAtLocation(clueCount, collision_info) + local object = collision_info.collision_object + if isAlreadySpawned(object) then + error('tried to spawn clue for already spawned location:' .. object.getName()) + end + + local obj_parameters = {} + obj_parameters.type = 'Custom_Token' + obj_parameters.position = { + object.getPosition()[1], + object.getPosition()[2] + 1, + object.getPosition()[3] + } + + log('spawning clues for ' .. object.getName() .. '_' .. object.getGUID()) + local playerCount = COUNTER.getVar('val') + log('player count is ' .. playerCount .. ', clue count is ' .. clueCount) + -- mark this location as spawned, can't happen again + markSpawned(object) + i = 0 + while i < clueCount do + if i < 4 then + obj_parameters.position = { + collision_info.collision_object.getPosition()[1] + 0.3, + collision_info.collision_object.getPosition()[2] + 0.2, + collision_info.collision_object.getPosition()[3] - 0.8 + (0.55 * i) + } + elseif i < 8 then + obj_parameters.position = { + collision_info.collision_object.getPosition()[1] + 0.85, + collision_info.collision_object.getPosition()[2] + 0.2, + collision_info.collision_object.getPosition()[3] - 3 + (0.55 * i) + } + else + obj_parameters.position = { + collision_info.collision_object.getPosition()[1] + 0.575, + collision_info.collision_object.getPosition()[2] + 0.4, + collision_info.collision_object.getPosition()[3] - 5.2 + (0.55 * i)} + end + spawnToken(obj_parameters.position, '3') + i = i + 1 + end +end + + +function updateLocations(args) + local custom_data_helper = getObjectFromGUID(args[1]) + data_locations = custom_data_helper.getTable("LOCATIONS_DATA") + for k, v in pairs(data_locations) do + LOCATIONS[k] = v + end +end + +function onCollisionEnter(collision_info) + -- short circuit all collision stuff until we've loaded state + if not COLLISION_ENABLED then + return + end + + -- check if we should spawn clues here + local object = collision_info.collision_object + if isLocationWithClues(object) and not isAlreadySpawned(object) then + -- this isn't an either/or as down/up here means at a relatively low angle + -- local isFaceUp = not object.is_face_down + -- local isFaceDown = (object.getRotation()[3] > 160 and object.getRotation()[3] < 200) + local playerCount = COUNTER.getVar('val') + local clueCount = getClueCount(object, object.is_face_down, playerCount) + if clueCount > 0 then + spawnCluesAtLocation(clueCount, collision_info) + end + end end \ No newline at end of file diff --git a/unpacked/Custom_Token Resources 4406f0.ttslua b/unpacked/Custom_Token Resources 4406f0.ttslua index df6f93a6c..167a90f72 100644 --- a/unpacked/Custom_Token Resources 4406f0.ttslua +++ b/unpacked/Custom_Token Resources 4406f0.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Resources 816d84.ttslua b/unpacked/Custom_Token Resources 816d84.ttslua index df6f93a6c..167a90f72 100644 --- a/unpacked/Custom_Token Resources 816d84.ttslua +++ b/unpacked/Custom_Token Resources 816d84.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Resources a4b60d.ttslua b/unpacked/Custom_Token Resources a4b60d.ttslua index df6f93a6c..167a90f72 100644 --- a/unpacked/Custom_Token Resources a4b60d.ttslua +++ b/unpacked/Custom_Token Resources a4b60d.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Resources cd15ac.ttslua b/unpacked/Custom_Token Resources cd15ac.ttslua index df6f93a6c..167a90f72 100644 --- a/unpacked/Custom_Token Resources cd15ac.ttslua +++ b/unpacked/Custom_Token Resources cd15ac.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} - - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Deck a9ec03.yaml b/unpacked/Deck a9ec03.yaml new file mode 100644 index 000000000..5546e1289 --- /dev/null +++ b/unpacked/Deck a9ec03.yaml @@ -0,0 +1,230 @@ +Autoraise: true +ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 +ContainedObjects: +- Autoraise: true + CardID: 232101 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 3a726b + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Radiant Smite (1) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -57.50919 + posY: 1.318617 + posZ: -55.11375 + rotX: 0.0204711445 + rotY: 269.975555 + rotZ: 359.167847 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232109 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 45956a + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Third Time's a Charm (2) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -54.1472931 + posY: 1.32081819 + posZ: -56.4576759 + rotX: 359.362946 + rotY: 270.0039 + rotZ: 0.016700631 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232110 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 5606b3 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Manipulate Destiny (2) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -52.43668 + posY: 1.32814741 + posZ: -56.69904 + rotX: 359.109467 + rotY: 269.948425 + rotZ: 0.0173508562 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +- Autoraise: true + CardID: 232103 + ColorDiffuse: + b: 0.713235259 + g: 0.713235259 + r: 0.713235259 + CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false + Description: '' + DragSelectable: true + GMNotes: '' + GUID: b7c316 + Grid: true + GridProjection: false + Hands: true + HideWhenFaceDown: true + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Card + Nickname: Gaze of Ouraxsh (2) + SidewaysCard: false + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: -56.51689 + posY: 1.30222857 + posZ: -56.9502449 + rotX: 0.0208073277 + rotY: 270.0046 + rotZ: 0.0167730115 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +CustomDeck: + '2321': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg + FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599718154987334/4172D1B2D66D728529C6C37B43EA39E1BA7A9157/ + NumHeight: 5 + NumWidth: 5 + Type: 0 + UniqueBack: false +DeckIDs: +- 232101 +- 232109 +- 232110 +- 232103 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a9ec03 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: true +IgnoreFoW: false +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Deck +Nickname: '' +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 77.76 + posY: 1.28 + posZ: -0.9 + rotX: 359.98 + rotY: 180.01 + rotZ: 180.01 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' diff --git a/unpacked/Notecard Arkham SCE 1.51 - 1172020 - Page 1 094d4d.yaml b/unpacked/Notecard Arkham SCE 1.51 - 1172020 - Page 1 094d4d.yaml deleted file mode 100644 index 08021da7e..000000000 --- a/unpacked/Notecard Arkham SCE 1.51 - 1172020 - Page 1 094d4d.yaml +++ /dev/null @@ -1,202 +0,0 @@ -Autoraise: true -ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 -Description: 'Added In Too Deep. Thank you to cafin8d for providing excellent scans - once again! - - - Added Gloria Goldberg, the new promo investigator! - - - Fixed issue with the Side Missions box. Auto layout has been re-enabled. - - - ' -DragSelectable: true -GMNotes: '' -GUID: 094d4d -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -Locked: false -LuaScript: '' -LuaScriptState: '' -MeasureMovement: false -Name: Notecard -Nickname: Arkham SCE 1.51 - 11/7/2020 - Page 1 -Snap: true -States: - '2': - Autoraise: true - ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 - Description: 'Added new previewed cards from Horror in High Gear to the leaks - box. - - - Fixed missing location connector in Undimensioned and Unseen. - - - Added in Tikatoy''s Upkeep Button! Now all player mats have a button that draws - a card (up to 5 for Patrice) and gains a resource (2 for Jenny).' - DragSelectable: true - GMNotes: '' - GUID: dee2a5 - Grid: true - GridProjection: false - Hands: false - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Notecard - Nickname: Arkham SCE 1.51 - 11/7/2020 - Page 2 - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 18.5248127 - posY: 1.52305555 - posZ: -8.925274 - rotX: 0.07987905 - rotY: 89.99975 - rotZ: 359.983124 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' - '3': - Autoraise: true - ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 - Description: "Also added in Tikatoy's Depths of Yoth setup tool. It appears in\ - \ the scenario's setup, and automates most of the generation of each level.\r\ - \n\nAdded in tadgh's chaos bag stat tracker. This tracks chaos tokens pulled\ - \ by each player, though it only tracks them if they actually land on the player\ - \ mat.\r" - DragSelectable: true - GMNotes: '' - GUID: bda909 - Grid: true - GridProjection: false - Hands: false - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Notecard - Nickname: Arkham SCE 1.51 - 11/7/2020 - Page 3 - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 18.5248165 - posY: 1.52305579 - posZ: -8.925277 - rotX: 0.07987877 - rotY: 89.99973 - rotZ: 359.983124 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' - '4': - Autoraise: true - ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 - Description: "Added Maximillion Pegasus, a new fan-made investigator by Game!\n\ - \nAdded two new tablets to the rules/tablets gun. One shows off B\xF4L's collection\ - \ of custom playmat images. The other shows off Mysterious Chanting, a blog\ - \ for Arkham custom content." - DragSelectable: true - GMNotes: '' - GUID: 1fa260 - Grid: true - GridProjection: false - Hands: false - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Notecard - Nickname: Arkham SCE 1.51 - 11/7/2020 - Page 4 - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 18.52482 - posY: 1.52305555 - posZ: -8.925279 - rotX: 0.07987883 - rotY: 89.99972 - rotZ: 359.983124 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' - '5': - Autoraise: true - ColorDiffuse: - b: 1.0 - g: 1.0 - r: 1.0 - Description: "Set default resources count to 5 for each player.\r\n\r\nAt long\ - \ last, set hands to hidden by default.\n\nThank you to everyone for your patience\ - \ and for the feedback, scans, and content!" - DragSelectable: true - GMNotes: '' - GUID: 81727f - Grid: true - GridProjection: false - Hands: false - HideWhenFaceDown: false - IgnoreFoW: false - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Notecard - Nickname: Arkham SCE 1.51 - 11/7/2020 - Page 5 - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: 18.5248241 - posY: 1.52305555 - posZ: -8.925282 - rotX: 0.0798775256 - rotY: 89.9997 - rotZ: 359.983124 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 - XmlUI: '' -Sticky: true -Tooltip: true -Transform: - posX: 23.75 - posY: 1.51 - posZ: -13.13 - rotX: 0.08 - rotY: 90.0 - rotZ: 359.98 - scaleX: 1.0 - scaleY: 1.0 - scaleZ: 1.0 -XmlUI: '' diff --git a/unpacked/Notecard Arkham SCE 1.52 - 1252020 - Page 1 af01b8.yaml b/unpacked/Notecard Arkham SCE 1.52 - 1252020 - Page 1 af01b8.yaml new file mode 100644 index 000000000..08648d823 --- /dev/null +++ b/unpacked/Notecard Arkham SCE 1.52 - 1252020 - Page 1 af01b8.yaml @@ -0,0 +1,329 @@ +Autoraise: true +ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 +Description: 'Added both War of the Outer Gods and Devil Reef in watermarked form. Due + to delays in getting high quality scans, the card and insert quality may be somewhat + inconsistent. However, they are fully playable! + + + When high quality assets come in, they will be updated to look nicer.' +DragSelectable: true +GMNotes: '' +GUID: af01b8 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Notecard +Nickname: Arkham SCE 1.52 - 12/5/2020 - Page 1 +Snap: true +States: + '2': + Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + Description: 'Added Parallel Agnes, along with her Advanced signature cards and + her new Challenge Scenario, Bad Blood. + + + Adjusted the cover art for the previous Challenge Scenario Read or Die. (All + or Nothing will get an adjusted cover in a later update.)' + DragSelectable: true + GMNotes: '' + GUID: 90716d + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Notecard + Nickname: Arkham SCE 1.52 - 12/5/2020 - Page 2 + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 3.66509557 + posY: 1.569999 + posZ: -40.943985 + rotX: 2.915299e-06 + rotY: 89.99949 + rotZ: 1.959072e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '3': + Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + Description: 'Updated the ArkhamDB Deck Importer to RhialtoTheMarvellous''s Stackless + version. No more loading a thousand-card deck in order to import anything! + + + Added in Mint Tea Fan''s Artifact Expansion! This adds new custom investigators, + player cards, and a new Artifact mechanic!' + DragSelectable: true + GMNotes: '' + GUID: 81101e + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Notecard + Nickname: Arkham SCE 1.52 - 12/5/2020 - Page 3 + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 3.66509557 + posY: 1.56999981 + posZ: -40.943985 + rotX: 3.46577986e-06 + rotY: 89.99949 + rotZ: 2.2656508e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '4': + Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + Description: 'Updated Tikatoy''s Upkeep Button to version 3.0. It now flips actions + tokens faceup (so long as their description says "Action token"). + + + Added Tikatoy''s Atlach-Nacha helper and the Last King helper! They can be + found in the appropriate scenarios: Weaver of the Cosmos, Carnevale of Spiders, + The Last King, Return to The Last King' + DragSelectable: true + GMNotes: '' + GUID: 094d4d + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Notecard + Nickname: Arkham SCE 1.52 - 12/5/2020 - Page 4 + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 3.66509557 + posY: 1.56999993 + posZ: -40.943985 + rotX: 2.682043e-06 + rotY: 89.99949 + rotZ: -6.220122e-06 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '5': + Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + Description: "Updated Gloria Goldberg, Parallel Daisy, and Parallel Skids to work\ + \ properly with the Upkeep button. \n\nThe In Too Deep Key Bag now has its keys\ + \ facedown.\n\nThe Vanishing of Elina Harper now has a standalone Chaos Bag\ + \ setup." + DragSelectable: true + GMNotes: '' + GUID: 14f29c + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Notecard + Nickname: Arkham SCE 1.52 - 12/5/2020 - Page 5 + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 3.66509557 + posY: 1.56999993 + posZ: -40.943985 + rotX: 3.153029e-06 + rotY: 89.99949 + rotZ: -3.552189e-06 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '6': + Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + Description: 'Rotated Bless and Curse Token bags 15 degrees. No maddening geometry + here! + + + Adjusted setup of Labyrinths of Lunacy so that group bags aren''t sucked into + other side missions. + + + Dr. Milan Christopher''s name is now spelled correctly.' + DragSelectable: true + GMNotes: '' + GUID: 101d31 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Notecard + Nickname: Arkham SCE 1.52 - 12/5/2020 - Page 6 + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 3.66509557 + posY: 1.56999993 + posZ: -40.943985 + rotX: 4.07798962e-06 + rotY: 89.99949 + rotZ: 6.586366e-07 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '7': + Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + Description: 'Fixed Return to TFA Basic Weaknesses using watermarked scans in + certain locations. + + + Fixed Deck Importer sometimes giving Advanced versions of signature cards when + it shouldn''t. + + + Fixed the card backs of the Carnevale of Horrors masks using the wrong image.' + DragSelectable: true + GMNotes: '' + GUID: 20220d + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Notecard + Nickname: Arkham SCE 1.52 - 12/5/2020 - Page 7 + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 3.66509581 + posY: 1.56999993 + posZ: -40.943985 + rotX: -5.90769059e-06 + rotY: 89.99949 + rotZ: 1.726151e-05 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' + '8': + Autoraise: true + ColorDiffuse: + b: 1.0 + g: 1.0 + r: 1.0 + Description: 'Added two new previewed cards for A Light in the Fog to the Leaked + card box. + + + Updated scenario guide for The Blob that Ate Everything to use FFG''s official + rules pdf. + + + Super special thanks to bluehg, for providing photos of missing components, + allowing for this watermarked release to arrive when it did!' + DragSelectable: true + GMNotes: '' + GUID: '664129' + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Notecard + Nickname: Arkham SCE 1.52 - 12/5/2020 - Page 8 + Snap: true + Sticky: true + Tooltip: true + Transform: + posX: 3.66509581 + posY: 1.57 + posZ: -40.943985 + rotX: -5.157345e-06 + rotY: 89.99949 + rotZ: -6.4027e-06 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: 23.75 + posY: 1.51 + posZ: -13.13 + rotX: 0.08 + rotY: 90.0 + rotZ: 359.98 + scaleX: 1.0 + scaleY: 1.0 + scaleZ: 1.0 +XmlUI: '' From 815e590fa44a20041439739b518ec1eb31c63281 Mon Sep 17 00:00:00 2001 From: Adam Goldsmith Date: Sun, 6 Dec 2020 09:42:32 -0500 Subject: [PATCH 2/2] Convert to unix line endings again --- unpacked.ttslua | 1484 +++---- unpacked/Custom_Model 032300.ttslua | 224 +- unpacked/Custom_Model 1769ed.ttslua | 224 +- unpacked/Custom_Model 37be78.ttslua | 224 +- unpacked/Custom_Model d86b7c.ttslua | 224 +- ...tom_Model Custom Data Helper c0b834.ttslua | 70 +- ...Model_Bag Artifact Expansion b43c9c.ttslua | 1004 ++--- .../Bag Artifact Deck Setup 4285a6.ttslua | 546 +-- .../Custom_Model_Bag Agatha ced1e0.ttslua | 36 +- .../Custom_Model_Bag Daniela b9fc9d.ttslua | 36 +- .../Custom_Model_Bag Darrell c3e12f.ttslua | 36 +- .../Custom_Model_Bag Jack 2bff9c.ttslua | 36 +- .../Custom_Model_Bag Kate e3a45e.ttslua | 36 +- .../Custom_Model_Bag Chaos Bag fea079.ttslua | 8 +- ...del_Bag Clue Counter Swapper d919d6.ttslua | 544 +-- .../Custom_Token Doom counter 19768a.ttslua | 262 +- .../Custom_Token Resources 3f22e5.ttslua | 260 +- .../Custom_Token Resources 4111de.ttslua | 260 +- .../Custom_Token Resources 891403.ttslua | 260 +- .../Custom_Token Resources db85d6.ttslua | 260 +- ...ergence Custom Investigators 84be1d.ttslua | 1004 ++--- ...Gender Swapped Investigators 33272e.ttslua | 1004 ++--- ...houghts Custom Investigators 991ff9.ttslua | 1004 ++--- ...vestigators and Player Cards 54bd65.ttslua | 1004 ++--- ...stom_Model_Bag Investigators fba392.ttslua | 1006 ++--- ...ustom_Model_Bag Player Cards 64ad17.ttslua | 1006 ++--- ... Pegasus Custom Investigator 84be1d.ttslua | 1004 ++--- ...Edition Custom Investigators 1fb7ce.ttslua | 1004 ++--- ...e Aeons Custom Investigators 991ff9.ttslua | 1004 ++--- unpacked/Custom_Model_Bag Core 2585f4.ttslua | 1004 ++--- unpacked/Custom_Model_Bag Core 64a613.ttslua | 1004 ++--- ...om_Model_Bag 1 The Gathering 667111.ttslua | 546 +-- .../Custom_Tile Core Difficulty 92d5f1.ttslua | 40 +- ...del_Bag 2 The Midnight Masks c38c96.ttslua | 546 +-- .../Custom_Tile Core Set 8112ff.ttslua | 40 +- ...del_Bag 3 The Devourer Below 2130f0.ttslua | 546 +-- ...stom_Tile The Devourer Below 37feeb.ttslua | 40 +- ...t of the Zealot Campaign Log e0c3e7.ttslua | 1356 +++--- ...oken Scenario - EasyStandard b7af99.ttslua | 262 +- ...oken Scenario - EasyStandard e19c97.ttslua | 262 +- ...oken Scenario - EasyStandard 535979.ttslua | 262 +- ..._Token Scenario - HardExpert 9ed124.ttslua | 262 +- .../Custom_Token Scenario 2da146.ttslua | 262 +- .../Custom_Token Scenario dd61f1.ttslua | 262 +- .../Custom_Model_Bag Guardian 1d802b.ttslua | 1004 ++--- .../Custom_Model_Bag Guardian 626787.ttslua | 1004 ++--- .../Custom_Model_Bag Guardian cd002a.ttslua | 1004 ++--- .../Custom_Model_Bag Guardian 7d3988.ttslua | 1004 ++--- .../Custom_Model_Bag Mystic 6117a1.ttslua | 1004 ++--- .../Custom_Model_Bag Mystic eca770.ttslua | 1004 ++--- .../Custom_Model_Bag Mystic b4d9bf.ttslua | 1004 ++--- .../Custom_Model_Bag Mystic 17e533.ttslua | 1004 ++--- .../Custom_Model_Bag Neutral a4d0e8.ttslua | 1004 ++--- .../Custom_Model_Bag Neutral 06b03b.ttslua | 1004 ++--- .../Custom_Model_Bag Neutral aef7dd.ttslua | 1004 ++--- .../Custom_Model_Bag Neutral 3559eb.ttslua | 1004 ++--- .../Custom_Model_Bag Neutral c5261f.ttslua | 1004 ++--- .../Custom_Model_Bag Neutral 3fe354.ttslua | 1004 ++--- ...odel_Bag Promo Investigators 5fe24e.ttslua | 1004 ++--- ...Return to The Dunwich Legacy ce9130.ttslua | 1006 ++--- ... 1a Extracurricular Activity d33f7e.ttslua | 1006 ++--- ...stom_Tile The Dunwich Legacy a74352.ttslua | 42 +- ...Bag 1b The House Always Wins f52082.ttslua | 1006 ++--- ...stom_Tile The Dunwich Legacy 1d6227.ttslua | 42 +- ..._Bag 2 The Miskatonic Museum 87897a.ttslua | 1006 ++--- ...m_Tile The Miskatonic Museum 4b5e17.ttslua | 50 +- ...g 3 The Essex County Express d92b86.ttslua | 1006 ++--- ...ile The Essex County Express 247967.ttslua | 50 +- ...del_Bag 4 Blood on the Altar 1536e7.ttslua | 1006 ++--- ...stom_Tile Blood on the Altar 92b54a.ttslua | 50 +- ...g 5 Undimensioned and Unseen a82dde.ttslua | 1006 ++--- ...ile Undimensioned and Unseen 393c71.ttslua | 50 +- ...odel_Bag 6 Where Doom Awaits 175a29.ttslua | 1006 ++--- ...ustom_Tile Where Doom Awaits a621ae.ttslua | 50 +- ...Bag 7 Lost in Time and Space 1fca6b.ttslua | 1006 ++--- ..._Tile Lost in Time and Space 64a607.ttslua | 50 +- ... Dunwich Legacy Campaign Log 3f6ab6.ttslua | 1338 +++--- ... Return to The Forgotten Age 479ff3.ttslua | 1006 ++--- ... Return to The Untamed Wilds 85a0c2.ttslua | 1004 ++--- ...ustom_Tile The Forgotten Age e95200.ttslua | 40 +- ... Return to The Doom of Eztli 110ce2.ttslua | 1004 ++--- ...ustom_Tile The Doom of Eztli 294ec4.ttslua | 48 +- ... 3 Return to Threads of Fate 499940.ttslua | 1004 ++--- .../Custom_Tile Threads of Fate 7a95f6.ttslua | 48 +- ...eturn to The Boundary Beyond 952af4.ttslua | 1004 ++--- ...tom_Tile The Boundary Beyond 010761.ttslua | 48 +- ...o Heart of the Elders Part 1 5abc8f.ttslua | 1004 ++--- ...tom_Tile Heart of the Elders 493cb1.ttslua | 48 +- ...o Heart of the Elders Part 2 3ccabf.ttslua | 1004 ++--- ...turn to The City of Archives e73427.ttslua | 1004 ++--- ...om_Tile The City of Archives 2fb6dc.ttslua | 48 +- ...Return to The Depths of Yoth 9c986e.ttslua | 1004 ++--- ...stom_Tile The Depths of Yoth 7aa4e3.ttslua | 48 +- ...oken Scenario - EasyStandard dd61f1.ttslua | 262 +- ..._Token Scenario - HardExpert 2da146.ttslua | 262 +- ... 8 Return to Shattered Aeons 5e83e7.ttslua | 1004 ++--- .../Custom_Tile Shattered Aeons 6dc72a.ttslua | 42 +- ... 9 Return to Secret Scenario 496395.ttslua | 1004 ++--- ...e Forgotten Age Campaign Log 48b154.ttslua | 1380 +++---- ...eturn to The Path to Carcosa e9889a.ttslua | 1006 ++--- ...tom_Model_Bag 1 Curtain Call 83ccd4.ttslua | 1006 ++--- ...tom_Tile The Path to Carcosa 16562e.ttslua | 42 +- ...om_Model_Bag 2 The Last King 6730a1.ttslua | 1006 ++--- .../Custom_Tile The Last King 857d0d.ttslua | 48 +- ...del_Bag 3 Echoes of the Past 42d2dc.ttslua | 1006 ++--- ...stom_Tile Echoes of the Past 452210.ttslua | 50 +- ...l_Bag 4 The Unspeakable Oath e7efa6.ttslua | 1006 ++--- ...om_Tile The Unspeakable Oath 87f45e.ttslua | 50 +- ...del_Bag 5 A Phantom of Truth bd4167.ttslua | 1006 ++--- ...stom_Tile A Phantom of Truth b20b8d.ttslua | 50 +- ..._Model_Bag 6 The Pallid Mask eb48ff.ttslua | 1006 ++--- .../Custom_Tile The Pallid Mask bb070d.ttslua | 50 +- ...Model_Bag 7 Black Stars Rise dd8b0d.ttslua | 1006 ++--- .../Bag Setup Bag b29b71.ttslua | 546 +-- .../Bag Setup Bag d14543.ttslua | 546 +-- ...Custom_Tile Black Stars Rise 20c21d.ttslua | 50 +- ...stom_Model_Bag 8 Dim Carcosa ce5d30.ttslua | 1006 ++--- .../Custom_Tile Dim Carcosa 9afdfd.ttslua | 50 +- ...om_Tile Carcosa Campaign Log ae8317.ttslua | 1510 +++---- ...n to the Night of the Zealot 56270d.ttslua | 1006 ++--- ...ag 1 Return to The Gathering 41ebd8.ttslua | 546 +-- .../Custom_Tile Core Difficulty 527f29.ttslua | 40 +- ...Return to The Midnight Masks bcc86c.ttslua | 546 +-- .../Custom_Tile Core Difficulty 47f3de.ttslua | 40 +- ...Return to The Devourer Below 604753.ttslua | 546 +-- ...t of the Zealot Campaign Log e0c3e7.ttslua | 1356 +++--- unpacked/Custom_Model_Bag Rogue 68d7b8.ttslua | 1004 ++--- .../Custom_Model_Bag Rogue 21d547.ttslua | 1004 ++--- unpacked/Custom_Model_Bag Rogue deaa6d.ttslua | 1004 ++--- .../Custom_Model_Bag Rogue 6c6b22.ttslua | 1004 ++--- .../Custom_Model_Bag Seeker 1e7fc5.ttslua | 1004 ++--- .../Custom_Model_Bag Seeker d257cb.ttslua | 1004 ++--- .../Custom_Model_Bag Seeker 5ec2fb.ttslua | 1004 ++--- .../Custom_Model_Bag Seeker b2264c.ttslua | 1004 ++--- ...g Starter Deck Investigators 35fb9c.ttslua | 1004 ++--- .../Custom_Model_Bag Survivor 9c814b.ttslua | 1004 ++--- .../Custom_Model_Bag Survivor 3c40d9.ttslua | 1004 ++--- .../Custom_Model_Bag Survivor c02830.ttslua | 1004 ++--- .../Custom_Model_Bag Survivor 6e9c37.ttslua | 1004 ++--- ..._Model_Bag The Circle Undone 0dcbe8.ttslua | 1004 ++--- ..._Model_Bag The Circle Undone 63e097.ttslua | 1004 ++--- ...odel_Bag 1 The Witching Hour 67a775.ttslua | 544 +-- ...ustom_Tile The Circle Undone f697b0.ttslua | 42 +- ...el_Bag 2 At Death's Doorstep 7388bc.ttslua | 546 +-- ...tom_Tile At Death's Doorstep b21125.ttslua | 46 +- ..._Model_Bag 3 The Secret Name 5c79d0.ttslua | 544 +-- .../Custom_Tile The Secret Name b21125.ttslua | 46 +- ...Model_Bag 4 The Wages of Sin 1e45e8.ttslua | 544 +-- ...Custom_Tile The Wages of Sin b21125.ttslua | 46 +- ...l_Bag 5 For the Greater Good a61b48.ttslua | 544 +-- .../Bag Member of the Lodge 38a5f7.ttslua | 546 +-- ...ag Not a Member of the Lodge abe15f.ttslua | 546 +-- ...om_Tile For the Greater Good bbb70a.ttslua | 48 +- ..._Bag 6 Union and Disillusion 20f70a.ttslua | 544 +-- ...m_Tile Union and Disillusion 3fe126.ttslua | 48 +- ...g 7 In the Clutches of Chaos 1ee775.ttslua | 546 +-- ...te Mason is posessed by evil d14543.ttslua | 546 +-- ... the secrets of the universe 92c6fc.ttslua | 546 +-- ...ile In the Clutches of Chaos e0709b.ttslua | 48 +- ...ag 8 Before the Black Throne 0fad66.ttslua | 546 +-- ...Tile Before the Black Throne b16392.ttslua | 48 +- ...rance at the Twilight Estate 2f008a.ttslua | 546 +-- ...ustom_Tile The Circle Undone 05f912.ttslua | 42 +- ...Circle Undone Campaign Log 1 44a05a.ttslua | 1304 +++--- ...m_Model_Bag The Dream-Eaters a16a1a.ttslua | 1004 ++--- ...-A Beyond the Gates of Sleep 7f5828.ttslua | 546 +-- ...Custom_Tile Campaign A Setup 075016.ttslua | 50 +- ...del_Bag 1-B Waking Nightmare 599cb7.ttslua | 544 +-- ...om_Model_Bag Infestation Bag 0257a2.ttslua | 8 +- ...Custom_Tile Campaign B Setup bbb70a.ttslua | 50 +- ...ag 2-A The Search For Kadath 7b07ca.ttslua | 544 +-- ...m_Tile The Search For Kadath bbb70a.ttslua | 50 +- ... A Thousand Shapes of Horror 1b4f86.ttslua | 544 +-- ... A Thousand Shapes of Horror b53295.ttslua | 50 +- ...ag 3-A Dark Side of the Moon 0fad66.ttslua | 544 +-- ...m_Tile Dark Side of the Moon aa8d82.ttslua | 50 +- ...l_Bag 3-B Point of No Return 4f81cf.ttslua | 544 +-- ...stom_Tile Point of No Return f302ab.ttslua | 50 +- ...Bag 4-A Where the Gods Dwell 185096.ttslua | 544 +-- ...stom_Tile Point of No Return 3e86c2.ttslua | 50 +- ...Bag 4-B Weaver of the Cosmos e14c76.ttslua | 546 +-- .../Bag Atlach-Nacha f0a43a.ttslua | 546 +-- ...om_Tile Weaver of the Cosmos bbb70a.ttslua | 48 +- ...The Dream-Quest Campaign Log f40183.ttslua | 1442 +++---- ...m_Model_Bag The Dream-Eaters a34f34.ttslua | 1004 ++--- ...Model_Bag The Dunwich Legacy 2898f6.ttslua | 1004 ++--- ... 1a Extracurricular Activity 51c0d9.ttslua | 1006 ++--- ...stom_Tile The Dunwich Legacy f5db25.ttslua | 42 +- ...Bag 1b The House Always Wins e3aa5c.ttslua | 1006 ++--- ...stom_Tile The Dunwich Legacy b5928a.ttslua | 42 +- ..._Bag 2 The Miskatonic Museum 87adbf.ttslua | 1006 ++--- ...m_Tile The Miskatonic Museum 703373.ttslua | 50 +- ...g 3 The Essex County Express d6e449.ttslua | 1006 ++--- ...ile The Essex County Express 247967.ttslua | 50 +- ...del_Bag 4 Blood on the Altar 30684d.ttslua | 1006 ++--- ...stom_Tile Blood on the Altar 92b54a.ttslua | 50 +- ...g 5 Undimensioned and Unseen afe7ce.ttslua | 1006 ++--- ...ile Undimensioned and Unseen 393c71.ttslua | 50 +- ...odel_Bag 6 Where Doom Awaits 022ddf.ttslua | 1006 ++--- ...ustom_Tile Where Doom Awaits a621ae.ttslua | 50 +- ...Bag 7 Lost in Time and Space 684060.ttslua | 1006 ++--- ..._Tile Lost in Time and Space 64a607.ttslua | 50 +- ... Dunwich Legacy Campaign Log 3f6ab6.ttslua | 1338 +++--- ...Model_Bag The Dunwich Legacy 5889dd.ttslua | 1004 ++--- ..._Model_Bag The Forgotten Age 03b888.ttslua | 1004 ++--- ..._Model_Bag The Forgotten Age 0bcf19.ttslua | 1004 ++--- ...odel_Bag 1 The Untamed Wilds e90956.ttslua | 1004 ++--- ...ustom_Tile The Forgotten Age e95200.ttslua | 40 +- ...odel_Bag 2 The Doom of Eztli 065ce1.ttslua | 1004 ++--- ...ustom_Tile The Doom of Eztli 294ec4.ttslua | 48 +- ..._Model_Bag 3 Threads of Fate 11f5c8.ttslua | 1004 ++--- .../Custom_Tile Threads of Fate 7a95f6.ttslua | 48 +- ...el_Bag 4 The Boundary Beyond 0ec59f.ttslua | 1004 ++--- ...tom_Tile The Boundary Beyond 010761.ttslua | 48 +- ...5 Heart of the Elders Part 1 2bfe00.ttslua | 1004 ++--- ...tom_Tile Heart of the Elders 493cb1.ttslua | 48 +- ...5 Heart of the Elders Part 2 5b2403.ttslua | 1004 ++--- ...l_Bag 6 The City of Archives 3170ce.ttslua | 1004 ++--- ...om_Tile The City of Archives 2fb6dc.ttslua | 48 +- ...del_Bag 7 The Depths of Yoth 85286a.ttslua | 1004 ++--- ...stom_Tile The Depths of Yoth 7aa4e3.ttslua | 48 +- ...oken Scenario - EasyStandard dd61f1.ttslua | 262 +- ..._Token Scenario - HardExpert 2da146.ttslua | 262 +- ..._Model_Bag 8 Shattered Aeons 737c5d.ttslua | 1004 ++--- .../Custom_Tile Shattered Aeons 6dc72a.ttslua | 42 +- ..._Model_Bag 9 Secret Scenario c52079.ttslua | 1004 ++--- ...e Forgotten Age Campaign Log 48b154.ttslua | 1380 +++---- ...Bag The Innsmouth Conspiracy 10bd18.ttslua | 1004 ++--- ...Bag The Innsmouth Conspiracy 465aab.ttslua | 1004 ++--- ...del_Bag 1 The Pit of Despair c09838.ttslua | 1006 ++--- ...ile The Innsmouth Conspiracy 16562e.ttslua | 42 +- ...he Vanishing of Elina Harper 8c6d05.ttslua | 1006 ++--- ...he Vanishing of Elina Harper 16562e.ttslua | 48 +- ...stom_Model_Bag 3 In Too Deep c3a225.ttslua | 1006 ++--- .../Custom_Tile In Too Deep bbb70a.ttslua | 50 +- ...ustom_Model_Bag 4 Devil Reef 7ced47.ttslua | 1006 ++--- .../Custom_Tile Devil Reef edc524.ttslua | 50 +- ...outh Conspiracy Campaign Log f40183.ttslua | 1336 +++--- ...odel_Bag The Path to Carcosa 899c3a.ttslua | 1004 ++--- ...odel_Bag The Path to Carcosa aca04c.ttslua | 1004 ++--- ...tom_Model_Bag 1 Curtain Call 83ccd4.ttslua | 1006 ++--- ...tom_Tile The Path to Carcosa 16562e.ttslua | 42 +- ...om_Model_Bag 2 The Last King 6730a1.ttslua | 1006 ++--- .../Custom_Tile The Last King 857d0d.ttslua | 48 +- ...del_Bag 3 Echoes of the Past 42d2dc.ttslua | 1006 ++--- ...stom_Tile Echoes of the Past 452210.ttslua | 50 +- ...l_Bag 4 The Unspeakable Oath e7efa6.ttslua | 1006 ++--- ...om_Tile The Unspeakable Oath 87f45e.ttslua | 50 +- ...del_Bag 5 A Phantom of Truth bd4167.ttslua | 1006 ++--- ...stom_Tile A Phantom of Truth b20b8d.ttslua | 50 +- ..._Model_Bag 6 The Pallid Mask eb48ff.ttslua | 1006 ++--- .../Custom_Tile The Pallid Mask bb070d.ttslua | 50 +- ...Model_Bag 7 Black Stars Rise dd8b0d.ttslua | 1006 ++--- .../Bag Setup Bag b29b71.ttslua | 546 +-- .../Bag Setup Bag d14543.ttslua | 546 +-- ...Custom_Tile Black Stars Rise 20c21d.ttslua | 50 +- ...stom_Model_Bag 8 Dim Carcosa ce5d30.ttslua | 1006 ++--- .../Custom_Tile Dim Carcosa 9afdfd.ttslua | 50 +- ...om_Tile Carcosa Campaign Log ae8317.ttslua | 1510 +++---- ..._Model_Bag The Side Missions 2d16e1.ttslua | 1004 ++--- ...odel_Bag Against the Wendigo 4d5fa0.ttslua | 546 +-- ...tom_Tile Against the Wendigo 82e1ed.ttslua | 40 +- ...odel_Bag Alice in Wonderland 39916d.ttslua | 1006 ++--- ...l_Bag 1 Arkham in Wonderland 18aa54.ttslua | 544 +-- ...el_Bag 2-A A Sea of Troubles 952572.ttslua | 544 +-- ..._Bag 2-B Tempest in a Teapot 8d88c8.ttslua | 544 +-- ...odel_Bag 2-C Bleeding Hearts 8eb793.ttslua | 544 +-- ...del_Bag 2-D Wild Snark Chase 9e33a0.ttslua | 544 +-- ...odel_Bag 2-E Sibling Rivalry 0916b6.ttslua | 544 +-- ...om_Model_Bag 2-F Fool's Mate bd556e.ttslua | 544 +-- ..._Model_Bag 3 Lucid Nightmare e6bb63.ttslua | 544 +-- ...tom_Tile Alice in Wonderland b5928a.ttslua | 42 +- ...e in Wonderland Campaign Log eda22b.ttslua | 1302 +++--- ...tom_Model_Bag All or Nothing 72ab92.ttslua | 1006 ++--- .../Bag With Return Set 083fc2.ttslua | 546 +-- .../Bag Without Return Set d14543.ttslua | 546 +-- .../Custom_Tile All or Nothing 7c8eef.ttslua | 42 +- .../Custom_Model_Bag Bad Blood cc7eb3.ttslua | 1006 ++--- .../Custom_Tile Bad Blood 510265.ttslua | 42 +- ...l_Bag Blood Spilled in Salem 4237da.ttslua | 546 +-- ..._Tile Blood Spilled in Salem 83b781.ttslua | 40 +- ...om_Model_Bag Bridge of Sighs 578e97.ttslua | 546 +-- .../Custom_Tile Bridge of Sighs 2d9794.ttslua | 40 +- ...del_Bag Carnevale of Horrors 23dd51.ttslua | 1006 ++--- ...om_Tile Carnevale of Horrors a5891b.ttslua | 26 +- ...del_Bag Carnevale of Spiders e57017.ttslua | 546 +-- .../Bag Atlach-Nacha 3d83ce.ttslua | 546 +-- ...om_Tile Carnevale of Spiders a5891b.ttslua | 26 +- ...rnation on the Constellation 0ec730.ttslua | 546 +-- .../Bag Additional locations d14543.ttslua | 546 +-- ...rnation on the Constellation bbb70a.ttslua | 50 +- ...el_Bag Curse of the Rougarou db7039.ttslua | 1006 ++--- .../Bag Locations 73e53d.ttslua | 10 +- ...m_Tile Curse of the Rougarou cf0c00.ttslua | 26 +- ...Custom_Model_Bag Dark Matter 7458b7.ttslua | 1006 ++--- ...rk Matter Custom Data Helper a57738.ttslua | 166 +- ...Model_Bag Electric Nightmare 2bd90b.ttslua | 1006 ++--- ...odel_Bag Fragment of Carcosa a492bc.ttslua | 1006 ++--- ...l_Bag In the Shadow of Earth 8cfe99.ttslua | 1006 ++--- ...ustom_Model_Bag Lost Quantum c29a78.ttslua | 1006 ++--- .../Custom_Model_Bag Starfall e04c21.ttslua | 1006 ++--- ...stom_Model_Bag Strange Moons 2ebcda.ttslua | 1006 ++--- ...el_Bag The Machine in Yellow 32039e.ttslua | 1006 ++--- ..._Model_Bag The Tatteremalion 51fbbc.ttslua | 1006 ++--- .../Custom_Tile 0aa185.ttslua | 1472 +++---- .../Custom_Tile Dark Matter b5928a.ttslua | 42 +- .../Custom_Token Memories 13bc7d.ttslua | 260 +- .../Custom_Token Memories 66dad0.ttslua | 260 +- .../Custom_Token Memories 794376.ttslua | 260 +- .../Custom_Token Memories 99db87.ttslua | 260 +- ...tom_Model_Bag Darkness Falls c6a612.ttslua | 1004 ++--- .../Custom_Tile Darkness Falls b5928a.ttslua | 42 +- ..._Bag Delta Green Convergence ac164e.ttslua | 546 +-- ..._Tile Delta Geen Convergence 520889.ttslua | 40 +- ...om_Model_Bag Flesh and Blood 613b64.ttslua | 1006 ++--- ...ustom_Model_Bag Dead by Dawn c29a78.ttslua | 1006 ++--- ...Custom_Model_Bag Late Risers 51fbbc.ttslua | 1006 ++--- ...om_Model_Bag Mourning Chorus 24c385.ttslua | 1006 ++--- ..._Model_Bag Night on the Town 2bd90b.ttslua | 1006 ++--- .../Custom_Tile Flesh and Blood ac895d.ttslua | 42 +- .../Custom_Tile Flesh and Blood f5db25.ttslua | 42 +- ...m_Token Generic Campaign Log eda22b.ttslua | 1302 +++--- ...l_Bag Guardians of the Abyss ee987d.ttslua | 1006 ++--- ...odel_Bag The Eternal Slumber 9ff406.ttslua | 546 +-- ...oken Scenario - EasyStandard b7af99.ttslua | 262 +- ...oken Scenario - EasyStandard e19c97.ttslua | 262 +- ...odel_Bag The Night's Usurper 578bcb.ttslua | 546 +-- ...oken Scenario - EasyStandard afc7b5.ttslua | 262 +- ..._Token Scenario - HardExpert 9ed124.ttslua | 262 +- ..._Tile Guardians of the Abyss 82e1ed.ttslua | 42 +- ...m_Model_Bag Happy's Funhouse e7d9f8.ttslua | 546 +-- ...Custom_Tile Happy's Funhouse c5008a.ttslua | 40 +- ...stom_Model_Bag Idol Thoughts 2d417b.ttslua | 544 +-- ...del_Bag 1 Bread and Circuses 16ceab.ttslua | 546 +-- ...Model_Bag 2 Enter the Dragon 4f944f.ttslua | 546 +-- ...ustom_Model_Bag 3 Bon Voyage 49dfb9.ttslua | 546 +-- ...om_Model_Bag 4 Cost of Azure 0fad66.ttslua | 546 +-- ...stom_Tile Bread and Circuses 82e1ed.ttslua | 40 +- ...m_Model_Bag In Blackest Pits 68380c.ttslua | 544 +-- .../Custom_Tile The Initiation bbb70a.ttslua | 50 +- ...del_Bag Into the Shadowlands 019847.ttslua | 546 +-- .../Bag 1 Dark Reflections c1aad0.ttslua | 546 +-- ...om_Tile Into the Shadowlands 770021.ttslua | 42 +- .../Bag 2 Endless Horizons b1bc62.ttslua | 546 +-- ...tom_Model_Bag Jenny's Choice a61b48.ttslua | 546 +-- .../Custom_Tile Jenny's Choice bbb70a.ttslua | 50 +- ...stom_Model_Bag Kaimonogatari 2df25a.ttslua | 1006 ++--- ...stom_Model_Bag Investigators fba392.ttslua | 1006 ++--- ...odel_Bag Izanami's Delegates b34bec.ttslua | 1006 ++--- ...ustom_Model_Bag Player Cards 64ad17.ttslua | 1006 ++--- ...cenario 1 - Modorimonogatari f051fc.ttslua | 1006 ++--- ...cenario 2A - Toshimonogatari 4076cd.ttslua | 1006 ++--- ...cenario 2B - Inarimonogatari ad56f2.ttslua | 1006 ++--- ...io 2S - Shinkansenmonogatari 8221db.ttslua | 1006 ++--- ...atari first, choose this bag 1a6190.ttslua | 1094 ++--- ...atari first, choose this bag 91392f.ttslua | 1094 ++--- ... Scenario 3 - Yamamonogatari b99de3.ttslua | 1006 ++--- ...cenario 4 - Houkaimonogatari 8f297e.ttslua | 1006 ++--- ...Scenario 5 - Fumeimonogatari b86938.ttslua | 1006 ++--- .../Custom_Tile Kaimonogatari f5db25.ttslua | 42 +- ...oken Monogatari Campaign Log eda22b.ttslua | 1280 +++--- ...y sny Stają się Rzeczywiścią acdf16.ttslua | 546 +-- ...iwny Przypadek Benedicta Burtona bd069f.ttslua | 546 +-- .../Bag Nieuchwytny 31a93a.ttslua | 546 +-- .../Bag Podniebny Koncert 2889f0.ttslua | 546 +-- .../Bag Przeznacznenie w Red Hook 1e00a9.ttslua | 546 +-- .../Custom_Model_Bag Knightfall df62e8.ttslua | 546 +-- .../Custom_Tile Knightfall 271ce2.ttslua | 40 +- ...del_Bag Last Call at Roxie's c6a1ca.ttslua | 546 +-- ...om_Tile Last Call at Roxie's 567db0.ttslua | 40 +- ...s of Nyarlathotep – New York 94a1f8.ttslua | 546 +-- .../Custom_Tile Core Difficulty aae2b1.ttslua | 40 +- ...m_Model_Bag Miskatonic Mouse 0954ef.ttslua | 1006 ++--- ...tom_Model Custom Data Helper aa3d8a.ttslua | 76 +- ...urder at the Excelsior Hotel 01d780.ttslua | 1006 ++--- ...urder at the Excelsior Hotel bbb70a.ttslua | 50 +- ...odel_Bag North Country Cycle aaceca.ttslua | 546 +-- .../Bag Part 1 147dea.ttslua | 546 +-- .../Bag Part 2 7f9f0d.ttslua | 546 +-- .../Bag Part 3 df5156.ttslua | 546 +-- .../Custom_Tile Core Difficulty ea0896.ttslua | 40 +- ...odel_Bag Of Sphinx and Sands eeeb50.ttslua | 544 +-- .../Bag 1 Eye on the Prize e54f2a.ttslua | 544 +-- .../Custom_Tile Core Difficulty 56a08b.ttslua | 42 +- .../Bag 2 Chaos in Cairo 6e0236.ttslua | 544 +-- .../Bag 3 The Will to Triump 6d8dad.ttslua | 544 +-- ...del_Bag Ordo Templi Orientis 7cf202.ttslua | 544 +-- .../Bag Midnight in Paris 7cda3f.ttslua | 1008 ++--- .../Bag Shadows of Brocéliande 7b28eb.ttslua | 1008 ++--- .../Bag The München Conspiracy 286579.ttslua | 1008 ++--- .../Bag Tibetan Winds ba2ded.ttslua | 1008 ++--- ...om_Tile Ordo Templi Orientis bbb70a.ttslua | 48 +- ..._Model_Bag Parallel Universe 28e0a1.ttslua | 546 +-- .../Bag c0897e.ttslua | 546 +-- .../Bag 1 Nightmare or Dream f39e68.ttslua | 546 +-- .../Bag 2 Awake 6ca52c.ttslua | 546 +-- .../Custom_Tile Core Difficulty 56a08b.ttslua | 40 +- ...Bag Pokemon Eldritch Edition 75fe78.ttslua | 1004 ++--- ...emon To An Existing Campaign 7b57ad.ttslua | 546 +-- .../Bag Basic Pokemon d14543.ttslua | 546 +-- .../Bag Pokemon Investigators 05109d.ttslua | 546 +-- ...Bag Scenario 1 The Conjuring e1caf1.ttslua | 546 +-- ...ile Pokemon Eldritch Edition 3837a5.ttslua | 40 +- ...Scenario 2a The Winding Road 61801e.ttslua | 546 +-- ...b Shipments From The Unknown 13ed7d.ttslua | 546 +-- .../Bag Scenario 3a Viridian f040a6.ttslua | 546 +-- ...Bag Scenario 3b Deep Secrets 3da6dd.ttslua | 546 +-- ...g Scenario 4 The Unconjuring 52d102.ttslua | 546 +-- ...Side-Story 1 Eldritch Safari 1fae15.ttslua | 546 +-- .../Custom_Tile Eldritch Safari 3837a5.ttslua | 40 +- ...ide-Story 2 Project Cerulean 4c07bf.ttslua | 546 +-- ...Custom_Tile Project Cerulean 3837a5.ttslua | 40 +- .../Bag Upgrade Pokemon 2cea4e.ttslua | 546 +-- .../Custom_Token Campaign Log eda22b.ttslua | 1302 +++--- ...Custom_Model_Bag Read or Die 9e73fa.ttslua | 1006 ++--- .../Custom_Tile Read or Die b5928a.ttslua | 42 +- ...stom_Model_Bag Strange Aeons 2abdd6.ttslua | 546 +-- .../Bag 1 In Search Of Sanity 961940.ttslua | 546 +-- .../Bag 2 The Thrushmoor Terror eea51b.ttslua | 546 +-- .../Custom_Tile Strange Aeons 82e1ed.ttslua | 42 +- ...om_Model_Bag Stranger Things 408301.ttslua | 546 +-- .../Custom_Tile Stranger Things bc825a.ttslua | 40 +- ...el_Bag The Approaching Storm 0fad66.ttslua | 546 +-- .../Bag 1 Plot Uncovered 67d524.ttslua | 546 +-- .../Bag 2 Dark Waters 90aab1.ttslua | 546 +-- .../Bag 3 Curiosities 20982e.ttslua | 546 +-- .../Bag 4 Shadow Rails 3a3b5a.ttslua | 546 +-- .../Bag 5 lair of the Cult 266dcb.ttslua | 546 +-- .../Bag 6 Domain of Baal 84cdaf.ttslua | 546 +-- ...m_Tile The Approaching Storm 7521a9.ttslua | 40 +- ...The Blob that Ate Everything 4dee5a.ttslua | 1004 ++--- .../Bag Epic Multiplayer 2c10cf.ttslua | 546 +-- .../Bag Single Group 830305.ttslua | 546 +-- ...The Blob that Ate Everything bbb70a.ttslua | 48 +- ...stom_Model_Bag The Collector 9810eb.ttslua | 546 +-- .../Custom_Tile The Collector 150603.ttslua | 40 +- ..._Bag The Colour out of Space 5b81ff.ttslua | 546 +-- ...Tile The Colour out of Space 2e887e.ttslua | 40 +- ...el_Bag The Curse of Amulotep 0d7a8d.ttslua | 546 +-- ...om_Tile The Curse of Amultep b3cbc1.ttslua | 40 +- ...tom_Model_Bag The Dying Star bcfff6.ttslua | 546 +-- .../Bag Part 1 b310b9.ttslua | 546 +-- .../Custom_Tile The Dying Star 8d62ae.ttslua | 40 +- .../Bag Part 2 c2a55d.ttslua | 546 +-- .../Custom_Tile The Dying Star a148f2.ttslua | 40 +- ...ustom_Model_Bag The Festival 29d22a.ttslua | 546 +-- .../Custom_Tile The Festival 4b81f6.ttslua | 40 +- ...odel_Bag The Grand Oak Hotel 4255b1.ttslua | 546 +-- .../Custom_Tile Core Difficulty 9cd1ad.ttslua | 40 +- ...Bag The Labyrinths of Lunacy 4c173f.ttslua | 1006 ++--- .../Bag Epic Group A 79b534.ttslua | 546 +-- .../Bag Epic Group B c7c4c1.ttslua | 546 +-- .../Bag Epic Group C c352ac.ttslua | 546 +-- .../Bag Single Group A 2ea2a2.ttslua | 546 +-- .../Bag Single Group B 14808b.ttslua | 546 +-- .../Bag Single Group C 76b476.ttslua | 546 +-- ...ile The Labyrinths of Lunacy f4dcee.ttslua | 42 +- ... The Legend of Sleepy Hollow b46db2.ttslua | 1006 ++--- ... The Legend of Sleepy Hollow bbb70a.ttslua | 24 +- ...m_Token Generic Campaign Log eda22b.ttslua | 1018 ++--- ...tom_Model_Bag The London Set 0f96ac.ttslua | 546 +-- .../Bag 1 A Loving Spouse 4c5c55.ttslua | 546 +-- .../Custom_Tile A Loving Spouse ea41d9.ttslua | 42 +- .../Bag 2 Mrs Tillywingers Cat c56f66.ttslua | 546 +-- ...om_Tile Mrs Tillywingers Cat 0ae91a.ttslua | 42 +- ... 3 Disgracing Alderman Whitn 905ad3.ttslua | 546 +-- ... Disgracing Alderman Whitney c2736e.ttslua | 42 +- ...m_Model_Bag The Nephew Calls 3ddd12.ttslua | 546 +-- ...Custom_Tile The Nephew Calls 54707a.ttslua | 40 +- ...ustom_Model_Bag The Outsider 3c175c.ttslua | 546 +-- .../Bag Part 1 526ff9.ttslua | 546 +-- .../Bag Part 2 5b3ac7.ttslua | 546 +-- .../Bag Part 3 d166f2.ttslua | 546 +-- .../Custom_Tile The Outsider d5b06c.ttslua | 40 +- ...m_Model_Bag The Pensher Wyrm 504f38.ttslua | 546 +-- ...Custom_Tile The Pensher Wyrm c606a1.ttslua | 42 +- ...ustom_Model_Bag The Red Room fa4327.ttslua | 546 +-- ...odel_Bag The Stolen Baillius bfefd4.ttslua | 546 +-- .../Custom_Tile Core Difficulty ec7a73.ttslua | 40 +- ...Model_Bag The Svalbard Event 7bc42b.ttslua | 546 +-- .../Custom_Tile Core Difficulty a751fe.ttslua | 40 +- ...g The Symphony of Erich Zann b7c6be.ttslua | 1004 ++--- ...tom_Model Custom Data Helper c0b834.ttslua | 74 +- ...e The Symphony of Erich Zann f4c93e.ttslua | 50 +- ...l_Bag The Thing in the Woods c90c49.ttslua | 546 +-- .../Custom_Tile Core Difficulty 2261a5.ttslua | 40 +- ...el_Bag The War of the Worlds 19d469.ttslua | 1004 ++--- ...om_Model_Bag 1 First Contact f70a0d.ttslua | 544 +-- ...odel_Bag 2 Phobos and Deimos 313523.ttslua | 544 +-- ...del_Bag 3 The Thirsting Void a0d2b1.ttslua | 544 +-- ...ustom_Tile War of the Worlds b5928a.ttslua | 40 +- ...r of the Worlds Campaign Log eda22b.ttslua | 1362 +++--- ...el_Bag War of the Outer Gods fc7674.ttslua | 1004 ++--- ...m_Tile War of the Outer Gods dcb241.ttslua | 48 +- ...ustom_Model_Bag Winter Winds 754057.ttslua | 546 +-- .../Bag Frozen Tracks 11429d.ttslua | 546 +-- .../Bag Stranded in the Urals 8077a1.ttslua | 546 +-- .../Bag The Forgotten Village ddd10b.ttslua | 546 +-- .../Custom_Tile Winter Winds d54710.ttslua | 40 +- ...tom_Model_Bag Weakness decks 750fdd.ttslua | 1004 ++--- ...tom_Model_Bag Weakness decks 1ae6a4.ttslua | 1004 ++--- .../Custom_Tile Data Helper 708279.ttslua | 3642 ++++++++--------- ...ustom_Tile New Deck Importer edad66.ttslua | 862 ++-- ...ustom_Tile Playermat 1 White 8b081b.ttslua | 812 ++-- ...stom_Tile Playermat 2 Orange bd0ff4.ttslua | 812 ++-- ...ustom_Tile Playermat 3 Green 383d8b.ttslua | 812 ++-- .../Custom_Tile Playermat 4 Red 0840d5.ttslua | 812 ++-- unpacked/Custom_Token b7b45b.ttslua | 396 +- .../Custom_Token Agenda Deck 85c4c6.ttslua | 262 +- ...Token Chaos Bag Stat Tracker 766620.ttslua | 200 +- unpacked/Custom_Token Damage 1f5a0a.ttslua | 260 +- unpacked/Custom_Token Damage 591a45.ttslua | 260 +- unpacked/Custom_Token Damage e64eec.ttslua | 260 +- unpacked/Custom_Token Damage eb08d6.ttslua | 260 +- unpacked/Custom_Token Horror 0257d9.ttslua | 260 +- unpacked/Custom_Token Horror 468e88.ttslua | 260 +- unpacked/Custom_Token Horror 7b5729.ttslua | 260 +- unpacked/Custom_Token Horror beb964.ttslua | 260 +- ...om_Token Master Clue Counter 4a3aa4.ttslua | 310 +- unpacked/Custom_Token Playarea 721ba2.ttslua | 426 +- unpacked/Custom_Token Resources 4406f0.ttslua | 260 +- unpacked/Custom_Token Resources 816d84.ttslua | 260 +- unpacked/Custom_Token Resources a4b60d.ttslua | 260 +- unpacked/Custom_Token Resources cd15ac.ttslua | 260 +- 524 files changed, 147669 insertions(+), 147669 deletions(-) diff --git a/unpacked.ttslua b/unpacked.ttslua index d627daaf2..bf9ff0cf1 100644 --- a/unpacked.ttslua +++ b/unpacked.ttslua @@ -1,742 +1,742 @@ ---[[ Lua code. See documentation: http://berserk-games.com/knowledgebase/scripting/ --]] --- Card size used for autodealing -- - --- global position constants -ENCOUNTER_DECK_POS = {-3.8, 1, 5.7} -ENCOUNTER_DECK_SPAWN_POS = {-3.8, 3, 5.7} -ENCOUNTER_DECK_DISCARD_POSITION = {-3.8, 0.5, 10.5} -g_cardWith=2.30; -g_cardHeigth=3.40; - -containerId = 'fea079' -tokenDataId = '708279' - - -CACHE = { - object = {}, - data = {} -} - ---[[ The OnLoad function. This is called after everything in the game save finishes loading. -Most of your script code goes here. --]] -function onload() - --Player.White.changeColor('Yellow') - tokenplayerone = { - damageone = "https://i.imgur.com/XIJHw3J.png", - damagethree = "https://i.imgur.com/eqRC712.png", - horrorone = "https://i.imgur.com/Bh0BO47.png", - horrorthree = "https://i.imgur.com/pZvTKA7.png", - resource = "https://i.imgur.com/j5v5E3j.png", - resourcethree = "https://i.imgur.com/1GZsDTt.png", - doom = "https://i.imgur.com/EoL7yaZ.png", - clue = "https://i.imgur.com/wfCaVU0.png" - } - - TOKEN_DATA = { - clue = {image = tokenplayerone.clue, scale = {0.15, 0.15, 0.15}}, - resource = {image = tokenplayerone.resource, scale = {0.17, 0.17, 0.17}}, - doom = {image = tokenplayerone.doom, scale = {0.17, 0.17, 0.17}} - } - - getObjectFromGUID("6161b4").interactable=false - getObjectFromGUID("721ba2").interactable=false - getObjectFromGUID("9f334f").interactable=false - getObjectFromGUID("23a43c").interactable=false - getObjectFromGUID("5450cc").interactable=false - getObjectFromGUID("463022").interactable=false - getObjectFromGUID("9487a4").interactable=false - getObjectFromGUID("91dd9b").interactable=false - getObjectFromGUID("f182ee").interactable=false - -end - -function take_callback(object_spawned, mat) - customObject = object_spawned.getCustomObject() - local player = mat.getGUID(); - - local image = customObject.image - - -- Update global stats - if PULLS[image] == nil then - PULLS[image] = 0 - end - PULLS[image] = PULLS[image] + 1 - -- Update player stats - if PLAYER_PULLS[player][image] == nil then - PLAYER_PULLS[player][image] = 0 - end - PLAYER_PULLS[player][image] = PLAYER_PULLS[player][image] + 1 - -end -MAT_GUID_TO_COLOUR = { - ["8b081b"] = "White", - -- player 2 conrad - ["bd0ff4"] = "Orange", - -- player - ["383d8b"] = "Green", - -- playur 4 olivia - ["0840d5"] = "Red" -} - - -PLAYER_PULLS = { - -- player 1 max - ["8b081b"] = {}, - -- player 2 conrad - ["bd0ff4"] = {}, - -- player - ["383d8b"] = {}, - -- playur 4 olivia - ["0840d5"] = {} -} - -PULLS = { - -- cultist - ["https://i.imgur.com/VzhJJaH.png"] = 0, - -- skull - ["https://i.imgur.com/stbBxtx.png"] = 0, - -- tablet - ["https://i.imgur.com/1plY463.png"] = 0, - -- curse - ["http://cloud-3.steamusercontent.com/ugc/1011565208488654691/8F0B399048EBC34CD24B99AAD415AEC40E679C65/"] = 0, - -- tentacle - ["https://i.imgur.com/lns4fhz.png"] = 0, - -- minus eight - ["https://i.imgur.com/9t3rPTQ.png"] = 0, - -- minus seven - ["https://i.imgur.com/4WRD42n.png"] = 0, - -- minus six - ["https://i.imgur.com/c9qdSzS.png"] = 0, - -- minus five - ["https://i.imgur.com/3Ym1IeG.png"] = 0, - -- minus four - ["https://i.imgur.com/qrgGQRD.png"] = 0, - -- minus three - ["https://i.imgur.com/yfs8gHq.png"] = 0, - -- minus two - ["https://i.imgur.com/bfTg2hb.png"] = 0, - -- minus one - ["https://i.imgur.com/w3XbrCC.png"] = 0, - -- zero - ["https://i.imgur.com/btEtVfd.png"] = 0, - -- plus one - ["https://i.imgur.com/uIx8jbY.png"] = 0, - -- elder thing - ["https://i.imgur.com/ttnspKt.png"] = 0, - -- bless - ["http://cloud-3.steamusercontent.com/ugc/1011565208488650618/B2B081032AF3EFDBD90840A5D6888A3CEA228D66/"] = 0, - -- elder sign - ["https://i.imgur.com/nEmqjmj.png"] = 0, -} - -IMAGE_TOKEN_MAP = { - -- cultist - ["https://i.imgur.com/VzhJJaH.png"] = "cultist", - -- skull - ["https://i.imgur.com/stbBxtx.png"] = "skull", - -- tablet - ["https://i.imgur.com/1plY463.png"] = "tablet", - -- elder thing - ["https://i.imgur.com/ttnspKt.png"] = "Elder Thing", - -- curse - ["http://cloud-3.steamusercontent.com/ugc/1011565208488654691/8F0B399048EBC34CD24B99AAD415AEC40E679C65/"] = "curse", - -- tentacle - ["https://i.imgur.com/lns4fhz.png"] = "Auto-Fail", - -- minus eight - ["https://i.imgur.com/9t3rPTQ.png"] = "-8", - -- minus seven - ["https://i.imgur.com/4WRD42n.png"] = "-7", - -- minus six - ["https://i.imgur.com/c9qdSzS.png"] = "-6", - -- minus five - ["https://i.imgur.com/3Ym1IeG.png"] = "-5", - -- minus four - ["https://i.imgur.com/qrgGQRD.png"] = "-4", - -- minus three - ["https://i.imgur.com/yfs8gHq.png"] = "-3", - -- minus two - ["https://i.imgur.com/bfTg2hb.png"] = "-2", - -- minus one - ["https://i.imgur.com/w3XbrCC.png"] = "-1", - -- zero - ["https://i.imgur.com/btEtVfd.png"] = "0", - -- plus one - ["https://i.imgur.com/uIx8jbY.png"] = "+1", - -- bless - ["http://cloud-3.steamusercontent.com/ugc/1011565208488650618/B2B081032AF3EFDBD90840A5D6888A3CEA228D66/"] = "bless", - -- elder sign - ["https://i.imgur.com/nEmqjmj.png"] = "Elder Sign", -} - -function resetStats() - for key,value in pairs(PULLS) do - PULLS[key] = 0 - end - for playerKey, playerValue in pairs(PLAYER_PULLS) do - for key,value in pairs(PULLS) do - PLAYER_PULLS[playerKey][key] = value - end - end - - -end - -function getPlayerName(playerMatGuid) - local playerColour = MAT_GUID_TO_COLOUR[playerMatGuid] - if Player[playerColour].seated then - return Player[playerColour].steam_name - else - return playerColour - end -end - -function printStats() - local squidKing = "Nobody" - local maxSquid = 0 - - printToAll("\nOverall Game stats\n") - printNonZeroTokenPairs(PULLS) - printToAll("\nIndividual Stats\n") - for playerMatGuid, countTable in pairs(PLAYER_PULLS) do - local playerName = getPlayerName(playerMatGuid) - printToAll(playerName .. " Stats", {r=255,g=0,b=0}) - printNonZeroTokenPairs(PLAYER_PULLS[playerMatGuid]) - playerSquidCount = PLAYER_PULLS[playerMatGuid]["https://i.imgur.com/lns4fhz.png"] - if playerSquidCount != nil and playerSquidCount > maxSquid then - squidKing = playerName - end - end - printToAll(squidKing .. " is an auto-fail magnet.", {r=255,g=0,b=0}) -end - -function printNonZeroTokenPairs(theTable) - for key,value in pairs(theTable) do - if value != 0 then - printToAll(IMAGE_TOKEN_MAP[key] .. '=' .. tostring(value)) - end - end -end - --- Remove comments to enable autorotate cards on hands. --- function onObjectEnterScriptingZone(zone, object) --- Autorotate cards with right side up when entering hand. --- if zone.getGUID() == "c506bf" or -- white --- zone.getGUID() == "cbc751" then -- orange --- object.setRotationSmooth({0,270,0}) --- elseif zone.getGUID() == "67ce9a" then -- green --- object.setRotationSmooth({0,0,0}) --- elseif zone.getGUID() == "57c22c" then -- red --- object.setRotationSmooth({0,180,0}) ---end ---end - -function findInRadiusBy(pos, radius, filter, debug) - local radius = (radius or 1) - local objList = Physics.cast({ - origin = pos, - direction = {0,1,0}, - type = 2, - size = {radius, radius, radius}, - max_distance = 0, - debug = (debug or false) - }) - - local filteredList = {} - for _, obj in ipairs(objList) do - if filter == nil then - table.insert(filteredList, obj.hit_object) - elseif filter and filter(obj.hit_object) then - table.insert(filteredList, obj.hit_object) - end - end - return filteredList -end - -function dealCardsInRows(paramlist) - local currPosition={}; - local numRow=1; - local numCard=0; - local invMultiplier=1; - local allCardsDealed=0; - if paramlist.inverse then - invMultiplier=-1; - end - if paramlist.maxCardsDealed==nil then - - allCardsDealed=0; - paramlist.maxCardsDealed=paramlist.cardDeck.getQuantity() - - elseif paramlist.maxCardsDealed>=paramlist.cardDeck.getQuantity() or paramlist.maxCardsDealed<=0 then - - allCardsDealed=0; - paramlist.maxCardsDealed=paramlist.cardDeck.getQuantity() - - else - - allCardsDealed=1; - - end - - if paramlist.mode=="x" then - currPosition={paramlist.iniPosition[1]+(2*g_cardWith*invMultiplier*allCardsDealed),paramlist.iniPosition[2],paramlist.iniPosition[3]}; - - else - currPosition={paramlist.iniPosition[1],paramlist.iniPosition[2],paramlist.iniPosition[3]+(2*g_cardWith*invMultiplier*allCardsDealed)}; - - end - - for i = 1,paramlist.maxCardsDealed,1 do - - paramlist.cardDeck.takeObject - ({ - position= currPosition, - smooth= true - }); - - numCard=numCard+1; - if numCard>=paramlist.maxCardRow then - - if paramlist.mode=="x" then - currPosition={paramlist.iniPosition[1]+(2*g_cardWith*invMultiplier*allCardsDealed),paramlist.iniPosition[2],paramlist.iniPosition[3]}; - currPosition[3]=currPosition[3]-(numRow*g_cardHeigth*invMultiplier); - else - currPosition={paramlist.iniPosition[1],paramlist.iniPosition[2],paramlist.iniPosition[3]+(2*g_cardWith*invMultiplier*allCardsDealed)}; - currPosition[1]=currPosition[1]+(numRow*g_cardHeigth*invMultiplier); - end - numCard=0; - numRow=numRow+1; - - else - if paramlist.mode=="x" then - currPosition[1]=currPosition[1]+(g_cardWith*invMultiplier); - else - currPosition[3]=currPosition[3]+(g_cardWith*invMultiplier); - end - end - end -end - -function isDeck(x) - return x.tag == 'Deck' -end - -function isCardOrDeck(x) - return x.tag == 'Card' or isDeck(x) -end - -function drawEncountercard(params) --[[ Parameter Table Position, Table Rotation]] - local position = params[1] - local rotation = params[2] - local isFaceUp = params[3] - local faceUpRotation - if (isFaceUp) then - faceUpRotation = 0 - else - faceUpRotation = 180 - end - local items = findInRadiusBy(ENCOUNTER_DECK_POS, 4, isCardOrDeck) - if #items > 0 then - for i, v in ipairs(items) do - if v.tag == 'Deck' then - v.takeObject({index = 0, position = position, rotation = {0,rotation.y,faceUpRotation}}) - return - end - end --- we didn't find the deck so just pull the first thing we did find - items[1].setPositionSmooth(position, false, false) - items[1].setRotationSmooth({0,rotation.y,faceUpRotation}, false, false) - return - end --- nothing here, time to reshuffle - reshuffleEncounterDeck(position, {0,rotation.y,faceUpRotation}) -end - -IS_RESHUFFLING = false -function reshuffleEncounterDeck(position, rotation) - -- finishes moving the deck back and draws a card - local function move(deck) - deck.setPositionSmooth(ENCOUNTER_DECK_SPAWN_POS, true, false) - deck.takeObject({index = 0, position = position, rotation = rotation, flip = false}) - Wait.time(function() IS_RESHUFFLING = false end, 1) - end - -- bail out if we're mid reshuffle - if IS_RESHUFFLING then - return - end - local discarded = findInRadiusBy(ENCOUNTER_DECK_DISCARD_POSITION, 4, isDeck) - if #discarded > 0 then - IS_RESHUFFLING = true - local deck = discarded[1] - if not deck.is_face_down then - deck.flip() - end - deck.shuffle() - Wait.time(|| move(deck), 0.3) - else - printToAll("couldn't find encounter discard pile to reshuffle", {1, 0, 0}) - end -end - -CHAOS_TOKENS = {} -CHAOS_TOKENS_LAST_MAT = nil -function putBackChaosTokens() - local chaosbagposition = chaosbag.getPosition() - for k, token in pairs(CHAOS_TOKENS) do - if token != nil then - chaosbag.putObject(token) - token.setPosition({chaosbagposition[1],chaosbagposition[2]+0.5,chaosbagposition[3]}) - end - end - CHAOS_TOKENS = {} - end - -function drawChaostoken(params) - local mat = params[1] - local tokenOffset = params[2] - local isRightClick = params[3] - local isSameMat = (CHAOS_TOKENS_LAST_MAT == nil or CHAOS_TOKENS_LAST_MAT == mat) - if not isSameMat then - putBackChaosTokens() - end - CHAOS_TOKENS_LAST_MAT = mat - -- if we have left clicked and have no tokens OR if we have right clicked - if isRightClick or #CHAOS_TOKENS == 0 then - local items = getObjectFromGUID("83ef06").getObjects() - for i,v in ipairs(items) do - if items[i].getDescription() == "Chaos Bag" then - chaosbag = getObjectFromGUID(items[i].getGUID()) - break - end - end - -- bail out if we have no tokens - if #chaosbag.getObjects() == 0 then - return - end - chaosbag.shuffle() - -- add the token to the list, compute new position based on list length - tokenOffset[1] = tokenOffset[1] + (0.17 * #CHAOS_TOKENS) - local toPosition = mat.positionToWorld(tokenOffset) - local token = chaosbag.takeObject({ - index = 0, - position = toPosition, - rotation = mat.getRotation(), - callback_function = function(obj) take_callback(obj, mat) end - }) - CHAOS_TOKENS[#CHAOS_TOKENS + 1] = token - return - else - putBackChaosTokens() - end -end - -function spawnToken(params) - -- Position to spawn, - -- rotation vector to apply - -- translation vector to apply - -- token type - local position = params[1] - local tokenType = params[2] - local tokenData = TOKEN_DATA[tokenType] - if tokenData == nil then - error("no token data found for '" .. tokenType .. "'") - end - - local token = spawnObject({ - type = 'Custom_Token', - position = position, - rotation = {x=0, y=270, z=0} - }) - token.setCustomObject({ - image = tokenData['image'], - thickness = 0.3, - merge_distance = 5.0, - stackable = true, - }) - token.use_snap_points=false - token.scale(tokenData['scale']) - return token -end - -function round(params) -- Parameter (int number, int numberDecimalPlaces) - return tonumber(string.format("%." .. (params[2] or 0) .. "f", params[1])) -end - -function roundposition(params) -- Parameter (Table position) - return {round({params[1], 2}),round({params[2], 2}),round({params[3], 2})} -end - -function isEqual(params) --Parameter (Table table1, Table table2) returns true if the tables are equal - if params[1][1] == params[2][1] and params[1][2] == params[2][2] and params[1][3] == params[2][3] then - return true - else - return false - end -end - -function isFaceup(params) --Object object - if params.getRotation()[3] > -5 and params.getRotation()[3] < 5 then - return true - else - return false - end -end - ---Difficulty selector script - -function createSetupButtons(args) - local data = getDataValue('modeData', args.key) - if data ~= nil then - local z = -0.15 - if data.easy ~= nil then - args.object.createButton({ - label = 'Easy', - click_function = 'easyClick', - function_owner = args.object, - position = {0, 0.1, z}, - rotation = {0, 0, 0}, - scale = {0.47, 1, 0.47}, - height = 200, - width = 1150, - font_size = 100, - color = {0.87, 0.8, 0.70}, - font_color = {0, 0, 0} - }) - z = z + 0.20 - end - if data.normal ~= nil then - args.object.createButton({ - label = 'Standard', - click_function = 'normalClick', - function_owner = args.object, - position = {0, 0.1, z}, - rotation = {0, 0, 0}, - scale = {0.47, 1, 0.47}, - height = 200, - width = 1150, - font_size = 100, - color = {0.87, 0.8, 0.70}, - font_color = {0, 0, 0} - }) - z = z + 0.20 - end - if data.hard ~= nil then - args.object.createButton({ - label = 'Hard', - click_function = 'hardClick', - function_owner = args.object, - position = {0, 0.1, z}, - rotation = {0, 0, 0}, - scale = {0.47, 1, 0.47}, - height = 200, - width = 1150, - font_size = 100, - color = {0.87, 0.8, 0.70}, - font_color = {0, 0, 0} - }) - z = z + 0.20 - end - if data.expert ~= nil then - args.object.createButton({ - label = 'Expert', - click_function = 'expertClick', - function_owner = args.object, - position = {0, 0.1, z}, - rotation = {0, 0, 0}, - scale = {0.47, 1, 0.47}, - height = 200, - width = 1150, - font_size = 100, - color = {0.87, 0.8, 0.70}, - font_color = {0, 0, 0} - }) - z = z + 0.20 - end - z = z + 0.10 - if data.standalone ~= nil then - args.object.createButton({ - label = 'Standalone', - click_function = 'standaloneClick', - function_owner = args.object, - position = {0, 0.1, z}, - rotation = {0, 0, 0}, - scale = {0.47, 1, 0.47}, - height = 200, - width = 1150, - font_size = 100, - color = {0.87, 0.8, 0.70}, - font_color = {0, 0, 0} - }) - end - end -end - -function fillContainer(args) - local container = getObjectCache(containerId) - - if container ~= nil then - local data = getDataValue('modeData', args.key) - if data == nil then return end - - local value = data[args.mode] - if value == nil or value.token == nil then return end - - local pos = container.getPosition() - if args.object ~= nil then - pos = args.object.getPosition() - end - - cleanContainer(container) - - for _, token in ipairs(value.token) do - local obj = spawnToken_2(token, pos) - if obj ~= nil then - container.putObject(obj) - end - end - - if value.append ~= nil then - for _, token in ipairs(value.append) do - local obj = spawnToken_2(token, pos) - if obj ~= nil then - container.putObject(obj) - end - end - end - - if value.random then - local n = #value.random - if n > 0 then - for _, token in ipairs(value.random[getRandomCount(n)]) do - local obj = spawnToken_2(token, pos) - if obj ~= nil then - container.putObject(obj) - end - end - end - end - - if value.message then - broadcastToAll(value.message) - end - if value.warning then - broadcastToAll(value.warning, { 1, 0.5, 0.5 }) - end - end -end - -function spawnToken_2(id, pos) - local url = getImageUrl(id) - if url ~= '' then - local obj = spawnObject({ - type = 'Custom_Tile', - position = {pos.x, pos.y + 3, pos.z}, - rotation = {x = 0, y = 260, z = 0} - }) - obj.setCustomObject({ - type = 2, - image = url, - thickness = 0.10, - }) - obj.scale {0.81, 1, 0.81} - return obj - end -end - -function getImageUrl(id) - if id == 'p1' then return 'https://i.imgur.com/uIx8jbY.png' end - if id == '0' then return 'https://i.imgur.com/btEtVfd.png' end - if id == 'm1' then return 'https://i.imgur.com/w3XbrCC.png' end - if id == 'm2' then return 'https://i.imgur.com/bfTg2hb.png' end - if id == 'm3' then return 'https://i.imgur.com/yfs8gHq.png' end - if id == 'm4' then return 'https://i.imgur.com/qrgGQRD.png' end - if id == 'm5' then return 'https://i.imgur.com/3Ym1IeG.png' end - if id == 'm6' then return 'https://i.imgur.com/c9qdSzS.png' end - if id == 'm7' then return 'https://i.imgur.com/4WRD42n.png' end - if id == 'm8' then return 'https://i.imgur.com/9t3rPTQ.png' end - if id == 'skull' then return 'https://i.imgur.com/stbBxtx.png' end - if id == 'cultist' then return 'https://i.imgur.com/VzhJJaH.png' end - if id == 'tablet' then return 'https://i.imgur.com/1plY463.png' end - if id == 'elder' then return 'https://i.imgur.com/ttnspKt.png' end - if id == 'red' then return 'https://i.imgur.com/lns4fhz.png' end - if id == 'blue' then return 'https://i.imgur.com/nEmqjmj.png' end - return '' -end - -function cleanContainer(container) - for _, item in ipairs(container.getObjects()) do - destroyObject(container.takeObject({})) - end -end - -function getObjectsInZone(zoneId) - local zoneObject = getObjectCache(zoneId) - - if zoneObject == nil then - return - end - - local objectsInZone = zoneObject.getObjects() - local objectsFound = {} - - for i = 1, #objectsInZone do - local object = objectsInZone[i] - if object.tag == 'Bag' then - table.insert(objectsFound, object.guid) - end - end - - if #objectsFound > 0 then - return objectsFound - end -end - -function getObjectCache(id) - if CACHE.object[id] == nil then - CACHE.object[id] = getObjectFromGUID(id) - end - return CACHE.object[id] -end - -function getDataTable(storage) - if CACHE.data[storage] == nil then - local obj = getObjectCache(tokenDataId) - if obj ~= nil then - CACHE.data[storage] = obj.getTable(storage) - end - end - return CACHE.data[storage] -end - -function getDataValue(storage, key) - local data = getDataTable(storage) - if data ~= nil then - local value = data[key] - if value ~= nil then - local res = {} - for m, v in pairs(value) do - res[m] = v - if res[m].parent ~= nil then - local parentData = getDataValue(storage, res[m].parent) - if parentData ~= nil and parentData[m] ~= nil and parentData[m].token ~= nil then - res[m].token = parentData[m].token - end - res[m].parent = nil - end - end - return res - end - end -end - -function getRandomCount(to) - updateRandomSeed() - return math.random(1, to) -end - -function updateRandomSeed() - local chance = math.random(1,10) - if chance == 1 then - math.randomseed(os.time()) - end -end - +--[[ Lua code. See documentation: http://berserk-games.com/knowledgebase/scripting/ --]] +-- Card size used for autodealing -- + +-- global position constants +ENCOUNTER_DECK_POS = {-3.8, 1, 5.7} +ENCOUNTER_DECK_SPAWN_POS = {-3.8, 3, 5.7} +ENCOUNTER_DECK_DISCARD_POSITION = {-3.8, 0.5, 10.5} +g_cardWith=2.30; +g_cardHeigth=3.40; + +containerId = 'fea079' +tokenDataId = '708279' + + +CACHE = { + object = {}, + data = {} +} + +--[[ The OnLoad function. This is called after everything in the game save finishes loading. +Most of your script code goes here. --]] +function onload() + --Player.White.changeColor('Yellow') + tokenplayerone = { + damageone = "https://i.imgur.com/XIJHw3J.png", + damagethree = "https://i.imgur.com/eqRC712.png", + horrorone = "https://i.imgur.com/Bh0BO47.png", + horrorthree = "https://i.imgur.com/pZvTKA7.png", + resource = "https://i.imgur.com/j5v5E3j.png", + resourcethree = "https://i.imgur.com/1GZsDTt.png", + doom = "https://i.imgur.com/EoL7yaZ.png", + clue = "https://i.imgur.com/wfCaVU0.png" + } + + TOKEN_DATA = { + clue = {image = tokenplayerone.clue, scale = {0.15, 0.15, 0.15}}, + resource = {image = tokenplayerone.resource, scale = {0.17, 0.17, 0.17}}, + doom = {image = tokenplayerone.doom, scale = {0.17, 0.17, 0.17}} + } + + getObjectFromGUID("6161b4").interactable=false + getObjectFromGUID("721ba2").interactable=false + getObjectFromGUID("9f334f").interactable=false + getObjectFromGUID("23a43c").interactable=false + getObjectFromGUID("5450cc").interactable=false + getObjectFromGUID("463022").interactable=false + getObjectFromGUID("9487a4").interactable=false + getObjectFromGUID("91dd9b").interactable=false + getObjectFromGUID("f182ee").interactable=false + +end + +function take_callback(object_spawned, mat) + customObject = object_spawned.getCustomObject() + local player = mat.getGUID(); + + local image = customObject.image + + -- Update global stats + if PULLS[image] == nil then + PULLS[image] = 0 + end + PULLS[image] = PULLS[image] + 1 + -- Update player stats + if PLAYER_PULLS[player][image] == nil then + PLAYER_PULLS[player][image] = 0 + end + PLAYER_PULLS[player][image] = PLAYER_PULLS[player][image] + 1 + +end +MAT_GUID_TO_COLOUR = { + ["8b081b"] = "White", + -- player 2 conrad + ["bd0ff4"] = "Orange", + -- player + ["383d8b"] = "Green", + -- playur 4 olivia + ["0840d5"] = "Red" +} + + +PLAYER_PULLS = { + -- player 1 max + ["8b081b"] = {}, + -- player 2 conrad + ["bd0ff4"] = {}, + -- player + ["383d8b"] = {}, + -- playur 4 olivia + ["0840d5"] = {} +} + +PULLS = { + -- cultist + ["https://i.imgur.com/VzhJJaH.png"] = 0, + -- skull + ["https://i.imgur.com/stbBxtx.png"] = 0, + -- tablet + ["https://i.imgur.com/1plY463.png"] = 0, + -- curse + ["http://cloud-3.steamusercontent.com/ugc/1011565208488654691/8F0B399048EBC34CD24B99AAD415AEC40E679C65/"] = 0, + -- tentacle + ["https://i.imgur.com/lns4fhz.png"] = 0, + -- minus eight + ["https://i.imgur.com/9t3rPTQ.png"] = 0, + -- minus seven + ["https://i.imgur.com/4WRD42n.png"] = 0, + -- minus six + ["https://i.imgur.com/c9qdSzS.png"] = 0, + -- minus five + ["https://i.imgur.com/3Ym1IeG.png"] = 0, + -- minus four + ["https://i.imgur.com/qrgGQRD.png"] = 0, + -- minus three + ["https://i.imgur.com/yfs8gHq.png"] = 0, + -- minus two + ["https://i.imgur.com/bfTg2hb.png"] = 0, + -- minus one + ["https://i.imgur.com/w3XbrCC.png"] = 0, + -- zero + ["https://i.imgur.com/btEtVfd.png"] = 0, + -- plus one + ["https://i.imgur.com/uIx8jbY.png"] = 0, + -- elder thing + ["https://i.imgur.com/ttnspKt.png"] = 0, + -- bless + ["http://cloud-3.steamusercontent.com/ugc/1011565208488650618/B2B081032AF3EFDBD90840A5D6888A3CEA228D66/"] = 0, + -- elder sign + ["https://i.imgur.com/nEmqjmj.png"] = 0, +} + +IMAGE_TOKEN_MAP = { + -- cultist + ["https://i.imgur.com/VzhJJaH.png"] = "cultist", + -- skull + ["https://i.imgur.com/stbBxtx.png"] = "skull", + -- tablet + ["https://i.imgur.com/1plY463.png"] = "tablet", + -- elder thing + ["https://i.imgur.com/ttnspKt.png"] = "Elder Thing", + -- curse + ["http://cloud-3.steamusercontent.com/ugc/1011565208488654691/8F0B399048EBC34CD24B99AAD415AEC40E679C65/"] = "curse", + -- tentacle + ["https://i.imgur.com/lns4fhz.png"] = "Auto-Fail", + -- minus eight + ["https://i.imgur.com/9t3rPTQ.png"] = "-8", + -- minus seven + ["https://i.imgur.com/4WRD42n.png"] = "-7", + -- minus six + ["https://i.imgur.com/c9qdSzS.png"] = "-6", + -- minus five + ["https://i.imgur.com/3Ym1IeG.png"] = "-5", + -- minus four + ["https://i.imgur.com/qrgGQRD.png"] = "-4", + -- minus three + ["https://i.imgur.com/yfs8gHq.png"] = "-3", + -- minus two + ["https://i.imgur.com/bfTg2hb.png"] = "-2", + -- minus one + ["https://i.imgur.com/w3XbrCC.png"] = "-1", + -- zero + ["https://i.imgur.com/btEtVfd.png"] = "0", + -- plus one + ["https://i.imgur.com/uIx8jbY.png"] = "+1", + -- bless + ["http://cloud-3.steamusercontent.com/ugc/1011565208488650618/B2B081032AF3EFDBD90840A5D6888A3CEA228D66/"] = "bless", + -- elder sign + ["https://i.imgur.com/nEmqjmj.png"] = "Elder Sign", +} + +function resetStats() + for key,value in pairs(PULLS) do + PULLS[key] = 0 + end + for playerKey, playerValue in pairs(PLAYER_PULLS) do + for key,value in pairs(PULLS) do + PLAYER_PULLS[playerKey][key] = value + end + end + + +end + +function getPlayerName(playerMatGuid) + local playerColour = MAT_GUID_TO_COLOUR[playerMatGuid] + if Player[playerColour].seated then + return Player[playerColour].steam_name + else + return playerColour + end +end + +function printStats() + local squidKing = "Nobody" + local maxSquid = 0 + + printToAll("\nOverall Game stats\n") + printNonZeroTokenPairs(PULLS) + printToAll("\nIndividual Stats\n") + for playerMatGuid, countTable in pairs(PLAYER_PULLS) do + local playerName = getPlayerName(playerMatGuid) + printToAll(playerName .. " Stats", {r=255,g=0,b=0}) + printNonZeroTokenPairs(PLAYER_PULLS[playerMatGuid]) + playerSquidCount = PLAYER_PULLS[playerMatGuid]["https://i.imgur.com/lns4fhz.png"] + if playerSquidCount != nil and playerSquidCount > maxSquid then + squidKing = playerName + end + end + printToAll(squidKing .. " is an auto-fail magnet.", {r=255,g=0,b=0}) +end + +function printNonZeroTokenPairs(theTable) + for key,value in pairs(theTable) do + if value != 0 then + printToAll(IMAGE_TOKEN_MAP[key] .. '=' .. tostring(value)) + end + end +end + +-- Remove comments to enable autorotate cards on hands. +-- function onObjectEnterScriptingZone(zone, object) +-- Autorotate cards with right side up when entering hand. +-- if zone.getGUID() == "c506bf" or -- white +-- zone.getGUID() == "cbc751" then -- orange +-- object.setRotationSmooth({0,270,0}) +-- elseif zone.getGUID() == "67ce9a" then -- green +-- object.setRotationSmooth({0,0,0}) +-- elseif zone.getGUID() == "57c22c" then -- red +-- object.setRotationSmooth({0,180,0}) +--end +--end + +function findInRadiusBy(pos, radius, filter, debug) + local radius = (radius or 1) + local objList = Physics.cast({ + origin = pos, + direction = {0,1,0}, + type = 2, + size = {radius, radius, radius}, + max_distance = 0, + debug = (debug or false) + }) + + local filteredList = {} + for _, obj in ipairs(objList) do + if filter == nil then + table.insert(filteredList, obj.hit_object) + elseif filter and filter(obj.hit_object) then + table.insert(filteredList, obj.hit_object) + end + end + return filteredList +end + +function dealCardsInRows(paramlist) + local currPosition={}; + local numRow=1; + local numCard=0; + local invMultiplier=1; + local allCardsDealed=0; + if paramlist.inverse then + invMultiplier=-1; + end + if paramlist.maxCardsDealed==nil then + + allCardsDealed=0; + paramlist.maxCardsDealed=paramlist.cardDeck.getQuantity() + + elseif paramlist.maxCardsDealed>=paramlist.cardDeck.getQuantity() or paramlist.maxCardsDealed<=0 then + + allCardsDealed=0; + paramlist.maxCardsDealed=paramlist.cardDeck.getQuantity() + + else + + allCardsDealed=1; + + end + + if paramlist.mode=="x" then + currPosition={paramlist.iniPosition[1]+(2*g_cardWith*invMultiplier*allCardsDealed),paramlist.iniPosition[2],paramlist.iniPosition[3]}; + + else + currPosition={paramlist.iniPosition[1],paramlist.iniPosition[2],paramlist.iniPosition[3]+(2*g_cardWith*invMultiplier*allCardsDealed)}; + + end + + for i = 1,paramlist.maxCardsDealed,1 do + + paramlist.cardDeck.takeObject + ({ + position= currPosition, + smooth= true + }); + + numCard=numCard+1; + if numCard>=paramlist.maxCardRow then + + if paramlist.mode=="x" then + currPosition={paramlist.iniPosition[1]+(2*g_cardWith*invMultiplier*allCardsDealed),paramlist.iniPosition[2],paramlist.iniPosition[3]}; + currPosition[3]=currPosition[3]-(numRow*g_cardHeigth*invMultiplier); + else + currPosition={paramlist.iniPosition[1],paramlist.iniPosition[2],paramlist.iniPosition[3]+(2*g_cardWith*invMultiplier*allCardsDealed)}; + currPosition[1]=currPosition[1]+(numRow*g_cardHeigth*invMultiplier); + end + numCard=0; + numRow=numRow+1; + + else + if paramlist.mode=="x" then + currPosition[1]=currPosition[1]+(g_cardWith*invMultiplier); + else + currPosition[3]=currPosition[3]+(g_cardWith*invMultiplier); + end + end + end +end + +function isDeck(x) + return x.tag == 'Deck' +end + +function isCardOrDeck(x) + return x.tag == 'Card' or isDeck(x) +end + +function drawEncountercard(params) --[[ Parameter Table Position, Table Rotation]] + local position = params[1] + local rotation = params[2] + local isFaceUp = params[3] + local faceUpRotation + if (isFaceUp) then + faceUpRotation = 0 + else + faceUpRotation = 180 + end + local items = findInRadiusBy(ENCOUNTER_DECK_POS, 4, isCardOrDeck) + if #items > 0 then + for i, v in ipairs(items) do + if v.tag == 'Deck' then + v.takeObject({index = 0, position = position, rotation = {0,rotation.y,faceUpRotation}}) + return + end + end +-- we didn't find the deck so just pull the first thing we did find + items[1].setPositionSmooth(position, false, false) + items[1].setRotationSmooth({0,rotation.y,faceUpRotation}, false, false) + return + end +-- nothing here, time to reshuffle + reshuffleEncounterDeck(position, {0,rotation.y,faceUpRotation}) +end + +IS_RESHUFFLING = false +function reshuffleEncounterDeck(position, rotation) + -- finishes moving the deck back and draws a card + local function move(deck) + deck.setPositionSmooth(ENCOUNTER_DECK_SPAWN_POS, true, false) + deck.takeObject({index = 0, position = position, rotation = rotation, flip = false}) + Wait.time(function() IS_RESHUFFLING = false end, 1) + end + -- bail out if we're mid reshuffle + if IS_RESHUFFLING then + return + end + local discarded = findInRadiusBy(ENCOUNTER_DECK_DISCARD_POSITION, 4, isDeck) + if #discarded > 0 then + IS_RESHUFFLING = true + local deck = discarded[1] + if not deck.is_face_down then + deck.flip() + end + deck.shuffle() + Wait.time(|| move(deck), 0.3) + else + printToAll("couldn't find encounter discard pile to reshuffle", {1, 0, 0}) + end +end + +CHAOS_TOKENS = {} +CHAOS_TOKENS_LAST_MAT = nil +function putBackChaosTokens() + local chaosbagposition = chaosbag.getPosition() + for k, token in pairs(CHAOS_TOKENS) do + if token != nil then + chaosbag.putObject(token) + token.setPosition({chaosbagposition[1],chaosbagposition[2]+0.5,chaosbagposition[3]}) + end + end + CHAOS_TOKENS = {} + end + +function drawChaostoken(params) + local mat = params[1] + local tokenOffset = params[2] + local isRightClick = params[3] + local isSameMat = (CHAOS_TOKENS_LAST_MAT == nil or CHAOS_TOKENS_LAST_MAT == mat) + if not isSameMat then + putBackChaosTokens() + end + CHAOS_TOKENS_LAST_MAT = mat + -- if we have left clicked and have no tokens OR if we have right clicked + if isRightClick or #CHAOS_TOKENS == 0 then + local items = getObjectFromGUID("83ef06").getObjects() + for i,v in ipairs(items) do + if items[i].getDescription() == "Chaos Bag" then + chaosbag = getObjectFromGUID(items[i].getGUID()) + break + end + end + -- bail out if we have no tokens + if #chaosbag.getObjects() == 0 then + return + end + chaosbag.shuffle() + -- add the token to the list, compute new position based on list length + tokenOffset[1] = tokenOffset[1] + (0.17 * #CHAOS_TOKENS) + local toPosition = mat.positionToWorld(tokenOffset) + local token = chaosbag.takeObject({ + index = 0, + position = toPosition, + rotation = mat.getRotation(), + callback_function = function(obj) take_callback(obj, mat) end + }) + CHAOS_TOKENS[#CHAOS_TOKENS + 1] = token + return + else + putBackChaosTokens() + end +end + +function spawnToken(params) + -- Position to spawn, + -- rotation vector to apply + -- translation vector to apply + -- token type + local position = params[1] + local tokenType = params[2] + local tokenData = TOKEN_DATA[tokenType] + if tokenData == nil then + error("no token data found for '" .. tokenType .. "'") + end + + local token = spawnObject({ + type = 'Custom_Token', + position = position, + rotation = {x=0, y=270, z=0} + }) + token.setCustomObject({ + image = tokenData['image'], + thickness = 0.3, + merge_distance = 5.0, + stackable = true, + }) + token.use_snap_points=false + token.scale(tokenData['scale']) + return token +end + +function round(params) -- Parameter (int number, int numberDecimalPlaces) + return tonumber(string.format("%." .. (params[2] or 0) .. "f", params[1])) +end + +function roundposition(params) -- Parameter (Table position) + return {round({params[1], 2}),round({params[2], 2}),round({params[3], 2})} +end + +function isEqual(params) --Parameter (Table table1, Table table2) returns true if the tables are equal + if params[1][1] == params[2][1] and params[1][2] == params[2][2] and params[1][3] == params[2][3] then + return true + else + return false + end +end + +function isFaceup(params) --Object object + if params.getRotation()[3] > -5 and params.getRotation()[3] < 5 then + return true + else + return false + end +end + +--Difficulty selector script + +function createSetupButtons(args) + local data = getDataValue('modeData', args.key) + if data ~= nil then + local z = -0.15 + if data.easy ~= nil then + args.object.createButton({ + label = 'Easy', + click_function = 'easyClick', + function_owner = args.object, + position = {0, 0.1, z}, + rotation = {0, 0, 0}, + scale = {0.47, 1, 0.47}, + height = 200, + width = 1150, + font_size = 100, + color = {0.87, 0.8, 0.70}, + font_color = {0, 0, 0} + }) + z = z + 0.20 + end + if data.normal ~= nil then + args.object.createButton({ + label = 'Standard', + click_function = 'normalClick', + function_owner = args.object, + position = {0, 0.1, z}, + rotation = {0, 0, 0}, + scale = {0.47, 1, 0.47}, + height = 200, + width = 1150, + font_size = 100, + color = {0.87, 0.8, 0.70}, + font_color = {0, 0, 0} + }) + z = z + 0.20 + end + if data.hard ~= nil then + args.object.createButton({ + label = 'Hard', + click_function = 'hardClick', + function_owner = args.object, + position = {0, 0.1, z}, + rotation = {0, 0, 0}, + scale = {0.47, 1, 0.47}, + height = 200, + width = 1150, + font_size = 100, + color = {0.87, 0.8, 0.70}, + font_color = {0, 0, 0} + }) + z = z + 0.20 + end + if data.expert ~= nil then + args.object.createButton({ + label = 'Expert', + click_function = 'expertClick', + function_owner = args.object, + position = {0, 0.1, z}, + rotation = {0, 0, 0}, + scale = {0.47, 1, 0.47}, + height = 200, + width = 1150, + font_size = 100, + color = {0.87, 0.8, 0.70}, + font_color = {0, 0, 0} + }) + z = z + 0.20 + end + z = z + 0.10 + if data.standalone ~= nil then + args.object.createButton({ + label = 'Standalone', + click_function = 'standaloneClick', + function_owner = args.object, + position = {0, 0.1, z}, + rotation = {0, 0, 0}, + scale = {0.47, 1, 0.47}, + height = 200, + width = 1150, + font_size = 100, + color = {0.87, 0.8, 0.70}, + font_color = {0, 0, 0} + }) + end + end +end + +function fillContainer(args) + local container = getObjectCache(containerId) + + if container ~= nil then + local data = getDataValue('modeData', args.key) + if data == nil then return end + + local value = data[args.mode] + if value == nil or value.token == nil then return end + + local pos = container.getPosition() + if args.object ~= nil then + pos = args.object.getPosition() + end + + cleanContainer(container) + + for _, token in ipairs(value.token) do + local obj = spawnToken_2(token, pos) + if obj ~= nil then + container.putObject(obj) + end + end + + if value.append ~= nil then + for _, token in ipairs(value.append) do + local obj = spawnToken_2(token, pos) + if obj ~= nil then + container.putObject(obj) + end + end + end + + if value.random then + local n = #value.random + if n > 0 then + for _, token in ipairs(value.random[getRandomCount(n)]) do + local obj = spawnToken_2(token, pos) + if obj ~= nil then + container.putObject(obj) + end + end + end + end + + if value.message then + broadcastToAll(value.message) + end + if value.warning then + broadcastToAll(value.warning, { 1, 0.5, 0.5 }) + end + end +end + +function spawnToken_2(id, pos) + local url = getImageUrl(id) + if url ~= '' then + local obj = spawnObject({ + type = 'Custom_Tile', + position = {pos.x, pos.y + 3, pos.z}, + rotation = {x = 0, y = 260, z = 0} + }) + obj.setCustomObject({ + type = 2, + image = url, + thickness = 0.10, + }) + obj.scale {0.81, 1, 0.81} + return obj + end +end + +function getImageUrl(id) + if id == 'p1' then return 'https://i.imgur.com/uIx8jbY.png' end + if id == '0' then return 'https://i.imgur.com/btEtVfd.png' end + if id == 'm1' then return 'https://i.imgur.com/w3XbrCC.png' end + if id == 'm2' then return 'https://i.imgur.com/bfTg2hb.png' end + if id == 'm3' then return 'https://i.imgur.com/yfs8gHq.png' end + if id == 'm4' then return 'https://i.imgur.com/qrgGQRD.png' end + if id == 'm5' then return 'https://i.imgur.com/3Ym1IeG.png' end + if id == 'm6' then return 'https://i.imgur.com/c9qdSzS.png' end + if id == 'm7' then return 'https://i.imgur.com/4WRD42n.png' end + if id == 'm8' then return 'https://i.imgur.com/9t3rPTQ.png' end + if id == 'skull' then return 'https://i.imgur.com/stbBxtx.png' end + if id == 'cultist' then return 'https://i.imgur.com/VzhJJaH.png' end + if id == 'tablet' then return 'https://i.imgur.com/1plY463.png' end + if id == 'elder' then return 'https://i.imgur.com/ttnspKt.png' end + if id == 'red' then return 'https://i.imgur.com/lns4fhz.png' end + if id == 'blue' then return 'https://i.imgur.com/nEmqjmj.png' end + return '' +end + +function cleanContainer(container) + for _, item in ipairs(container.getObjects()) do + destroyObject(container.takeObject({})) + end +end + +function getObjectsInZone(zoneId) + local zoneObject = getObjectCache(zoneId) + + if zoneObject == nil then + return + end + + local objectsInZone = zoneObject.getObjects() + local objectsFound = {} + + for i = 1, #objectsInZone do + local object = objectsInZone[i] + if object.tag == 'Bag' then + table.insert(objectsFound, object.guid) + end + end + + if #objectsFound > 0 then + return objectsFound + end +end + +function getObjectCache(id) + if CACHE.object[id] == nil then + CACHE.object[id] = getObjectFromGUID(id) + end + return CACHE.object[id] +end + +function getDataTable(storage) + if CACHE.data[storage] == nil then + local obj = getObjectCache(tokenDataId) + if obj ~= nil then + CACHE.data[storage] = obj.getTable(storage) + end + end + return CACHE.data[storage] +end + +function getDataValue(storage, key) + local data = getDataTable(storage) + if data ~= nil then + local value = data[key] + if value ~= nil then + local res = {} + for m, v in pairs(value) do + res[m] = v + if res[m].parent ~= nil then + local parentData = getDataValue(storage, res[m].parent) + if parentData ~= nil and parentData[m] ~= nil and parentData[m].token ~= nil then + res[m].token = parentData[m].token + end + res[m].parent = nil + end + end + return res + end + end +end + +function getRandomCount(to) + updateRandomSeed() + return math.random(1, to) +end + +function updateRandomSeed() + local chance = math.random(1,10) + if chance == 1 then + math.randomseed(os.time()) + end +end + diff --git a/unpacked/Custom_Model 032300.ttslua b/unpacked/Custom_Model 032300.ttslua index 3308d2100..e92143ce9 100644 --- a/unpacked/Custom_Model 032300.ttslua +++ b/unpacked/Custom_Model 032300.ttslua @@ -1,113 +1,113 @@ ---Counting Bowl by MrStump - ---Table of items which can be counted in this Bowl ---Each entry has 2 things to enter - --a name (what is in the name field of that object) - --a value (how much it is worth) ---A number in the items description will override the number entry in this table -validCountItemList = { - ["Clue"] = 1, - [""] = 1, - --["Name3"] = 2, - --["Name4"] = 31, - --Add more entries as needed - --Remove the -- from before a line for the script to use it -} - ---END OF CODE TO EDIT - -function onLoad() - timerID = self.getGUID()..math.random(9999999999999) - --Sets position/color for the button, spawns it - self.createButton({ - label="", click_function="removeAllClues", function_owner=self, - position={0,0,0}, rotation={0,8,0}, height=0, width=0, - font_color={0,0,0}, font_size=2000 - }) - --Start timer which repeats forever, running countItems() every second - Timer.create({ - identifier=timerID, - function_name="countItems", function_owner=self, - repetitions=0, delay=1 - }) - exposedValue = 0 - trashCan = getObjectFromGUID("147e80") -end - -function findValidItemsInSphere() - return filterByValidity(findItemsInSphere()) -end - ---Activated once per second, counts items in bowls -function countItems() - local totalValue = -1 - local countableItems = findValidItemsInSphere() - for ind, entry in ipairs(countableItems) do - local descValue = tonumber(entry.hit_object.getDescription()) - local stackMult = math.abs(entry.hit_object.getQuantity()) - --Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - --Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult - end - end - exposedValue = totalValue - --Updates the number display - self.editButton({index=0, label=totalValue}) -end - -function filterByValidity(items) - retval = {} - for _, entry in ipairs(items) do - --Ignore the bowl - if entry.hit_object ~= self then - --Ignore if not in validCountItemList - local tableEntry = validCountItemList[entry.hit_object.getName()] - if tableEntry ~= nil then - table.insert(retval, entry) - end - end - end - return retval -end - - ---Gets the items in the bowl for countItems to count -function findItemsInSphere() - --Find scaling factor - local scale = self.getScale() - --Set position for the sphere - local pos = self.getPosition() - pos.y=pos.y+(1.25*scale.y) - --Ray trace to get all objects - return Physics.cast({ - origin=pos, direction={0,1,0}, type=2, max_distance=0, - size={6*scale.x,6*scale.y,6*scale.z}, --debug=true - }) -end - -function removeAllClues() - startLuaCoroutine(self, "clueRemovalCoroutine") -end - -function clueRemovalCoroutine() - for _, entry in ipairs(findValidItemsInSphere()) do - -- Do not put the table in the garbage - if entry.hit_object.getGUID() ~= "4ee1f2" then - --delay for animation purposes - for k=1,10 do - coroutine.yield(0) - end - trashCan.putObject(entry.hit_object) - end - end - --coroutines must return a value - return 1 -end - - -function onDestroy() - Timer.destroy(timerID) +--Counting Bowl by MrStump + +--Table of items which can be counted in this Bowl +--Each entry has 2 things to enter + --a name (what is in the name field of that object) + --a value (how much it is worth) +--A number in the items description will override the number entry in this table +validCountItemList = { + ["Clue"] = 1, + [""] = 1, + --["Name3"] = 2, + --["Name4"] = 31, + --Add more entries as needed + --Remove the -- from before a line for the script to use it +} + +--END OF CODE TO EDIT + +function onLoad() + timerID = self.getGUID()..math.random(9999999999999) + --Sets position/color for the button, spawns it + self.createButton({ + label="", click_function="removeAllClues", function_owner=self, + position={0,0,0}, rotation={0,8,0}, height=0, width=0, + font_color={0,0,0}, font_size=2000 + }) + --Start timer which repeats forever, running countItems() every second + Timer.create({ + identifier=timerID, + function_name="countItems", function_owner=self, + repetitions=0, delay=1 + }) + exposedValue = 0 + trashCan = getObjectFromGUID("147e80") +end + +function findValidItemsInSphere() + return filterByValidity(findItemsInSphere()) +end + +--Activated once per second, counts items in bowls +function countItems() + local totalValue = -1 + local countableItems = findValidItemsInSphere() + for ind, entry in ipairs(countableItems) do + local descValue = tonumber(entry.hit_object.getDescription()) + local stackMult = math.abs(entry.hit_object.getQuantity()) + --Use value in description if available + if descValue ~= nil then + totalValue = totalValue + descValue * stackMult + else + --Otherwise use the value in validCountItemList + totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult + end + end + exposedValue = totalValue + --Updates the number display + self.editButton({index=0, label=totalValue}) +end + +function filterByValidity(items) + retval = {} + for _, entry in ipairs(items) do + --Ignore the bowl + if entry.hit_object ~= self then + --Ignore if not in validCountItemList + local tableEntry = validCountItemList[entry.hit_object.getName()] + if tableEntry ~= nil then + table.insert(retval, entry) + end + end + end + return retval +end + + +--Gets the items in the bowl for countItems to count +function findItemsInSphere() + --Find scaling factor + local scale = self.getScale() + --Set position for the sphere + local pos = self.getPosition() + pos.y=pos.y+(1.25*scale.y) + --Ray trace to get all objects + return Physics.cast({ + origin=pos, direction={0,1,0}, type=2, max_distance=0, + size={6*scale.x,6*scale.y,6*scale.z}, --debug=true + }) +end + +function removeAllClues() + startLuaCoroutine(self, "clueRemovalCoroutine") +end + +function clueRemovalCoroutine() + for _, entry in ipairs(findValidItemsInSphere()) do + -- Do not put the table in the garbage + if entry.hit_object.getGUID() ~= "4ee1f2" then + --delay for animation purposes + for k=1,10 do + coroutine.yield(0) + end + trashCan.putObject(entry.hit_object) + end + end + --coroutines must return a value + return 1 +end + + +function onDestroy() + Timer.destroy(timerID) end \ No newline at end of file diff --git a/unpacked/Custom_Model 1769ed.ttslua b/unpacked/Custom_Model 1769ed.ttslua index 3308d2100..e92143ce9 100644 --- a/unpacked/Custom_Model 1769ed.ttslua +++ b/unpacked/Custom_Model 1769ed.ttslua @@ -1,113 +1,113 @@ ---Counting Bowl by MrStump - ---Table of items which can be counted in this Bowl ---Each entry has 2 things to enter - --a name (what is in the name field of that object) - --a value (how much it is worth) ---A number in the items description will override the number entry in this table -validCountItemList = { - ["Clue"] = 1, - [""] = 1, - --["Name3"] = 2, - --["Name4"] = 31, - --Add more entries as needed - --Remove the -- from before a line for the script to use it -} - ---END OF CODE TO EDIT - -function onLoad() - timerID = self.getGUID()..math.random(9999999999999) - --Sets position/color for the button, spawns it - self.createButton({ - label="", click_function="removeAllClues", function_owner=self, - position={0,0,0}, rotation={0,8,0}, height=0, width=0, - font_color={0,0,0}, font_size=2000 - }) - --Start timer which repeats forever, running countItems() every second - Timer.create({ - identifier=timerID, - function_name="countItems", function_owner=self, - repetitions=0, delay=1 - }) - exposedValue = 0 - trashCan = getObjectFromGUID("147e80") -end - -function findValidItemsInSphere() - return filterByValidity(findItemsInSphere()) -end - ---Activated once per second, counts items in bowls -function countItems() - local totalValue = -1 - local countableItems = findValidItemsInSphere() - for ind, entry in ipairs(countableItems) do - local descValue = tonumber(entry.hit_object.getDescription()) - local stackMult = math.abs(entry.hit_object.getQuantity()) - --Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - --Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult - end - end - exposedValue = totalValue - --Updates the number display - self.editButton({index=0, label=totalValue}) -end - -function filterByValidity(items) - retval = {} - for _, entry in ipairs(items) do - --Ignore the bowl - if entry.hit_object ~= self then - --Ignore if not in validCountItemList - local tableEntry = validCountItemList[entry.hit_object.getName()] - if tableEntry ~= nil then - table.insert(retval, entry) - end - end - end - return retval -end - - ---Gets the items in the bowl for countItems to count -function findItemsInSphere() - --Find scaling factor - local scale = self.getScale() - --Set position for the sphere - local pos = self.getPosition() - pos.y=pos.y+(1.25*scale.y) - --Ray trace to get all objects - return Physics.cast({ - origin=pos, direction={0,1,0}, type=2, max_distance=0, - size={6*scale.x,6*scale.y,6*scale.z}, --debug=true - }) -end - -function removeAllClues() - startLuaCoroutine(self, "clueRemovalCoroutine") -end - -function clueRemovalCoroutine() - for _, entry in ipairs(findValidItemsInSphere()) do - -- Do not put the table in the garbage - if entry.hit_object.getGUID() ~= "4ee1f2" then - --delay for animation purposes - for k=1,10 do - coroutine.yield(0) - end - trashCan.putObject(entry.hit_object) - end - end - --coroutines must return a value - return 1 -end - - -function onDestroy() - Timer.destroy(timerID) +--Counting Bowl by MrStump + +--Table of items which can be counted in this Bowl +--Each entry has 2 things to enter + --a name (what is in the name field of that object) + --a value (how much it is worth) +--A number in the items description will override the number entry in this table +validCountItemList = { + ["Clue"] = 1, + [""] = 1, + --["Name3"] = 2, + --["Name4"] = 31, + --Add more entries as needed + --Remove the -- from before a line for the script to use it +} + +--END OF CODE TO EDIT + +function onLoad() + timerID = self.getGUID()..math.random(9999999999999) + --Sets position/color for the button, spawns it + self.createButton({ + label="", click_function="removeAllClues", function_owner=self, + position={0,0,0}, rotation={0,8,0}, height=0, width=0, + font_color={0,0,0}, font_size=2000 + }) + --Start timer which repeats forever, running countItems() every second + Timer.create({ + identifier=timerID, + function_name="countItems", function_owner=self, + repetitions=0, delay=1 + }) + exposedValue = 0 + trashCan = getObjectFromGUID("147e80") +end + +function findValidItemsInSphere() + return filterByValidity(findItemsInSphere()) +end + +--Activated once per second, counts items in bowls +function countItems() + local totalValue = -1 + local countableItems = findValidItemsInSphere() + for ind, entry in ipairs(countableItems) do + local descValue = tonumber(entry.hit_object.getDescription()) + local stackMult = math.abs(entry.hit_object.getQuantity()) + --Use value in description if available + if descValue ~= nil then + totalValue = totalValue + descValue * stackMult + else + --Otherwise use the value in validCountItemList + totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult + end + end + exposedValue = totalValue + --Updates the number display + self.editButton({index=0, label=totalValue}) +end + +function filterByValidity(items) + retval = {} + for _, entry in ipairs(items) do + --Ignore the bowl + if entry.hit_object ~= self then + --Ignore if not in validCountItemList + local tableEntry = validCountItemList[entry.hit_object.getName()] + if tableEntry ~= nil then + table.insert(retval, entry) + end + end + end + return retval +end + + +--Gets the items in the bowl for countItems to count +function findItemsInSphere() + --Find scaling factor + local scale = self.getScale() + --Set position for the sphere + local pos = self.getPosition() + pos.y=pos.y+(1.25*scale.y) + --Ray trace to get all objects + return Physics.cast({ + origin=pos, direction={0,1,0}, type=2, max_distance=0, + size={6*scale.x,6*scale.y,6*scale.z}, --debug=true + }) +end + +function removeAllClues() + startLuaCoroutine(self, "clueRemovalCoroutine") +end + +function clueRemovalCoroutine() + for _, entry in ipairs(findValidItemsInSphere()) do + -- Do not put the table in the garbage + if entry.hit_object.getGUID() ~= "4ee1f2" then + --delay for animation purposes + for k=1,10 do + coroutine.yield(0) + end + trashCan.putObject(entry.hit_object) + end + end + --coroutines must return a value + return 1 +end + + +function onDestroy() + Timer.destroy(timerID) end \ No newline at end of file diff --git a/unpacked/Custom_Model 37be78.ttslua b/unpacked/Custom_Model 37be78.ttslua index 3308d2100..e92143ce9 100644 --- a/unpacked/Custom_Model 37be78.ttslua +++ b/unpacked/Custom_Model 37be78.ttslua @@ -1,113 +1,113 @@ ---Counting Bowl by MrStump - ---Table of items which can be counted in this Bowl ---Each entry has 2 things to enter - --a name (what is in the name field of that object) - --a value (how much it is worth) ---A number in the items description will override the number entry in this table -validCountItemList = { - ["Clue"] = 1, - [""] = 1, - --["Name3"] = 2, - --["Name4"] = 31, - --Add more entries as needed - --Remove the -- from before a line for the script to use it -} - ---END OF CODE TO EDIT - -function onLoad() - timerID = self.getGUID()..math.random(9999999999999) - --Sets position/color for the button, spawns it - self.createButton({ - label="", click_function="removeAllClues", function_owner=self, - position={0,0,0}, rotation={0,8,0}, height=0, width=0, - font_color={0,0,0}, font_size=2000 - }) - --Start timer which repeats forever, running countItems() every second - Timer.create({ - identifier=timerID, - function_name="countItems", function_owner=self, - repetitions=0, delay=1 - }) - exposedValue = 0 - trashCan = getObjectFromGUID("147e80") -end - -function findValidItemsInSphere() - return filterByValidity(findItemsInSphere()) -end - ---Activated once per second, counts items in bowls -function countItems() - local totalValue = -1 - local countableItems = findValidItemsInSphere() - for ind, entry in ipairs(countableItems) do - local descValue = tonumber(entry.hit_object.getDescription()) - local stackMult = math.abs(entry.hit_object.getQuantity()) - --Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - --Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult - end - end - exposedValue = totalValue - --Updates the number display - self.editButton({index=0, label=totalValue}) -end - -function filterByValidity(items) - retval = {} - for _, entry in ipairs(items) do - --Ignore the bowl - if entry.hit_object ~= self then - --Ignore if not in validCountItemList - local tableEntry = validCountItemList[entry.hit_object.getName()] - if tableEntry ~= nil then - table.insert(retval, entry) - end - end - end - return retval -end - - ---Gets the items in the bowl for countItems to count -function findItemsInSphere() - --Find scaling factor - local scale = self.getScale() - --Set position for the sphere - local pos = self.getPosition() - pos.y=pos.y+(1.25*scale.y) - --Ray trace to get all objects - return Physics.cast({ - origin=pos, direction={0,1,0}, type=2, max_distance=0, - size={6*scale.x,6*scale.y,6*scale.z}, --debug=true - }) -end - -function removeAllClues() - startLuaCoroutine(self, "clueRemovalCoroutine") -end - -function clueRemovalCoroutine() - for _, entry in ipairs(findValidItemsInSphere()) do - -- Do not put the table in the garbage - if entry.hit_object.getGUID() ~= "4ee1f2" then - --delay for animation purposes - for k=1,10 do - coroutine.yield(0) - end - trashCan.putObject(entry.hit_object) - end - end - --coroutines must return a value - return 1 -end - - -function onDestroy() - Timer.destroy(timerID) +--Counting Bowl by MrStump + +--Table of items which can be counted in this Bowl +--Each entry has 2 things to enter + --a name (what is in the name field of that object) + --a value (how much it is worth) +--A number in the items description will override the number entry in this table +validCountItemList = { + ["Clue"] = 1, + [""] = 1, + --["Name3"] = 2, + --["Name4"] = 31, + --Add more entries as needed + --Remove the -- from before a line for the script to use it +} + +--END OF CODE TO EDIT + +function onLoad() + timerID = self.getGUID()..math.random(9999999999999) + --Sets position/color for the button, spawns it + self.createButton({ + label="", click_function="removeAllClues", function_owner=self, + position={0,0,0}, rotation={0,8,0}, height=0, width=0, + font_color={0,0,0}, font_size=2000 + }) + --Start timer which repeats forever, running countItems() every second + Timer.create({ + identifier=timerID, + function_name="countItems", function_owner=self, + repetitions=0, delay=1 + }) + exposedValue = 0 + trashCan = getObjectFromGUID("147e80") +end + +function findValidItemsInSphere() + return filterByValidity(findItemsInSphere()) +end + +--Activated once per second, counts items in bowls +function countItems() + local totalValue = -1 + local countableItems = findValidItemsInSphere() + for ind, entry in ipairs(countableItems) do + local descValue = tonumber(entry.hit_object.getDescription()) + local stackMult = math.abs(entry.hit_object.getQuantity()) + --Use value in description if available + if descValue ~= nil then + totalValue = totalValue + descValue * stackMult + else + --Otherwise use the value in validCountItemList + totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult + end + end + exposedValue = totalValue + --Updates the number display + self.editButton({index=0, label=totalValue}) +end + +function filterByValidity(items) + retval = {} + for _, entry in ipairs(items) do + --Ignore the bowl + if entry.hit_object ~= self then + --Ignore if not in validCountItemList + local tableEntry = validCountItemList[entry.hit_object.getName()] + if tableEntry ~= nil then + table.insert(retval, entry) + end + end + end + return retval +end + + +--Gets the items in the bowl for countItems to count +function findItemsInSphere() + --Find scaling factor + local scale = self.getScale() + --Set position for the sphere + local pos = self.getPosition() + pos.y=pos.y+(1.25*scale.y) + --Ray trace to get all objects + return Physics.cast({ + origin=pos, direction={0,1,0}, type=2, max_distance=0, + size={6*scale.x,6*scale.y,6*scale.z}, --debug=true + }) +end + +function removeAllClues() + startLuaCoroutine(self, "clueRemovalCoroutine") +end + +function clueRemovalCoroutine() + for _, entry in ipairs(findValidItemsInSphere()) do + -- Do not put the table in the garbage + if entry.hit_object.getGUID() ~= "4ee1f2" then + --delay for animation purposes + for k=1,10 do + coroutine.yield(0) + end + trashCan.putObject(entry.hit_object) + end + end + --coroutines must return a value + return 1 +end + + +function onDestroy() + Timer.destroy(timerID) end \ No newline at end of file diff --git a/unpacked/Custom_Model d86b7c.ttslua b/unpacked/Custom_Model d86b7c.ttslua index 3308d2100..e92143ce9 100644 --- a/unpacked/Custom_Model d86b7c.ttslua +++ b/unpacked/Custom_Model d86b7c.ttslua @@ -1,113 +1,113 @@ ---Counting Bowl by MrStump - ---Table of items which can be counted in this Bowl ---Each entry has 2 things to enter - --a name (what is in the name field of that object) - --a value (how much it is worth) ---A number in the items description will override the number entry in this table -validCountItemList = { - ["Clue"] = 1, - [""] = 1, - --["Name3"] = 2, - --["Name4"] = 31, - --Add more entries as needed - --Remove the -- from before a line for the script to use it -} - ---END OF CODE TO EDIT - -function onLoad() - timerID = self.getGUID()..math.random(9999999999999) - --Sets position/color for the button, spawns it - self.createButton({ - label="", click_function="removeAllClues", function_owner=self, - position={0,0,0}, rotation={0,8,0}, height=0, width=0, - font_color={0,0,0}, font_size=2000 - }) - --Start timer which repeats forever, running countItems() every second - Timer.create({ - identifier=timerID, - function_name="countItems", function_owner=self, - repetitions=0, delay=1 - }) - exposedValue = 0 - trashCan = getObjectFromGUID("147e80") -end - -function findValidItemsInSphere() - return filterByValidity(findItemsInSphere()) -end - ---Activated once per second, counts items in bowls -function countItems() - local totalValue = -1 - local countableItems = findValidItemsInSphere() - for ind, entry in ipairs(countableItems) do - local descValue = tonumber(entry.hit_object.getDescription()) - local stackMult = math.abs(entry.hit_object.getQuantity()) - --Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - --Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult - end - end - exposedValue = totalValue - --Updates the number display - self.editButton({index=0, label=totalValue}) -end - -function filterByValidity(items) - retval = {} - for _, entry in ipairs(items) do - --Ignore the bowl - if entry.hit_object ~= self then - --Ignore if not in validCountItemList - local tableEntry = validCountItemList[entry.hit_object.getName()] - if tableEntry ~= nil then - table.insert(retval, entry) - end - end - end - return retval -end - - ---Gets the items in the bowl for countItems to count -function findItemsInSphere() - --Find scaling factor - local scale = self.getScale() - --Set position for the sphere - local pos = self.getPosition() - pos.y=pos.y+(1.25*scale.y) - --Ray trace to get all objects - return Physics.cast({ - origin=pos, direction={0,1,0}, type=2, max_distance=0, - size={6*scale.x,6*scale.y,6*scale.z}, --debug=true - }) -end - -function removeAllClues() - startLuaCoroutine(self, "clueRemovalCoroutine") -end - -function clueRemovalCoroutine() - for _, entry in ipairs(findValidItemsInSphere()) do - -- Do not put the table in the garbage - if entry.hit_object.getGUID() ~= "4ee1f2" then - --delay for animation purposes - for k=1,10 do - coroutine.yield(0) - end - trashCan.putObject(entry.hit_object) - end - end - --coroutines must return a value - return 1 -end - - -function onDestroy() - Timer.destroy(timerID) +--Counting Bowl by MrStump + +--Table of items which can be counted in this Bowl +--Each entry has 2 things to enter + --a name (what is in the name field of that object) + --a value (how much it is worth) +--A number in the items description will override the number entry in this table +validCountItemList = { + ["Clue"] = 1, + [""] = 1, + --["Name3"] = 2, + --["Name4"] = 31, + --Add more entries as needed + --Remove the -- from before a line for the script to use it +} + +--END OF CODE TO EDIT + +function onLoad() + timerID = self.getGUID()..math.random(9999999999999) + --Sets position/color for the button, spawns it + self.createButton({ + label="", click_function="removeAllClues", function_owner=self, + position={0,0,0}, rotation={0,8,0}, height=0, width=0, + font_color={0,0,0}, font_size=2000 + }) + --Start timer which repeats forever, running countItems() every second + Timer.create({ + identifier=timerID, + function_name="countItems", function_owner=self, + repetitions=0, delay=1 + }) + exposedValue = 0 + trashCan = getObjectFromGUID("147e80") +end + +function findValidItemsInSphere() + return filterByValidity(findItemsInSphere()) +end + +--Activated once per second, counts items in bowls +function countItems() + local totalValue = -1 + local countableItems = findValidItemsInSphere() + for ind, entry in ipairs(countableItems) do + local descValue = tonumber(entry.hit_object.getDescription()) + local stackMult = math.abs(entry.hit_object.getQuantity()) + --Use value in description if available + if descValue ~= nil then + totalValue = totalValue + descValue * stackMult + else + --Otherwise use the value in validCountItemList + totalValue = totalValue + validCountItemList[entry.hit_object.getName()] * stackMult + end + end + exposedValue = totalValue + --Updates the number display + self.editButton({index=0, label=totalValue}) +end + +function filterByValidity(items) + retval = {} + for _, entry in ipairs(items) do + --Ignore the bowl + if entry.hit_object ~= self then + --Ignore if not in validCountItemList + local tableEntry = validCountItemList[entry.hit_object.getName()] + if tableEntry ~= nil then + table.insert(retval, entry) + end + end + end + return retval +end + + +--Gets the items in the bowl for countItems to count +function findItemsInSphere() + --Find scaling factor + local scale = self.getScale() + --Set position for the sphere + local pos = self.getPosition() + pos.y=pos.y+(1.25*scale.y) + --Ray trace to get all objects + return Physics.cast({ + origin=pos, direction={0,1,0}, type=2, max_distance=0, + size={6*scale.x,6*scale.y,6*scale.z}, --debug=true + }) +end + +function removeAllClues() + startLuaCoroutine(self, "clueRemovalCoroutine") +end + +function clueRemovalCoroutine() + for _, entry in ipairs(findValidItemsInSphere()) do + -- Do not put the table in the garbage + if entry.hit_object.getGUID() ~= "4ee1f2" then + --delay for animation purposes + for k=1,10 do + coroutine.yield(0) + end + trashCan.putObject(entry.hit_object) + end + end + --coroutines must return a value + return 1 +end + + +function onDestroy() + Timer.destroy(timerID) end \ No newline at end of file diff --git a/unpacked/Custom_Model Custom Data Helper c0b834.ttslua b/unpacked/Custom_Model Custom Data Helper c0b834.ttslua index fa8727391..3dbaffb65 100644 --- a/unpacked/Custom_Model Custom Data Helper c0b834.ttslua +++ b/unpacked/Custom_Model Custom Data Helper c0b834.ttslua @@ -1,37 +1,37 @@ --- set true to enable debug logging -DEBUG = false - -function log(message) - if DEBUG then - print(message) - end -end - ---[[ -Known locations and clues. We check this to determine if we should -atttempt to spawn clues, first we look for _ and if -we find nothing we look for -format is [location_guid -> clueCount] -]] -LOCATIONS_DATA_JSON = [[ -{ - "San Francisco": {"type": "fixed", "value": 1, "clueSide": "back"}, - " Arkham": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Buenos Aires": {"type": "fixed", "value": 2, "clueSide": "back"}, - " London": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Rome": {"type": "perPlayer", "value": 3, "clueSide": "front"}, - "Istanbul": {"type": "perPlayer", "value": 4, "clueSide": "front"}, - "Tokyo_123abc": {"type": "perPlayer", "value": 0, "clueSide": "back"}, +-- set true to enable debug logging +DEBUG = false + +function log(message) + if DEBUG then + print(message) + end +end + +--[[ +Known locations and clues. We check this to determine if we should +atttempt to spawn clues, first we look for _ and if +we find nothing we look for +format is [location_guid -> clueCount] +]] +LOCATIONS_DATA_JSON = [[ +{ + "San Francisco": {"type": "fixed", "value": 1, "clueSide": "back"}, + " Arkham": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Buenos Aires": {"type": "fixed", "value": 2, "clueSide": "back"}, + " London": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Rome": {"type": "perPlayer", "value": 3, "clueSide": "front"}, + "Istanbul": {"type": "perPlayer", "value": 4, "clueSide": "front"}, + "Tokyo_123abc": {"type": "perPlayer", "value": 0, "clueSide": "back"}, "Tokyo_456efg": {"type": "perPlayer", "value": 4, "clueSide": "back"}, "Tokyo": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Shanghai_123": {"type": "fixed", "value": 12, "clueSide": "front"}, - "Sydney": {"type": "fixed", "value": 0, "clueSide": "front"} -} -]] - -LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) - -function onload(save_state) - local playArea = getObjectFromGUID('721ba2') - playArea.call("updateLocations", {self.getGUID()}) -end + "Shanghai_123": {"type": "fixed", "value": 12, "clueSide": "front"}, + "Sydney": {"type": "fixed", "value": 0, "clueSide": "front"} +} +]] + +LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) + +function onload(save_state) + local playArea = getObjectFromGUID('721ba2') + playArea.call("updateLocations", {self.getGUID()}) +end diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c.ttslua +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.ttslua +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Bag Artifact Deck Setup 4285a6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.ttslua index c341fbc36..184bb21ff 100644 --- a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.ttslua +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Agatha ced1e0.ttslua @@ -1,29 +1,29 @@ function onload() b_display = { index = 0, - click_function = 'updateDisplay', - label = self.getName(), - function_owner = self, - position = {0, 1.4, 0}, - rotation = {0, 270, 0}, - width = 500, - height = 200, + click_function = 'updateDisplay', + label = self.getName(), + function_owner = self, + position = {0, 1.4, 0}, + rotation = {0, 270, 0}, + width = 500, + height = 200, font_size = 200} - local description = string.match(self.getDescription(), '%d+') - if description != '' and type(tonumber(description)) == 'number' then - b_display.font_size = tonumber(description) + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) end - - self.createButton(b_display) + + self.createButton(b_display) end -function updateDisplay() +function updateDisplay() b_display.label = self.getName() - local description = string.match(self.getDescription(), '%d+') - if description != '' and type(tonumber(description)) == 'number' then - b_display.font_size = tonumber(description) + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) end - - self.editButton(b_display) + + self.editButton(b_display) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.ttslua index c341fbc36..184bb21ff 100644 --- a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.ttslua +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Daniela b9fc9d.ttslua @@ -1,29 +1,29 @@ function onload() b_display = { index = 0, - click_function = 'updateDisplay', - label = self.getName(), - function_owner = self, - position = {0, 1.4, 0}, - rotation = {0, 270, 0}, - width = 500, - height = 200, + click_function = 'updateDisplay', + label = self.getName(), + function_owner = self, + position = {0, 1.4, 0}, + rotation = {0, 270, 0}, + width = 500, + height = 200, font_size = 200} - local description = string.match(self.getDescription(), '%d+') - if description != '' and type(tonumber(description)) == 'number' then - b_display.font_size = tonumber(description) + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) end - - self.createButton(b_display) + + self.createButton(b_display) end -function updateDisplay() +function updateDisplay() b_display.label = self.getName() - local description = string.match(self.getDescription(), '%d+') - if description != '' and type(tonumber(description)) == 'number' then - b_display.font_size = tonumber(description) + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) end - - self.editButton(b_display) + + self.editButton(b_display) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.ttslua index c341fbc36..184bb21ff 100644 --- a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.ttslua +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Darrell c3e12f.ttslua @@ -1,29 +1,29 @@ function onload() b_display = { index = 0, - click_function = 'updateDisplay', - label = self.getName(), - function_owner = self, - position = {0, 1.4, 0}, - rotation = {0, 270, 0}, - width = 500, - height = 200, + click_function = 'updateDisplay', + label = self.getName(), + function_owner = self, + position = {0, 1.4, 0}, + rotation = {0, 270, 0}, + width = 500, + height = 200, font_size = 200} - local description = string.match(self.getDescription(), '%d+') - if description != '' and type(tonumber(description)) == 'number' then - b_display.font_size = tonumber(description) + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) end - - self.createButton(b_display) + + self.createButton(b_display) end -function updateDisplay() +function updateDisplay() b_display.label = self.getName() - local description = string.match(self.getDescription(), '%d+') - if description != '' and type(tonumber(description)) == 'number' then - b_display.font_size = tonumber(description) + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) end - - self.editButton(b_display) + + self.editButton(b_display) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.ttslua index c341fbc36..184bb21ff 100644 --- a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.ttslua +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Jack 2bff9c.ttslua @@ -1,29 +1,29 @@ function onload() b_display = { index = 0, - click_function = 'updateDisplay', - label = self.getName(), - function_owner = self, - position = {0, 1.4, 0}, - rotation = {0, 270, 0}, - width = 500, - height = 200, + click_function = 'updateDisplay', + label = self.getName(), + function_owner = self, + position = {0, 1.4, 0}, + rotation = {0, 270, 0}, + width = 500, + height = 200, font_size = 200} - local description = string.match(self.getDescription(), '%d+') - if description != '' and type(tonumber(description)) == 'number' then - b_display.font_size = tonumber(description) + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) end - - self.createButton(b_display) + + self.createButton(b_display) end -function updateDisplay() +function updateDisplay() b_display.label = self.getName() - local description = string.match(self.getDescription(), '%d+') - if description != '' and type(tonumber(description)) == 'number' then - b_display.font_size = tonumber(description) + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) end - - self.editButton(b_display) + + self.editButton(b_display) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.ttslua b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.ttslua index c341fbc36..184bb21ff 100644 --- a/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.ttslua +++ b/unpacked/Custom_Model_Bag Artifact Expansion b43c9c/Custom_Model_Bag Kate e3a45e.ttslua @@ -1,29 +1,29 @@ function onload() b_display = { index = 0, - click_function = 'updateDisplay', - label = self.getName(), - function_owner = self, - position = {0, 1.4, 0}, - rotation = {0, 270, 0}, - width = 500, - height = 200, + click_function = 'updateDisplay', + label = self.getName(), + function_owner = self, + position = {0, 1.4, 0}, + rotation = {0, 270, 0}, + width = 500, + height = 200, font_size = 200} - local description = string.match(self.getDescription(), '%d+') - if description != '' and type(tonumber(description)) == 'number' then - b_display.font_size = tonumber(description) + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) end - - self.createButton(b_display) + + self.createButton(b_display) end -function updateDisplay() +function updateDisplay() b_display.label = self.getName() - local description = string.match(self.getDescription(), '%d+') - if description != '' and type(tonumber(description)) == 'number' then - b_display.font_size = tonumber(description) + local description = string.match(self.getDescription(), '%d+') + if description != '' and type(tonumber(description)) == 'number' then + b_display.font_size = tonumber(description) end - - self.editButton(b_display) + + self.editButton(b_display) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Chaos Bag fea079.ttslua b/unpacked/Custom_Model_Bag Chaos Bag fea079.ttslua index 3d2f7ab59..eba7fa0dc 100644 --- a/unpacked/Custom_Model_Bag Chaos Bag fea079.ttslua +++ b/unpacked/Custom_Model_Bag Chaos Bag fea079.ttslua @@ -1,5 +1,5 @@ -function onCollisionEnter(collision_info) - self.shuffle() - self.shuffle() - self.shuffle() +function onCollisionEnter(collision_info) + self.shuffle() + self.shuffle() + self.shuffle() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6.ttslua index a1bbfd97e..e8a8f39de 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,5,-2}, rotation={0,0,0}, height=250, width=600, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * 4 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={1.5,5,2}, rotation={0,0,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.2,5,2}, rotation={0,0,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-3.5,5,2}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Clicker", click_function="buttonClick_place", function_owner=self, - position={4.2,1,0}, rotation={0,0,0}, height=500, width=1100, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Counter", click_function="buttonClick_recall", function_owner=self, - position={-4.2,1,-0.1}, rotation={0,0,0}, height=500, width=1300, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-6,1,0}, rotation={0,90,0}, height=500, width=1200, --- font_size=350, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,5,-2}, rotation={0,0,0}, height=250, width=600, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * 4 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={1.5,5,2}, rotation={0,0,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.2,5,2}, rotation={0,0,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-3.5,5,2}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Clicker", click_function="buttonClick_place", function_owner=self, + position={4.2,1,0}, rotation={0,0,0}, height=500, width=1100, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Counter", click_function="buttonClick_recall", function_owner=self, + position={-4.2,1,-0.1}, rotation={0,0,0}, height=500, width=1300, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-6,1,0}, rotation={0,90,0}, height=500, width=1200, +-- font_size=350, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Doom counter 19768a.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Doom counter 19768a.ttslua index ee5b7a827..7aacde2cb 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Doom counter 19768a.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Doom counter 19768a.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {1,1,1,95} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {1,1,1,95} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 3f22e5.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 3f22e5.ttslua index 167a90f72..df6f93a6c 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 3f22e5.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 3f22e5.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 4111de.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 4111de.ttslua index 167a90f72..df6f93a6c 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 4111de.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 4111de.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 891403.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 891403.ttslua index 167a90f72..df6f93a6c 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 891403.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources 891403.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources db85d6.ttslua b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources db85d6.ttslua index 167a90f72..df6f93a6c 100644 --- a/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources db85d6.ttslua +++ b/unpacked/Custom_Model_Bag Clue Counter Swapper d919d6/Custom_Token Resources db85d6.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Delta Green Convergence Custom Investigators 84be1d.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Delta Green Convergence Custom Investigators 84be1d.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Delta Green Convergence Custom Investigators 84be1d.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Delta Green Convergence Custom Investigators 84be1d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Gender Swapped Investigators 33272e.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Gender Swapped Investigators 33272e.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Gender Swapped Investigators 33272e.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Gender Swapped Investigators 33272e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Idol Thoughts Custom Investigators 991ff9.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Idol Thoughts Custom Investigators 991ff9.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Idol Thoughts Custom Investigators 991ff9.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Idol Thoughts Custom Investigators 991ff9.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Investigators fba392.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Investigators fba392.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Investigators fba392.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Investigators fba392.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Player Cards 64ad17.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Player Cards 64ad17.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Player Cards 64ad17.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Kaimonogatari Custom Investigators and Player Cards 54bd65/Custom_Model_Bag Player Cards 64ad17.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Maximillion Pegasus Custom Investigator 84be1d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Pokemon Eldritch Edition Custom Investigators 1fb7ce.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Pokemon Eldritch Edition Custom Investigators 1fb7ce.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Pokemon Eldritch Edition Custom Investigators 1fb7ce.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Pokemon Eldritch Edition Custom Investigators 1fb7ce.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Strange Aeons Custom Investigators 991ff9.ttslua b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Strange Aeons Custom Investigators 991ff9.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Strange Aeons Custom Investigators 991ff9.ttslua +++ b/unpacked/Custom_Model_Bag Community-Created Investigators ed4ca7/Custom_Model_Bag Strange Aeons Custom Investigators 991ff9.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 2585f4.ttslua b/unpacked/Custom_Model_Bag Core 2585f4.ttslua index daed6bf90..4798d294b 100644 --- a/unpacked/Custom_Model_Bag Core 2585f4.ttslua +++ b/unpacked/Custom_Model_Bag Core 2585f4.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 64a613.ttslua b/unpacked/Custom_Model_Bag Core 64a613.ttslua index beb7e9fed..c99612b1a 100644 --- a/unpacked/Custom_Model_Bag Core 64a613.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111/Custom_Tile Core Difficulty 92d5f1.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111/Custom_Tile Core Difficulty 92d5f1.ttslua index c7ea585c8..ce26fb1d9 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111/Custom_Tile Core Difficulty 92d5f1.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 1 The Gathering 667111/Custom_Tile Core Difficulty 92d5f1.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96/Custom_Tile Core Set 8112ff.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96/Custom_Tile Core Set 8112ff.ttslua index c7ea585c8..ce26fb1d9 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96/Custom_Tile Core Set 8112ff.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 2 The Midnight Masks c38c96/Custom_Tile Core Set 8112ff.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0/Custom_Tile The Devourer Below 37feeb.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0/Custom_Tile The Devourer Below 37feeb.ttslua index 5d1d47cbd..a4eeff852 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0/Custom_Tile The Devourer Below 37feeb.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Model_Bag 3 The Devourer Below 2130f0/Custom_Tile The Devourer Below 37feeb.ttslua @@ -1,21 +1,21 @@ -name = 'The Devourer Below' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Devourer Below' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Core 64a613/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua b/unpacked/Custom_Model_Bag Core 64a613/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua index a86ae03a8..40b104bf0 100644 --- a/unpacked/Custom_Model_Bag Core 64a613/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua +++ b/unpacked/Custom_Model_Bag Core 64a613/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua @@ -1,679 +1,679 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First checkbox - { - pos = {-0.62,0.1,0.056}, - size = 400, - state = false - }, - --Second checkbox - { - pos = {-0.629,0.1,0.199}, - size = 400, - state = false - }, - --Third checkbox - { - pos = {-0.594,0.1,0.355}, - size = 400, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Killed Textbox - { - pos = {-0.4,0.1,0.68}, - rows = 8, - width = 3800, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {0.507,0.1,0.15}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists interrogated - { - pos = {0.507,0.1,0.509}, - rows = 4, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists got away - { - pos = {0.507,0.1,0.771}, - rows = 4, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First checkbox + { + pos = {-0.62,0.1,0.056}, + size = 400, + state = false + }, + --Second checkbox + { + pos = {-0.629,0.1,0.199}, + size = 400, + state = false + }, + --Third checkbox + { + pos = {-0.594,0.1,0.355}, + size = 400, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Killed Textbox + { + pos = {-0.4,0.1,0.68}, + rows = 8, + width = 3800, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {0.507,0.1,0.15}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists interrogated + { + pos = {0.507,0.1,0.509}, + rows = 4, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists got away + { + pos = {0.507,0.1,0.771}, + rows = 4, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard b7af99.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard b7af99.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard b7af99.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard b7af99.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard e19c97.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard e19c97.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard e19c97.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Eternal Slumber 4403c4/Custom_Token Scenario - EasyStandard e19c97.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - EasyStandard 535979.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - EasyStandard 535979.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - EasyStandard 535979.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - EasyStandard 535979.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - HardExpert 9ed124.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - HardExpert 9ed124.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - HardExpert 9ed124.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag Standalone ce36ec/Bag Guardians of the Abyss 0a3b78/Bag The Night's Usurper 7cf77a/Custom_Token Scenario - HardExpert 9ed124.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario 2da146.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario 2da146.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario 2da146.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario 2da146.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario dd61f1.ttslua b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario dd61f1.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario dd61f1.ttslua +++ b/unpacked/Custom_Model_Bag Encounter Sets fcfa7f/Bag The Forgotten Age 9dc850/Bag The Depths of Yoth 7f0a6d/Custom_Token Scenario dd61f1.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b.ttslua b/unpacked/Custom_Model_Bag Guardian 1d802b.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b.ttslua +++ b/unpacked/Custom_Model_Bag Guardian 1d802b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.ttslua b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.ttslua +++ b/unpacked/Custom_Model_Bag Guardian 1d802b/Custom_Model_Bag Guardian 626787.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Guardian cd002a.ttslua b/unpacked/Custom_Model_Bag Guardian cd002a.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a.ttslua +++ b/unpacked/Custom_Model_Bag Guardian cd002a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.ttslua b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.ttslua +++ b/unpacked/Custom_Model_Bag Guardian cd002a/Custom_Model_Bag Guardian 7d3988.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1.ttslua b/unpacked/Custom_Model_Bag Mystic 6117a1.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1.ttslua +++ b/unpacked/Custom_Model_Bag Mystic 6117a1.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.ttslua b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.ttslua +++ b/unpacked/Custom_Model_Bag Mystic 6117a1/Custom_Model_Bag Mystic eca770.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf.ttslua b/unpacked/Custom_Model_Bag Mystic b4d9bf.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf.ttslua +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.ttslua b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.ttslua +++ b/unpacked/Custom_Model_Bag Mystic b4d9bf/Custom_Model_Bag Mystic 17e533.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral a4d0e8.ttslua b/unpacked/Custom_Model_Bag Neutral a4d0e8.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Neutral a4d0e8.ttslua +++ b/unpacked/Custom_Model_Bag Neutral a4d0e8.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral a4d0e8/Custom_Model_Bag Neutral 06b03b.ttslua b/unpacked/Custom_Model_Bag Neutral a4d0e8/Custom_Model_Bag Neutral 06b03b.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Neutral a4d0e8/Custom_Model_Bag Neutral 06b03b.ttslua +++ b/unpacked/Custom_Model_Bag Neutral a4d0e8/Custom_Model_Bag Neutral 06b03b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd.ttslua b/unpacked/Custom_Model_Bag Neutral aef7dd.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Neutral aef7dd.ttslua +++ b/unpacked/Custom_Model_Bag Neutral aef7dd.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.ttslua b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.ttslua +++ b/unpacked/Custom_Model_Bag Neutral aef7dd/Custom_Model_Bag Neutral 3559eb.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral c5261f.ttslua b/unpacked/Custom_Model_Bag Neutral c5261f.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Neutral c5261f.ttslua +++ b/unpacked/Custom_Model_Bag Neutral c5261f.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Neutral c5261f/Custom_Model_Bag Neutral 3fe354.ttslua b/unpacked/Custom_Model_Bag Neutral c5261f/Custom_Model_Bag Neutral 3fe354.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Neutral c5261f/Custom_Model_Bag Neutral 3fe354.ttslua +++ b/unpacked/Custom_Model_Bag Neutral c5261f/Custom_Model_Bag Neutral 3fe354.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.ttslua b/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.ttslua index daed6bf90..4798d294b 100644 --- a/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.ttslua +++ b/unpacked/Custom_Model_Bag Promo Investigators 5fe24e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130.ttslua index b855e99ad..7ba1823d7 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130.ttslua @@ -1,504 +1,504 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e/Custom_Tile The Dunwich Legacy a74352.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e/Custom_Tile The Dunwich Legacy a74352.ttslua index cfa110e20..39ecc5466 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e/Custom_Tile The Dunwich Legacy a74352.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1a Extracurricular Activity d33f7e/Custom_Tile The Dunwich Legacy a74352.ttslua @@ -1,21 +1,21 @@ -name = 'The Dunwich Legacy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Dunwich Legacy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082/Custom_Tile The Dunwich Legacy 1d6227.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082/Custom_Tile The Dunwich Legacy 1d6227.ttslua index cfa110e20..39ecc5466 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082/Custom_Tile The Dunwich Legacy 1d6227.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 1b The House Always Wins f52082/Custom_Tile The Dunwich Legacy 1d6227.ttslua @@ -1,21 +1,21 @@ -name = 'The Dunwich Legacy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Dunwich Legacy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a/Custom_Tile The Miskatonic Museum 4b5e17.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a/Custom_Tile The Miskatonic Museum 4b5e17.ttslua index f92a55f33..ca89f18f6 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a/Custom_Tile The Miskatonic Museum 4b5e17.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 2 The Miskatonic Museum 87897a/Custom_Tile The Miskatonic Museum 4b5e17.ttslua @@ -1,25 +1,25 @@ -name = 'The Miskatonic Museum' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Miskatonic Museum' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86/Custom_Tile The Essex County Express 247967.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86/Custom_Tile The Essex County Express 247967.ttslua index 8942d6ff8..9ff549176 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86/Custom_Tile The Essex County Express 247967.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 3 The Essex County Express d92b86/Custom_Tile The Essex County Express 247967.ttslua @@ -1,25 +1,25 @@ -name = 'The Essex County Express' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Essex County Express' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7/Custom_Tile Blood on the Altar 92b54a.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7/Custom_Tile Blood on the Altar 92b54a.ttslua index 35359436c..b50b2762f 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7/Custom_Tile Blood on the Altar 92b54a.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 4 Blood on the Altar 1536e7/Custom_Tile Blood on the Altar 92b54a.ttslua @@ -1,25 +1,25 @@ -name = 'Blood on the Altar' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Blood on the Altar' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde/Custom_Tile Undimensioned and Unseen 393c71.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde/Custom_Tile Undimensioned and Unseen 393c71.ttslua index 796c0adfa..4da502b94 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde/Custom_Tile Undimensioned and Unseen 393c71.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 5 Undimensioned and Unseen a82dde/Custom_Tile Undimensioned and Unseen 393c71.ttslua @@ -1,25 +1,25 @@ -name = 'Undimensioned and Unseen' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Undimensioned and Unseen' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29/Custom_Tile Where Doom Awaits a621ae.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29/Custom_Tile Where Doom Awaits a621ae.ttslua index c8658d789..5f3588cb8 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29/Custom_Tile Where Doom Awaits a621ae.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 6 Where Doom Awaits 175a29/Custom_Tile Where Doom Awaits a621ae.ttslua @@ -1,25 +1,25 @@ -name = 'Where Doom Awaits' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Where Doom Awaits' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b/Custom_Tile Lost in Time and Space 64a607.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b/Custom_Tile Lost in Time and Space 64a607.ttslua index a649f8c03..09337160a 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b/Custom_Tile Lost in Time and Space 64a607.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Model_Bag 7 Lost in Time and Space 1fca6b/Custom_Tile Lost in Time and Space 64a607.ttslua @@ -1,25 +1,25 @@ -name = 'Lost in Time and Space' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Lost in Time and Space' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua index 690a83709..3d43d4f4c 100644 --- a/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Dunwich Legacy ce9130/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua @@ -1,669 +1,669 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First checkbox --- { --- pos = {-0.62,0.1,0.056}, --- size = 400, --- state = false --- }, - --Second checkbox --- { --- pos = {-0.629,0.1,0.199}, --- size = 400, --- state = false --- }, - --Third checkbox --- { --- pos = {-0.594,0.1,0.355}, --- size = 400, --- state = false --- }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.45,0.1,0.55}, - rows =18, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.384,0.1,0.228}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists interrogated - { - pos = {0.384,0.1,0.69}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First checkbox +-- { +-- pos = {-0.62,0.1,0.056}, +-- size = 400, +-- state = false +-- }, + --Second checkbox +-- { +-- pos = {-0.629,0.1,0.199}, +-- size = 400, +-- state = false +-- }, + --Third checkbox +-- { +-- pos = {-0.594,0.1,0.355}, +-- size = 400, +-- state = false +-- }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.45,0.1,0.55}, + rows =18, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.384,0.1,0.228}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists interrogated + { + pos = {0.384,0.1,0.69}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3.ttslua index b855e99ad..7ba1823d7 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3.ttslua @@ -1,504 +1,504 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2/Custom_Tile The Forgotten Age e95200.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2/Custom_Tile The Forgotten Age e95200.ttslua index 75c4561fb..200437b6c 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2/Custom_Tile The Forgotten Age e95200.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 1 Return to The Untamed Wilds 85a0c2/Custom_Tile The Forgotten Age e95200.ttslua @@ -1,21 +1,21 @@ -name = 'The Forgotten Age' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Forgotten Age' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2/Custom_Tile The Doom of Eztli 294ec4.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2/Custom_Tile The Doom of Eztli 294ec4.ttslua index 25a046b6a..5672c33bc 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2/Custom_Tile The Doom of Eztli 294ec4.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 2 Return to The Doom of Eztli 110ce2/Custom_Tile The Doom of Eztli 294ec4.ttslua @@ -1,25 +1,25 @@ -name = 'The Doom of Eztli' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Doom of Eztli' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940/Custom_Tile Threads of Fate 7a95f6.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940/Custom_Tile Threads of Fate 7a95f6.ttslua index aa256f497..0d6a8bd42 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940/Custom_Tile Threads of Fate 7a95f6.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 3 Return to Threads of Fate 499940/Custom_Tile Threads of Fate 7a95f6.ttslua @@ -1,25 +1,25 @@ -name = 'Threads of Fate' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Threads of Fate' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4/Custom_Tile The Boundary Beyond 010761.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4/Custom_Tile The Boundary Beyond 010761.ttslua index 88130bf52..f46c523bf 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4/Custom_Tile The Boundary Beyond 010761.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 4 Return to The Boundary Beyond 952af4/Custom_Tile The Boundary Beyond 010761.ttslua @@ -1,25 +1,25 @@ -name = 'The Boundary Beyond' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Boundary Beyond' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f/Custom_Tile Heart of the Elders 493cb1.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f/Custom_Tile Heart of the Elders 493cb1.ttslua index 4f3609807..5a7299c73 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f/Custom_Tile Heart of the Elders 493cb1.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 1 5abc8f/Custom_Tile Heart of the Elders 493cb1.ttslua @@ -1,25 +1,25 @@ -name = 'Heart of the Elders' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Heart of the Elders' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 2 3ccabf.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 2 3ccabf.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 2 3ccabf.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 5 Return to Heart of the Elders Part 2 3ccabf.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427/Custom_Tile The City of Archives 2fb6dc.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427/Custom_Tile The City of Archives 2fb6dc.ttslua index 787f8705f..3224092d4 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427/Custom_Tile The City of Archives 2fb6dc.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 6 Return to The City of Archives e73427/Custom_Tile The City of Archives 2fb6dc.ttslua @@ -1,25 +1,25 @@ -name = 'The City of Archives' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The City of Archives' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Tile The Depths of Yoth 7aa4e3.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Tile The Depths of Yoth 7aa4e3.ttslua index 7d9affdc4..e569e19b2 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Tile The Depths of Yoth 7aa4e3.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Tile The Depths of Yoth 7aa4e3.ttslua @@ -1,25 +1,25 @@ -name = 'The Depths of Yoth' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Depths of Yoth' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - EasyStandard dd61f1.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - EasyStandard dd61f1.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - EasyStandard dd61f1.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - EasyStandard dd61f1.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - HardExpert 2da146.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - HardExpert 2da146.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - HardExpert 2da146.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 7 Return to The Depths of Yoth 9c986e/Custom_Token Scenario - HardExpert 2da146.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7/Custom_Tile Shattered Aeons 6dc72a.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7/Custom_Tile Shattered Aeons 6dc72a.ttslua index b78ce3eb4..b31a42434 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7/Custom_Tile Shattered Aeons 6dc72a.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 8 Return to Shattered Aeons 5e83e7/Custom_Tile Shattered Aeons 6dc72a.ttslua @@ -1,21 +1,21 @@ -name = 'Shattered Aeons' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Shattered Aeons' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 9 Return to Secret Scenario 496395.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 9 Return to Secret Scenario 496395.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 9 Return to Secret Scenario 496395.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Model_Bag 9 Return to Secret Scenario 496395.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua index 3e3ff898f..682c9d34c 100644 --- a/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Forgotten Age 479ff3/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua @@ -1,691 +1,691 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Yig's Fury - { - pos = {0.097,0.1,0.88}, - size = 500, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one Supplies - { - pos = {-0.637,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two supplies - { - pos = {-0.2,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three supplies - { - pos = {0.24,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four supplies - { - pos = {0.671,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.475,0.1,0.62}, - rows =12, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.527,0.1,0.507}, - rows = 12, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Yig's Fury + { + pos = {0.097,0.1,0.88}, + size = 500, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one Supplies + { + pos = {-0.637,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two supplies + { + pos = {-0.2,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three supplies + { + pos = {0.24,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four supplies + { + pos = {0.671,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.475,0.1,0.62}, + rows =12, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.527,0.1,0.507}, + rows = 12, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a.ttslua index b855e99ad..7ba1823d7 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a.ttslua @@ -1,504 +1,504 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua index 978a9d2b5..7878134ac 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua @@ -1,21 +1,21 @@ -name = 'The Path to Carcosa' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Path to Carcosa' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua index c9acd00d0..80ce317d3 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua @@ -1,25 +1,25 @@ -name = 'The Last King' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Last King' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua index 9852aeb27..fd833106f 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua @@ -1,25 +1,25 @@ -name = 'Echoes of the Past' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Echoes of the Past' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua index f7109dddb..e78b2e78a 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua @@ -1,25 +1,25 @@ -name = 'The Unspeakable Oath' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Unspeakable Oath' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua index e092a5769..bacd5051f 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua @@ -1,25 +1,25 @@ -name = 'A Phantom of Truth' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'A Phantom of Truth' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua index 9607689ac..c36627e17 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua @@ -1,25 +1,25 @@ -name = 'The Pallid Mask' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Pallid Mask' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua index 4d4017455..512f2eed0 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua index 4d4017455..512f2eed0 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua index 78350373e..a505ccca6 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua @@ -1,25 +1,25 @@ -name = 'Black Stars Rise' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Black Stars Rise' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua index 710b4a84e..ffa409a5f 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua @@ -1,25 +1,25 @@ -name = 'Dim Carcosa' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Dim Carcosa' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Tile Carcosa Campaign Log ae8317.ttslua b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Tile Carcosa Campaign Log ae8317.ttslua index 108024431..7a861eb36 100644 --- a/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Tile Carcosa Campaign Log ae8317.ttslua +++ b/unpacked/Custom_Model_Bag Return to The Path to Carcosa e9889a/Custom_Tile Carcosa Campaign Log ae8317.ttslua @@ -1,755 +1,755 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --Doubt 1 - { - pos = {-0.482,0.1,0.776}, - size = 200, - state = false - }, - --Doubt 2 - { - pos = {-0.43,0.1,0.776}, - size = 200, - state = false - }, - --Doubt 3 - { - pos = {-0.38,0.1,0.775}, - size = 200, - state = false - }, - --Doubt 4 - { - pos = {-0.325,0.1,0.778}, - size = 200, - state = false - }, - --Doubt 5 - { - pos = {-0.27,0.1,0.779}, - size = 200, - state = false - }, - --Doubt 6 - { - pos = {-0.219,0.1,0.778}, - size = 200, - state = false - }, - --Doubt 7 - { - pos = {-0.168,0.1,0.782}, - size = 200, - state = false - }, - --Doubt 8 - { - pos = {-0.111,0.1,0.783}, - size = 200, - state = false - }, - --Conviction 1 - { - pos = {-0.736,0.1,0.868}, - size = 200, - state = false - }, - --Conviction 2 - { - pos = {-0.68,0.1,0.869}, - size = 200, - state = false - }, - --Conviction 3 - { - pos = {-0.626,0.1,0.869}, - size = 200, - state = false - }, - --Conviction 4 - { - pos = {-0.574,0.1,0.874}, - size = 200, - state = false - }, - --Conviction 5 - { - pos = {-0.519,0.1,0.874}, - size = 200, - state = false - }, - --Conviction 6 - { - pos = {-0.467,0.1,0.879}, - size = 200, - state = false - }, - --Conviction 7 - { - pos = {-0.416,0.1,0.876}, - size = 200, - state = false - }, - --Conviction 8 - { - pos = {-0.357,0.1,0.879}, - size = 200, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Chasing The Stranger - { - pos = {0.414,0.1,0.106}, - size = 500, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.38,0.1,0.339}, - rows =16, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --VIPs Interviewed - { - pos = {0.43,0.1,0.338}, - rows = 6, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --VIPs Slain - { - pos = {0.43,0.1,0.643}, - rows = 6, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --Doubt 1 + { + pos = {-0.482,0.1,0.776}, + size = 200, + state = false + }, + --Doubt 2 + { + pos = {-0.43,0.1,0.776}, + size = 200, + state = false + }, + --Doubt 3 + { + pos = {-0.38,0.1,0.775}, + size = 200, + state = false + }, + --Doubt 4 + { + pos = {-0.325,0.1,0.778}, + size = 200, + state = false + }, + --Doubt 5 + { + pos = {-0.27,0.1,0.779}, + size = 200, + state = false + }, + --Doubt 6 + { + pos = {-0.219,0.1,0.778}, + size = 200, + state = false + }, + --Doubt 7 + { + pos = {-0.168,0.1,0.782}, + size = 200, + state = false + }, + --Doubt 8 + { + pos = {-0.111,0.1,0.783}, + size = 200, + state = false + }, + --Conviction 1 + { + pos = {-0.736,0.1,0.868}, + size = 200, + state = false + }, + --Conviction 2 + { + pos = {-0.68,0.1,0.869}, + size = 200, + state = false + }, + --Conviction 3 + { + pos = {-0.626,0.1,0.869}, + size = 200, + state = false + }, + --Conviction 4 + { + pos = {-0.574,0.1,0.874}, + size = 200, + state = false + }, + --Conviction 5 + { + pos = {-0.519,0.1,0.874}, + size = 200, + state = false + }, + --Conviction 6 + { + pos = {-0.467,0.1,0.879}, + size = 200, + state = false + }, + --Conviction 7 + { + pos = {-0.416,0.1,0.876}, + size = 200, + state = false + }, + --Conviction 8 + { + pos = {-0.357,0.1,0.879}, + size = 200, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Chasing The Stranger + { + pos = {0.414,0.1,0.106}, + size = 500, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.38,0.1,0.339}, + rows =16, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --VIPs Interviewed + { + pos = {0.43,0.1,0.338}, + rows = 6, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --VIPs Slain + { + pos = {0.43,0.1,0.643}, + rows = 6, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d.ttslua index b855e99ad..7ba1823d7 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d.ttslua @@ -1,504 +1,504 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, + font_size=150, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, + font_size=150, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, + font_size=200, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,1,-2}, rotation={0,0,0}, height=240, width=500, + font_size=150, color={0,0,0}, font_color={1,1,1} + }) + +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8/Custom_Tile Core Difficulty 527f29.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8/Custom_Tile Core Difficulty 527f29.ttslua index c7ea585c8..ce26fb1d9 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8/Custom_Tile Core Difficulty 527f29.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 1 Return to The Gathering 41ebd8/Custom_Tile Core Difficulty 527f29.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c.ttslua index 34e9ba52b..d3a73c99a 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c/Custom_Tile Core Difficulty 47f3de.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c/Custom_Tile Core Difficulty 47f3de.ttslua index c7ea585c8..ce26fb1d9 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c/Custom_Tile Core Difficulty 47f3de.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 2 Return to The Midnight Masks bcc86c/Custom_Tile Core Difficulty 47f3de.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 3 Return to The Devourer Below 604753.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 3 Return to The Devourer Below 604753.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 3 Return to The Devourer Below 604753.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Model_Bag 3 Return to The Devourer Below 604753.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua index a86ae03a8..40b104bf0 100644 --- a/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua +++ b/unpacked/Custom_Model_Bag Return to the Night of the Zealot 56270d/Custom_Tile Night of the Zealot Campaign Log e0c3e7.ttslua @@ -1,679 +1,679 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First checkbox - { - pos = {-0.62,0.1,0.056}, - size = 400, - state = false - }, - --Second checkbox - { - pos = {-0.629,0.1,0.199}, - size = 400, - state = false - }, - --Third checkbox - { - pos = {-0.594,0.1,0.355}, - size = 400, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.4}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.5}, - size = 300, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.66}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.58}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.28}, - rows = 3, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Killed Textbox - { - pos = {-0.4,0.1,0.68}, - rows = 8, - width = 3800, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {0.507,0.1,0.15}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists interrogated - { - pos = {0.507,0.1,0.509}, - rows = 4, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists got away - { - pos = {0.507,0.1,0.771}, - rows = 4, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First checkbox + { + pos = {-0.62,0.1,0.056}, + size = 400, + state = false + }, + --Second checkbox + { + pos = {-0.629,0.1,0.199}, + size = 400, + state = false + }, + --Third checkbox + { + pos = {-0.594,0.1,0.355}, + size = 400, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.4}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.5}, + size = 300, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.66}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.58}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.28}, + rows = 3, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Killed Textbox + { + pos = {-0.4,0.1,0.68}, + rows = 8, + width = 3800, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {0.507,0.1,0.15}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists interrogated + { + pos = {0.507,0.1,0.509}, + rows = 4, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists got away + { + pos = {0.507,0.1,0.771}, + rows = 4, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Rogue 68d7b8.ttslua b/unpacked/Custom_Model_Bag Rogue 68d7b8.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Rogue 68d7b8.ttslua +++ b/unpacked/Custom_Model_Bag Rogue 68d7b8.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Rogue 68d7b8/Custom_Model_Bag Rogue 21d547.ttslua b/unpacked/Custom_Model_Bag Rogue 68d7b8/Custom_Model_Bag Rogue 21d547.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Rogue 68d7b8/Custom_Model_Bag Rogue 21d547.ttslua +++ b/unpacked/Custom_Model_Bag Rogue 68d7b8/Custom_Model_Bag Rogue 21d547.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d.ttslua b/unpacked/Custom_Model_Bag Rogue deaa6d.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d.ttslua +++ b/unpacked/Custom_Model_Bag Rogue deaa6d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.ttslua b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.ttslua +++ b/unpacked/Custom_Model_Bag Rogue deaa6d/Custom_Model_Bag Rogue 6c6b22.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5.ttslua b/unpacked/Custom_Model_Bag Seeker 1e7fc5.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5.ttslua +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.ttslua b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.ttslua +++ b/unpacked/Custom_Model_Bag Seeker 1e7fc5/Custom_Model_Bag Seeker d257cb.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb.ttslua b/unpacked/Custom_Model_Bag Seeker 5ec2fb.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb.ttslua +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.ttslua b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.ttslua +++ b/unpacked/Custom_Model_Bag Seeker 5ec2fb/Custom_Model_Bag Seeker b2264c.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Starter Deck Investigators 35fb9c.ttslua b/unpacked/Custom_Model_Bag Starter Deck Investigators 35fb9c.ttslua index 39c42d572..1fb1508eb 100644 --- a/unpacked/Custom_Model_Bag Starter Deck Investigators 35fb9c.ttslua +++ b/unpacked/Custom_Model_Bag Starter Deck Investigators 35fb9c.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor +12 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=800, width=800, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor +12 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=800, width=800, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Survivor 9c814b.ttslua b/unpacked/Custom_Model_Bag Survivor 9c814b.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Survivor 9c814b.ttslua +++ b/unpacked/Custom_Model_Bag Survivor 9c814b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Survivor 9c814b/Custom_Model_Bag Survivor 3c40d9.ttslua b/unpacked/Custom_Model_Bag Survivor 9c814b/Custom_Model_Bag Survivor 3c40d9.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Survivor 9c814b/Custom_Model_Bag Survivor 3c40d9.ttslua +++ b/unpacked/Custom_Model_Bag Survivor 9c814b/Custom_Model_Bag Survivor 3c40d9.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Survivor c02830.ttslua b/unpacked/Custom_Model_Bag Survivor c02830.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830.ttslua +++ b/unpacked/Custom_Model_Bag Survivor c02830.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.ttslua b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.ttslua +++ b/unpacked/Custom_Model_Bag Survivor c02830/Custom_Model_Bag Survivor 6e9c37.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 0dcbe8.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 0dcbe8.ttslua index daed6bf90..4798d294b 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 0dcbe8.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 0dcbe8.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097.ttslua index beb7e9fed..c99612b1a 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775.ttslua index ed7a62e7d..45f110e8b 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775/Custom_Tile The Circle Undone f697b0.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775/Custom_Tile The Circle Undone f697b0.ttslua index 47d018ac8..624750c7f 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775/Custom_Tile The Circle Undone f697b0.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 1 The Witching Hour 67a775/Custom_Tile The Circle Undone f697b0.ttslua @@ -1,21 +1,21 @@ -name = 'The Circle Undone' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Circle Undone' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc/Custom_Tile At Death's Doorstep b21125.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc/Custom_Tile At Death's Doorstep b21125.ttslua index 629fbd0e7..920788446 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc/Custom_Tile At Death's Doorstep b21125.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 2 At Death's Doorstep 7388bc/Custom_Tile At Death's Doorstep b21125.ttslua @@ -1,25 +1,25 @@ -name = "At Death's Doorstep" - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = "At Death's Doorstep" + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) end -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0.ttslua index 689030815..33f4391a1 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} ---w }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +--w }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0/Custom_Tile The Secret Name b21125.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0/Custom_Tile The Secret Name b21125.ttslua index 18a0d7f51..f9497f333 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0/Custom_Tile The Secret Name b21125.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 3 The Secret Name 5c79d0/Custom_Tile The Secret Name b21125.ttslua @@ -1,25 +1,25 @@ -name = 'The Secret Name' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Secret Name' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) end -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8.ttslua index ed7a62e7d..45f110e8b 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8/Custom_Tile The Wages of Sin b21125.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8/Custom_Tile The Wages of Sin b21125.ttslua index 1887450fa..512ea5569 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8/Custom_Tile The Wages of Sin b21125.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 4 The Wages of Sin 1e45e8/Custom_Tile The Wages of Sin b21125.ttslua @@ -1,25 +1,25 @@ -name = 'The Wages of Sin' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Wages of Sin' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) end -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48.ttslua index ed7a62e7d..45f110e8b 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Member of the Lodge 38a5f7.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Member of the Lodge 38a5f7.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Member of the Lodge 38a5f7.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Member of the Lodge 38a5f7.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Not a Member of the Lodge abe15f.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Not a Member of the Lodge abe15f.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Not a Member of the Lodge abe15f.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Bag Not a Member of the Lodge abe15f.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Custom_Tile For the Greater Good bbb70a.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Custom_Tile For the Greater Good bbb70a.ttslua index 0c455ba9f..4a23f1a51 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Custom_Tile For the Greater Good bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 5 For the Greater Good a61b48/Custom_Tile For the Greater Good bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'For the Greater Good' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'For the Greater Good' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a.ttslua index ed7a62e7d..45f110e8b 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a/Custom_Tile Union and Disillusion 3fe126.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a/Custom_Tile Union and Disillusion 3fe126.ttslua index a25904f3f..ce0e418ec 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a/Custom_Tile Union and Disillusion 3fe126.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 6 Union and Disillusion 20f70a/Custom_Tile Union and Disillusion 3fe126.ttslua @@ -1,25 +1,25 @@ -name = 'Union and Disillusion' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Union and Disillusion' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775.ttslua index 54d591927..0748143c2 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Anette Mason is posessed by evil d14543.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Anette Mason is posessed by evil d14543.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Anette Mason is posessed by evil d14543.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Anette Mason is posessed by evil d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Carl Sanford possesses the secrets of the universe 92c6fc.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Carl Sanford possesses the secrets of the universe 92c6fc.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Carl Sanford possesses the secrets of the universe 92c6fc.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Bag Carl Sanford possesses the secrets of the universe 92c6fc.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Custom_Tile In the Clutches of Chaos e0709b.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Custom_Tile In the Clutches of Chaos e0709b.ttslua index 89aa66922..9f9470e13 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Custom_Tile In the Clutches of Chaos e0709b.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 7 In the Clutches of Chaos 1ee775/Custom_Tile In the Clutches of Chaos e0709b.ttslua @@ -1,25 +1,25 @@ -name = 'In the Clutches of Chaos' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'In the Clutches of Chaos' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66.ttslua index 54d591927..0748143c2 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66/Custom_Tile Before the Black Throne b16392.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66/Custom_Tile Before the Black Throne b16392.ttslua index 3d469943a..7b48da20b 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66/Custom_Tile Before the Black Throne b16392.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag 8 Before the Black Throne 0fad66/Custom_Tile Before the Black Throne b16392.ttslua @@ -1,25 +1,25 @@ -name = 'Before the Black Throne' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Before the Black Throne' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a/Custom_Tile The Circle Undone 05f912.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a/Custom_Tile The Circle Undone 05f912.ttslua index 47d018ac8..624750c7f 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a/Custom_Tile The Circle Undone 05f912.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Model_Bag Prologue Disappearance at the Twilight Estate 2f008a/Custom_Tile The Circle Undone 05f912.ttslua @@ -1,21 +1,21 @@ -name = 'The Circle Undone' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Circle Undone' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Tile The Circle Undone Campaign Log 1 44a05a.ttslua b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Tile The Circle Undone Campaign Log 1 44a05a.ttslua index 274e1d634..797b18e09 100644 --- a/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Tile The Circle Undone Campaign Log 1 44a05a.ttslua +++ b/unpacked/Custom_Model_Bag The Circle Undone 63e097/Custom_Tile The Circle Undone Campaign Log 1 44a05a.ttslua @@ -1,653 +1,653 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {0.902,0.886,0.788} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.50,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.06,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.27}, - rows = 10, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.27}, - rows = 10, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.62}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.268}, - rows = 10, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.62}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.265}, - rows = 10, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.464,0.1,0.507}, - rows =16, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign NOtes 2 - { - pos = {0.344,0.1,0.187}, - rows = 10, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Mementos - { - pos = {0.351,0.1,0.744}, - rows = 12, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {0.902,0.886,0.788} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.50,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.06,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.27}, + rows = 10, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.27}, + rows = 10, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.62}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.268}, + rows = 10, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.62}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.265}, + rows = 10, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.464,0.1,0.507}, + rows =16, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign NOtes 2 + { + pos = {0.344,0.1,0.187}, + rows = 10, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Mementos + { + pos = {0.351,0.1,0.744}, + rows = 12, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a.ttslua index beb7e9fed..c99612b1a 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828.ttslua index 54d591927..0748143c2 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828/Custom_Tile Campaign A Setup 075016.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828/Custom_Tile Campaign A Setup 075016.ttslua index b26158ce8..af12e8963 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828/Custom_Tile Campaign A Setup 075016.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-A Beyond the Gates of Sleep 7f5828/Custom_Tile Campaign A Setup 075016.ttslua @@ -1,25 +1,25 @@ -name = 'TDE_A' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'TDE_A' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7.ttslua index ed7a62e7d..45f110e8b 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Model_Bag Set-aside a45247/Custom_Model_Bag Infestation Bag 0257a2.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Model_Bag Set-aside a45247/Custom_Model_Bag Infestation Bag 0257a2.ttslua index 3d2f7ab59..eba7fa0dc 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Model_Bag Set-aside a45247/Custom_Model_Bag Infestation Bag 0257a2.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Model_Bag Set-aside a45247/Custom_Model_Bag Infestation Bag 0257a2.ttslua @@ -1,5 +1,5 @@ -function onCollisionEnter(collision_info) - self.shuffle() - self.shuffle() - self.shuffle() +function onCollisionEnter(collision_info) + self.shuffle() + self.shuffle() + self.shuffle() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Tile Campaign B Setup bbb70a.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Tile Campaign B Setup bbb70a.ttslua index 4dde019f3..04f54ee0c 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Tile Campaign B Setup bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 1-B Waking Nightmare 599cb7/Custom_Tile Campaign B Setup bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'TDE_B' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'TDE_B' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca.ttslua index 5534586ac..979aaf560 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca/Custom_Tile The Search For Kadath bbb70a.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca/Custom_Tile The Search For Kadath bbb70a.ttslua index 4cdcd8644..9e2b61d86 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca/Custom_Tile The Search For Kadath bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-A The Search For Kadath 7b07ca/Custom_Tile The Search For Kadath bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'The Search For Kadath' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Search For Kadath' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86.ttslua index 5534586ac..979aaf560 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86/Custom_Tile A Thousand Shapes of Horror b53295.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86/Custom_Tile A Thousand Shapes of Horror b53295.ttslua index ba00854d4..cb91e7329 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86/Custom_Tile A Thousand Shapes of Horror b53295.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 2-B A Thousand Shapes of Horror 1b4f86/Custom_Tile A Thousand Shapes of Horror b53295.ttslua @@ -1,25 +1,25 @@ -name = 'A Thousand Shapes of Horror' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'A Thousand Shapes of Horror' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66.ttslua index 5534586ac..979aaf560 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66/Custom_Tile Dark Side of the Moon aa8d82.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66/Custom_Tile Dark Side of the Moon aa8d82.ttslua index e562e4cb3..afe917f51 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66/Custom_Tile Dark Side of the Moon aa8d82.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-A Dark Side of the Moon 0fad66/Custom_Tile Dark Side of the Moon aa8d82.ttslua @@ -1,25 +1,25 @@ -name = 'Dark Side of the Moon' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Dark Side of the Moon' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf.ttslua index 5534586ac..979aaf560 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf/Custom_Tile Point of No Return f302ab.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf/Custom_Tile Point of No Return f302ab.ttslua index eff41dc38..c08e0e3c9 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf/Custom_Tile Point of No Return f302ab.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 3-B Point of No Return 4f81cf/Custom_Tile Point of No Return f302ab.ttslua @@ -1,25 +1,25 @@ -name = 'Point of No Return' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Point of No Return' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096.ttslua index 5534586ac..979aaf560 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096/Custom_Tile Point of No Return 3e86c2.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096/Custom_Tile Point of No Return 3e86c2.ttslua index 6e4f3527f..6f6daf608 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096/Custom_Tile Point of No Return 3e86c2.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-A Where the Gods Dwell 185096/Custom_Tile Point of No Return 3e86c2.ttslua @@ -1,25 +1,25 @@ -name = 'Where the Gods Dwell' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Where the Gods Dwell' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76.ttslua index 54d591927..0748143c2 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.ttslua index 4d4017455..512f2eed0 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Model_Bag Set-aside 376a06/Bag Atlach-Nacha f0a43a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Tile Weaver of the Cosmos bbb70a.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Tile Weaver of the Cosmos bbb70a.ttslua index 418a5fce4..5fe6a166c 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Tile Weaver of the Cosmos bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Model_Bag 4-B Weaver of the Cosmos e14c76/Custom_Tile Weaver of the Cosmos bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'Weaver of the Cosmos' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Weaver of the Cosmos' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.ttslua index 28184b1f0..0771ab2f7 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a16a1a/Custom_Tile The Dream-Quest Campaign Log f40183.ttslua @@ -1,722 +1,722 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {0.902,0.886,0.788} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --1 checkbox - { - pos = {0.306,0.1,0.051}, - size = 250, - state = false - }, - --2 checkbox - { - pos = {0.35,0.1,0.114}, - size = 250, - state = false - }, - --3 checkbox - { - pos = {0.399,0.1,0.169}, - size = 250, - state = false - }, - --4 checkbox - { - pos = {0.455,0.1,0.221}, - size = 250, - state = false - }, - --5 checkbox - { - pos = {0.5,0.1,0.279}, - size = 250, - state = false - }, - --6 checkbox - { - pos = {0.54,0.1,0.334}, - size = 250, - state = false - }, - --7 checkbox - { - pos = {0.568,0.1,0.392}, - size = 250, - state = false - }, - --8 checkbox - { - pos = {0.604,0.1,0.457}, - size = 250, - state = false - }, - --9 checkbox - { - pos = {0.229,0.1,-0.007}, - size = 250, - state = false - }, - --10 checkbox - { - pos = {-0.816,0.1,0.02}, - size = 250, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.50,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.06,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.27}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.27}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.62}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.268}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.62}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.265}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.393,0.1,0.265}, - rows =10, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Killed Investigators - { - pos = {-0.417,0.1,0.881}, - rows = 4, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Evidence of Kadath - { - pos = {-0.388,0.1,0.676}, - rows = 2, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Chaos Bag - { - pos = {0.782,0.1,0.8}, - rows = 10, - width = 1500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {0.902,0.886,0.788} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --1 checkbox + { + pos = {0.306,0.1,0.051}, + size = 250, + state = false + }, + --2 checkbox + { + pos = {0.35,0.1,0.114}, + size = 250, + state = false + }, + --3 checkbox + { + pos = {0.399,0.1,0.169}, + size = 250, + state = false + }, + --4 checkbox + { + pos = {0.455,0.1,0.221}, + size = 250, + state = false + }, + --5 checkbox + { + pos = {0.5,0.1,0.279}, + size = 250, + state = false + }, + --6 checkbox + { + pos = {0.54,0.1,0.334}, + size = 250, + state = false + }, + --7 checkbox + { + pos = {0.568,0.1,0.392}, + size = 250, + state = false + }, + --8 checkbox + { + pos = {0.604,0.1,0.457}, + size = 250, + state = false + }, + --9 checkbox + { + pos = {0.229,0.1,-0.007}, + size = 250, + state = false + }, + --10 checkbox + { + pos = {-0.816,0.1,0.02}, + size = 250, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.50,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.06,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.27}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.27}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.62}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.268}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.62}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.265}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.393,0.1,0.265}, + rows =10, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Killed Investigators + { + pos = {-0.417,0.1,0.881}, + rows = 4, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Evidence of Kadath + { + pos = {-0.388,0.1,0.676}, + rows = 2, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Chaos Bag + { + pos = {0.782,0.1,0.8}, + rows = 10, + width = 1500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dream-Eaters a34f34.ttslua b/unpacked/Custom_Model_Bag The Dream-Eaters a34f34.ttslua index daed6bf90..4798d294b 100644 --- a/unpacked/Custom_Model_Bag The Dream-Eaters a34f34.ttslua +++ b/unpacked/Custom_Model_Bag The Dream-Eaters a34f34.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6.ttslua index beb7e9fed..c99612b1a 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9/Custom_Tile The Dunwich Legacy f5db25.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9/Custom_Tile The Dunwich Legacy f5db25.ttslua index cfa110e20..39ecc5466 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9/Custom_Tile The Dunwich Legacy f5db25.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1a Extracurricular Activity 51c0d9/Custom_Tile The Dunwich Legacy f5db25.ttslua @@ -1,21 +1,21 @@ -name = 'The Dunwich Legacy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Dunwich Legacy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c/Custom_Tile The Dunwich Legacy b5928a.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c/Custom_Tile The Dunwich Legacy b5928a.ttslua index cfa110e20..39ecc5466 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c/Custom_Tile The Dunwich Legacy b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 1b The House Always Wins e3aa5c/Custom_Tile The Dunwich Legacy b5928a.ttslua @@ -1,21 +1,21 @@ -name = 'The Dunwich Legacy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Dunwich Legacy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf/Custom_Tile The Miskatonic Museum 703373.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf/Custom_Tile The Miskatonic Museum 703373.ttslua index f92a55f33..ca89f18f6 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf/Custom_Tile The Miskatonic Museum 703373.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 2 The Miskatonic Museum 87adbf/Custom_Tile The Miskatonic Museum 703373.ttslua @@ -1,25 +1,25 @@ -name = 'The Miskatonic Museum' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Miskatonic Museum' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449/Custom_Tile The Essex County Express 247967.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449/Custom_Tile The Essex County Express 247967.ttslua index 8942d6ff8..9ff549176 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449/Custom_Tile The Essex County Express 247967.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 3 The Essex County Express d6e449/Custom_Tile The Essex County Express 247967.ttslua @@ -1,25 +1,25 @@ -name = 'The Essex County Express' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Essex County Express' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d/Custom_Tile Blood on the Altar 92b54a.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d/Custom_Tile Blood on the Altar 92b54a.ttslua index 35359436c..b50b2762f 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d/Custom_Tile Blood on the Altar 92b54a.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 4 Blood on the Altar 30684d/Custom_Tile Blood on the Altar 92b54a.ttslua @@ -1,25 +1,25 @@ -name = 'Blood on the Altar' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Blood on the Altar' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce/Custom_Tile Undimensioned and Unseen 393c71.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce/Custom_Tile Undimensioned and Unseen 393c71.ttslua index 796c0adfa..4da502b94 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce/Custom_Tile Undimensioned and Unseen 393c71.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 5 Undimensioned and Unseen afe7ce/Custom_Tile Undimensioned and Unseen 393c71.ttslua @@ -1,25 +1,25 @@ -name = 'Undimensioned and Unseen' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Undimensioned and Unseen' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf/Custom_Tile Where Doom Awaits a621ae.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf/Custom_Tile Where Doom Awaits a621ae.ttslua index c8658d789..5f3588cb8 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf/Custom_Tile Where Doom Awaits a621ae.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 6 Where Doom Awaits 022ddf/Custom_Tile Where Doom Awaits a621ae.ttslua @@ -1,25 +1,25 @@ -name = 'Where Doom Awaits' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Where Doom Awaits' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060/Custom_Tile Lost in Time and Space 64a607.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060/Custom_Tile Lost in Time and Space 64a607.ttslua index a649f8c03..09337160a 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060/Custom_Tile Lost in Time and Space 64a607.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Model_Bag 7 Lost in Time and Space 684060/Custom_Tile Lost in Time and Space 64a607.ttslua @@ -1,25 +1,25 @@ -name = 'Lost in Time and Space' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Lost in Time and Space' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua index 690a83709..3d43d4f4c 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 2898f6/Custom_Tile Dunwich Legacy Campaign Log 3f6ab6.ttslua @@ -1,669 +1,669 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First checkbox --- { --- pos = {-0.62,0.1,0.056}, --- size = 400, --- state = false --- }, - --Second checkbox --- { --- pos = {-0.629,0.1,0.199}, --- size = 400, --- state = false --- }, - --Third checkbox --- { --- pos = {-0.594,0.1,0.355}, --- size = 400, --- state = false --- }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.45,0.1,0.55}, - rows =18, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.384,0.1,0.228}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Cultists interrogated - { - pos = {0.384,0.1,0.69}, - rows = 8, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First checkbox +-- { +-- pos = {-0.62,0.1,0.056}, +-- size = 400, +-- state = false +-- }, + --Second checkbox +-- { +-- pos = {-0.629,0.1,0.199}, +-- size = 400, +-- state = false +-- }, + --Third checkbox +-- { +-- pos = {-0.594,0.1,0.355}, +-- size = 400, +-- state = false +-- }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.45,0.1,0.55}, + rows =18, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.384,0.1,0.228}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Cultists interrogated + { + pos = {0.384,0.1,0.69}, + rows = 8, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Dunwich Legacy 5889dd.ttslua b/unpacked/Custom_Model_Bag The Dunwich Legacy 5889dd.ttslua index daed6bf90..4798d294b 100644 --- a/unpacked/Custom_Model_Bag The Dunwich Legacy 5889dd.ttslua +++ b/unpacked/Custom_Model_Bag The Dunwich Legacy 5889dd.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 03b888.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 03b888.ttslua index daed6bf90..4798d294b 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 03b888.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 03b888.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19.ttslua index beb7e9fed..c99612b1a 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956/Custom_Tile The Forgotten Age e95200.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956/Custom_Tile The Forgotten Age e95200.ttslua index 75c4561fb..200437b6c 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956/Custom_Tile The Forgotten Age e95200.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 1 The Untamed Wilds e90956/Custom_Tile The Forgotten Age e95200.ttslua @@ -1,21 +1,21 @@ -name = 'The Forgotten Age' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Forgotten Age' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1/Custom_Tile The Doom of Eztli 294ec4.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1/Custom_Tile The Doom of Eztli 294ec4.ttslua index 25a046b6a..5672c33bc 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1/Custom_Tile The Doom of Eztli 294ec4.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 2 The Doom of Eztli 065ce1/Custom_Tile The Doom of Eztli 294ec4.ttslua @@ -1,25 +1,25 @@ -name = 'The Doom of Eztli' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Doom of Eztli' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8/Custom_Tile Threads of Fate 7a95f6.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8/Custom_Tile Threads of Fate 7a95f6.ttslua index aa256f497..0d6a8bd42 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8/Custom_Tile Threads of Fate 7a95f6.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 3 Threads of Fate 11f5c8/Custom_Tile Threads of Fate 7a95f6.ttslua @@ -1,25 +1,25 @@ -name = 'Threads of Fate' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Threads of Fate' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f/Custom_Tile The Boundary Beyond 010761.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f/Custom_Tile The Boundary Beyond 010761.ttslua index 88130bf52..f46c523bf 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f/Custom_Tile The Boundary Beyond 010761.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 4 The Boundary Beyond 0ec59f/Custom_Tile The Boundary Beyond 010761.ttslua @@ -1,25 +1,25 @@ -name = 'The Boundary Beyond' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Boundary Beyond' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00/Custom_Tile Heart of the Elders 493cb1.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00/Custom_Tile Heart of the Elders 493cb1.ttslua index 4f3609807..5a7299c73 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00/Custom_Tile Heart of the Elders 493cb1.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 1 2bfe00/Custom_Tile Heart of the Elders 493cb1.ttslua @@ -1,25 +1,25 @@ -name = 'Heart of the Elders' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Heart of the Elders' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 2 5b2403.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 2 5b2403.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 2 5b2403.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 5 Heart of the Elders Part 2 5b2403.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce/Custom_Tile The City of Archives 2fb6dc.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce/Custom_Tile The City of Archives 2fb6dc.ttslua index 787f8705f..3224092d4 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce/Custom_Tile The City of Archives 2fb6dc.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 6 The City of Archives 3170ce/Custom_Tile The City of Archives 2fb6dc.ttslua @@ -1,25 +1,25 @@ -name = 'The City of Archives' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The City of Archives' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Tile The Depths of Yoth 7aa4e3.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Tile The Depths of Yoth 7aa4e3.ttslua index 7d9affdc4..e569e19b2 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Tile The Depths of Yoth 7aa4e3.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Tile The Depths of Yoth 7aa4e3.ttslua @@ -1,25 +1,25 @@ -name = 'The Depths of Yoth' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Depths of Yoth' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - EasyStandard dd61f1.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - EasyStandard dd61f1.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - EasyStandard dd61f1.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - EasyStandard dd61f1.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - HardExpert 2da146.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - HardExpert 2da146.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - HardExpert 2da146.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 7 The Depths of Yoth 85286a/Custom_Token Scenario - HardExpert 2da146.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d/Custom_Tile Shattered Aeons 6dc72a.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d/Custom_Tile Shattered Aeons 6dc72a.ttslua index b78ce3eb4..b31a42434 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d/Custom_Tile Shattered Aeons 6dc72a.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 8 Shattered Aeons 737c5d/Custom_Tile Shattered Aeons 6dc72a.ttslua @@ -1,21 +1,21 @@ -name = 'Shattered Aeons' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Shattered Aeons' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 9 Secret Scenario c52079.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 9 Secret Scenario c52079.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 9 Secret Scenario c52079.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Model_Bag 9 Secret Scenario c52079.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua index 3e3ff898f..682c9d34c 100644 --- a/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua +++ b/unpacked/Custom_Model_Bag The Forgotten Age 0bcf19/Custom_Tile Forgotten Age Campaign Log 48b154.ttslua @@ -1,691 +1,691 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Yig's Fury - { - pos = {0.097,0.1,0.88}, - size = 500, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one Supplies - { - pos = {-0.637,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two supplies - { - pos = {-0.2,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three supplies - { - pos = {0.24,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.25}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four supplies - { - pos = {0.671,0.1,0.05}, - rows = 7, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.475,0.1,0.62}, - rows =12, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.527,0.1,0.507}, - rows = 12, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Yig's Fury + { + pos = {0.097,0.1,0.88}, + size = 500, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one Supplies + { + pos = {-0.637,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two supplies + { + pos = {-0.2,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three supplies + { + pos = {0.24,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.25}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four supplies + { + pos = {0.671,0.1,0.05}, + rows = 7, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.475,0.1,0.62}, + rows =12, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.527,0.1,0.507}, + rows = 12, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 10bd18.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 10bd18.ttslua index daed6bf90..4798d294b 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 10bd18.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 10bd18.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.ttslua index beb7e9fed..c99612b1a 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838/Custom_Tile The Innsmouth Conspiracy 16562e.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838/Custom_Tile The Innsmouth Conspiracy 16562e.ttslua index f8bd0074b..1f1e08361 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838/Custom_Tile The Innsmouth Conspiracy 16562e.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 1 The Pit of Despair c09838/Custom_Tile The Innsmouth Conspiracy 16562e.ttslua @@ -1,21 +1,21 @@ -name = 'The Innsmouth Conspiracy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Innsmouth Conspiracy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.ttslua index 480e70b7b..b54fe3991 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 2 The Vanishing of Elina Harper 8c6d05/Custom_Tile The Vanishing of Elina Harper 16562e.ttslua @@ -1,25 +1,25 @@ -name = 'The Vanishing of Elina Harper' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Vanishing of Elina Harper' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile In Too Deep bbb70a.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile In Too Deep bbb70a.ttslua index 74f4e72ef..6da01d7cc 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile In Too Deep bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 3 In Too Deep c3a225/Custom_Tile In Too Deep bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'In Too Deep' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'In Too Deep' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.ttslua index 798c5fb7e..69d64402a 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Model_Bag 4 Devil Reef 7ced47/Custom_Tile Devil Reef edc524.ttslua @@ -1,25 +1,25 @@ -name = 'Devil Reef' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Devil Reef' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Tile The Innsmouth Conspiracy Campaign Log f40183.ttslua b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Tile The Innsmouth Conspiracy Campaign Log f40183.ttslua index 63966807b..2d9e70e3f 100644 --- a/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Tile The Innsmouth Conspiracy Campaign Log f40183.ttslua +++ b/unpacked/Custom_Model_Bag The Innsmouth Conspiracy 465aab/Custom_Tile The Innsmouth Conspiracy Campaign Log f40183.ttslua @@ -1,669 +1,669 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {0.902,0.886,0.788} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --1 checkbox --- { --- pos = {0.306,0.1,0.05}, --- size = 250, --- state = false --- }, - - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.46}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.51,0.1,-0.46}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.56}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.455}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.06,0.1,-0.455}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.15,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.64,0.1,-0.72}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.64,0.1,-0.63}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.64,0.1,-0.27}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.715}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.63}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.27}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.71}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.24,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.268}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.69,0.1,-0.71}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.69,0.1,-0.62}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.265}, - rows = 9, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Memories Recovered - { - pos = {0.44,0.1,0.325}, - rows =14, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.43,0.1,0.33}, - rows =14, - width = 3500, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {-0.478,0.1,0.8}, - rows = 8, - width = 3000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Killed and Insane - { - pos = {0.448,0.1,0.887}, - rows = 5, - width = 4000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {0.902,0.886,0.788} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --1 checkbox +-- { +-- pos = {0.306,0.1,0.05}, +-- size = 250, +-- state = false +-- }, + + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.46}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.51,0.1,-0.46}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.56}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.455}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.06,0.1,-0.455}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.15,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.64,0.1,-0.72}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.64,0.1,-0.63}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.64,0.1,-0.27}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.715}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.63}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.27}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.71}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.24,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.268}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.69,0.1,-0.71}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.69,0.1,-0.62}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.265}, + rows = 9, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Memories Recovered + { + pos = {0.44,0.1,0.325}, + rows =14, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.43,0.1,0.33}, + rows =14, + width = 3500, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {-0.478,0.1,0.8}, + rows = 8, + width = 3000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Killed and Insane + { + pos = {0.448,0.1,0.887}, + rows = 5, + width = 4000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa 899c3a.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa 899c3a.ttslua index daed6bf90..4798d294b 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa 899c3a.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa 899c3a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, - font_size=700, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.4,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.4,3,-8.4}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.4,3,-7.2}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-2.4,3,7}, rotation={0,0,0}, height=850, width=2000, + font_size=700, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c.ttslua index beb7e9fed..c99612b1a 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua index 978a9d2b5..7878134ac 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 1 Curtain Call 83ccd4/Custom_Tile The Path to Carcosa 16562e.ttslua @@ -1,21 +1,21 @@ -name = 'The Path to Carcosa' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Path to Carcosa' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua index c9acd00d0..80ce317d3 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 2 The Last King 6730a1/Custom_Tile The Last King 857d0d.ttslua @@ -1,25 +1,25 @@ -name = 'The Last King' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Last King' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua index 9852aeb27..fd833106f 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 3 Echoes of the Past 42d2dc/Custom_Tile Echoes of the Past 452210.ttslua @@ -1,25 +1,25 @@ -name = 'Echoes of the Past' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Echoes of the Past' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua index f7109dddb..e78b2e78a 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 4 The Unspeakable Oath e7efa6/Custom_Tile The Unspeakable Oath 87f45e.ttslua @@ -1,25 +1,25 @@ -name = 'The Unspeakable Oath' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Unspeakable Oath' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua index e092a5769..bacd5051f 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 5 A Phantom of Truth bd4167/Custom_Tile A Phantom of Truth b20b8d.ttslua @@ -1,25 +1,25 @@ -name = 'A Phantom of Truth' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'A Phantom of Truth' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua index 9607689ac..c36627e17 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 6 The Pallid Mask eb48ff/Custom_Tile The Pallid Mask bb070d.ttslua @@ -1,25 +1,25 @@ -name = 'The Pallid Mask' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Pallid Mask' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua index 4d4017455..512f2eed0 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag b29b71.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua index 4d4017455..512f2eed0 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Bag Setup Randomizer 7c8232/Bag Setup Bag d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua index 78350373e..a505ccca6 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 7 Black Stars Rise dd8b0d/Custom_Tile Black Stars Rise 20c21d.ttslua @@ -1,25 +1,25 @@ -name = 'Black Stars Rise' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Black Stars Rise' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua index 710b4a84e..ffa409a5f 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Model_Bag 8 Dim Carcosa ce5d30/Custom_Tile Dim Carcosa 9afdfd.ttslua @@ -1,25 +1,25 @@ -name = 'Dim Carcosa' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Dim Carcosa' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Tile Carcosa Campaign Log ae8317.ttslua b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Tile Carcosa Campaign Log ae8317.ttslua index 108024431..7a861eb36 100644 --- a/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Tile Carcosa Campaign Log ae8317.ttslua +++ b/unpacked/Custom_Model_Bag The Path to Carcosa aca04c/Custom_Tile Carcosa Campaign Log ae8317.ttslua @@ -1,755 +1,755 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --Doubt 1 - { - pos = {-0.482,0.1,0.776}, - size = 200, - state = false - }, - --Doubt 2 - { - pos = {-0.43,0.1,0.776}, - size = 200, - state = false - }, - --Doubt 3 - { - pos = {-0.38,0.1,0.775}, - size = 200, - state = false - }, - --Doubt 4 - { - pos = {-0.325,0.1,0.778}, - size = 200, - state = false - }, - --Doubt 5 - { - pos = {-0.27,0.1,0.779}, - size = 200, - state = false - }, - --Doubt 6 - { - pos = {-0.219,0.1,0.778}, - size = 200, - state = false - }, - --Doubt 7 - { - pos = {-0.168,0.1,0.782}, - size = 200, - state = false - }, - --Doubt 8 - { - pos = {-0.111,0.1,0.783}, - size = 200, - state = false - }, - --Conviction 1 - { - pos = {-0.736,0.1,0.868}, - size = 200, - state = false - }, - --Conviction 2 - { - pos = {-0.68,0.1,0.869}, - size = 200, - state = false - }, - --Conviction 3 - { - pos = {-0.626,0.1,0.869}, - size = 200, - state = false - }, - --Conviction 4 - { - pos = {-0.574,0.1,0.874}, - size = 200, - state = false - }, - --Conviction 5 - { - pos = {-0.519,0.1,0.874}, - size = 200, - state = false - }, - --Conviction 6 - { - pos = {-0.467,0.1,0.879}, - size = 200, - state = false - }, - --Conviction 7 - { - pos = {-0.416,0.1,0.876}, - size = 200, - state = false - }, - --Conviction 8 - { - pos = {-0.357,0.1,0.879}, - size = 200, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.7,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.52,0.1,-0.45}, - size = 400, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.517,0.1,-0.55}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.274,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.074,0.1,-0.445}, - size = 400, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.061,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {0.153,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {0.379,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {0.38,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {0.614,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {0.82,0.1,-0.44}, - size = 400, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {0.827,0.1,-0.54}, - size = 300, - value = 0, - hideBG = true - }, - --Chasing The Stranger - { - pos = {0.414,0.1,0.106}, - size = 500, - value = 0, - hideBG = true - }, - - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.637,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.637,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.637,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.2,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.2,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.2,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {0.241,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {0.237,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {0.24,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {0.671,0.1,-0.70}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {0.671,0.1,-0.625}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {0.671,0.1,-0.32}, - rows = 5, - width = 2000, - font_size = 100, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.38,0.1,0.339}, - rows =16, - width = 3200, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --VIPs Interviewed - { - pos = {0.43,0.1,0.338}, - rows = 6, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --VIPs Slain - { - pos = {0.43,0.1,0.643}, - rows = 6, - width = 3500, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --Doubt 1 + { + pos = {-0.482,0.1,0.776}, + size = 200, + state = false + }, + --Doubt 2 + { + pos = {-0.43,0.1,0.776}, + size = 200, + state = false + }, + --Doubt 3 + { + pos = {-0.38,0.1,0.775}, + size = 200, + state = false + }, + --Doubt 4 + { + pos = {-0.325,0.1,0.778}, + size = 200, + state = false + }, + --Doubt 5 + { + pos = {-0.27,0.1,0.779}, + size = 200, + state = false + }, + --Doubt 6 + { + pos = {-0.219,0.1,0.778}, + size = 200, + state = false + }, + --Doubt 7 + { + pos = {-0.168,0.1,0.782}, + size = 200, + state = false + }, + --Doubt 8 + { + pos = {-0.111,0.1,0.783}, + size = 200, + state = false + }, + --Conviction 1 + { + pos = {-0.736,0.1,0.868}, + size = 200, + state = false + }, + --Conviction 2 + { + pos = {-0.68,0.1,0.869}, + size = 200, + state = false + }, + --Conviction 3 + { + pos = {-0.626,0.1,0.869}, + size = 200, + state = false + }, + --Conviction 4 + { + pos = {-0.574,0.1,0.874}, + size = 200, + state = false + }, + --Conviction 5 + { + pos = {-0.519,0.1,0.874}, + size = 200, + state = false + }, + --Conviction 6 + { + pos = {-0.467,0.1,0.879}, + size = 200, + state = false + }, + --Conviction 7 + { + pos = {-0.416,0.1,0.876}, + size = 200, + state = false + }, + --Conviction 8 + { + pos = {-0.357,0.1,0.879}, + size = 200, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.7,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.52,0.1,-0.45}, + size = 400, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.517,0.1,-0.55}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.274,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.074,0.1,-0.445}, + size = 400, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.061,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {0.153,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {0.379,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {0.38,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {0.614,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {0.82,0.1,-0.44}, + size = 400, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {0.827,0.1,-0.54}, + size = 300, + value = 0, + hideBG = true + }, + --Chasing The Stranger + { + pos = {0.414,0.1,0.106}, + size = 500, + value = 0, + hideBG = true + }, + + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.637,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.637,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.637,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.2,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.2,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.2,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {0.241,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {0.237,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {0.24,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {0.671,0.1,-0.70}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {0.671,0.1,-0.625}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {0.671,0.1,-0.32}, + rows = 5, + width = 2000, + font_size = 100, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.38,0.1,0.339}, + rows =16, + width = 3200, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --VIPs Interviewed + { + pos = {0.43,0.1,0.338}, + rows = 6, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --VIPs Slain + { + pos = {0.43,0.1,0.643}, + rows = 6, + width = 3500, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1.ttslua index beb7e9fed..c99612b1a 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 4 + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1.25,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1.25,0.3,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1.25,0.3,-7}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1.25,0.3,-8}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1.35,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1.25,1,6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, + font_size=350, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0/Custom_Tile Against the Wendigo 82e1ed.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0/Custom_Tile Against the Wendigo 82e1ed.ttslua index d47035472..bd968c218 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0/Custom_Tile Against the Wendigo 82e1ed.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Against the Wendigo 4d5fa0/Custom_Tile Against the Wendigo 82e1ed.ttslua @@ -1,21 +1,21 @@ -name = 'Bread and Circuses' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Bread and Circuses' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 1 Arkham in Wonderland 18aa54.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 1 Arkham in Wonderland 18aa54.ttslua index cae387265..013eb65ca 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 1 Arkham in Wonderland 18aa54.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 1 Arkham in Wonderland 18aa54.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-A A Sea of Troubles 952572.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-A A Sea of Troubles 952572.ttslua index cae387265..013eb65ca 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-A A Sea of Troubles 952572.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-A A Sea of Troubles 952572.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-B Tempest in a Teapot 8d88c8.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-B Tempest in a Teapot 8d88c8.ttslua index cae387265..013eb65ca 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-B Tempest in a Teapot 8d88c8.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-B Tempest in a Teapot 8d88c8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-C Bleeding Hearts 8eb793.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-C Bleeding Hearts 8eb793.ttslua index cae387265..013eb65ca 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-C Bleeding Hearts 8eb793.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-C Bleeding Hearts 8eb793.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-D Wild Snark Chase 9e33a0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-D Wild Snark Chase 9e33a0.ttslua index cae387265..013eb65ca 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-D Wild Snark Chase 9e33a0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-D Wild Snark Chase 9e33a0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-E Sibling Rivalry 0916b6.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-E Sibling Rivalry 0916b6.ttslua index cae387265..013eb65ca 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-E Sibling Rivalry 0916b6.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-E Sibling Rivalry 0916b6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-F Fool's Mate bd556e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-F Fool's Mate bd556e.ttslua index cae387265..013eb65ca 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-F Fool's Mate bd556e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 2-F Fool's Mate bd556e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 3 Lucid Nightmare e6bb63.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 3 Lucid Nightmare e6bb63.ttslua index cae387265..013eb65ca 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 3 Lucid Nightmare e6bb63.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Model_Bag 3 Lucid Nightmare e6bb63.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Tile Alice in Wonderland b5928a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Tile Alice in Wonderland b5928a.ttslua index db124ee3b..210076a48 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Tile Alice in Wonderland b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Tile Alice in Wonderland b5928a.ttslua @@ -1,21 +1,21 @@ -name = 'Alice in Wonderland' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Alice in Wonderland' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Token Alice in Wonderland Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Token Alice in Wonderland Campaign Log eda22b.ttslua index 6b9789fb2..b42812626 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Token Alice in Wonderland Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Alice in Wonderland 39916d/Custom_Token Alice in Wonderland Campaign Log eda22b.ttslua @@ -1,651 +1,651 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.080,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.270,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.000,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.251,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.441,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.171,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {0.579,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {0.389,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {0.659,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {1.407,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {1.217,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {1.487,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.265,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.265,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.265,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.436,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.436,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.436,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {0.394,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {0.394,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {0.394,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {1.222,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {1.222,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {1.222,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.930,0.1,0.990}, - rows = 25, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.820,0.1,0.707}, - rows = 20, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {1.010,0.1,1.700}, - rows = 5, - width = 7400, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.080,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.270,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.000,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.251,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.441,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.171,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {0.579,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {0.389,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {0.659,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {1.407,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {1.217,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {1.487,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.265,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.265,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.265,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.436,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.436,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.436,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {0.394,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {0.394,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {0.394,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {1.222,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {1.222,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {1.222,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.930,0.1,0.990}, + rows = 25, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.820,0.1,0.707}, + rows = 20, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Killed and Insane Investigators + { + pos = {1.010,0.1,1.700}, + rows = 5, + width = 7400, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.ttslua index 4d4017455..512f2eed0 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag With Return Set 083fc2.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.ttslua index 4d4017455..512f2eed0 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Bag Without Return Set d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing 7c8eef.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing 7c8eef.ttslua index b3e5ec0ed..bc17232b9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing 7c8eef.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag All or Nothing 72ab92/Custom_Tile All or Nothing 7c8eef.ttslua @@ -1,21 +1,21 @@ -name = 'All or Nothing' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'All or Nothing' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.ttslua index fea3e078a..b99e1020d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bad Blood cc7eb3/Custom_Tile Bad Blood 510265.ttslua @@ -1,21 +1,21 @@ -name = 'Bad Blood' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Bad Blood' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da/Custom_Tile Blood Spilled in Salem 83b781.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da/Custom_Tile Blood Spilled in Salem 83b781.ttslua index 019f2aa3f..438f92e12 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da/Custom_Tile Blood Spilled in Salem 83b781.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Blood Spilled in Salem 4237da/Custom_Tile Blood Spilled in Salem 83b781.ttslua @@ -1,21 +1,21 @@ -name = 'Blood Spilled in Salem' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Blood Spilled in Salem' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97/Custom_Tile Bridge of Sighs 2d9794.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97/Custom_Tile Bridge of Sighs 2d9794.ttslua index aa4315356..0eecb494e 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97/Custom_Tile Bridge of Sighs 2d9794.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Bridge of Sighs 578e97/Custom_Tile Bridge of Sighs 2d9794.ttslua @@ -1,21 +1,21 @@ -name = 'Bridge of Sighs' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Bridge of Sighs' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile Carnevale of Horrors a5891b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile Carnevale of Horrors a5891b.ttslua index 6b3e44012..78c608dc2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile Carnevale of Horrors a5891b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Horrors 23dd51/Custom_Tile Carnevale of Horrors a5891b.ttslua @@ -1,13 +1,13 @@ -name = 'Carnevale of Horrors' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end +name = 'Carnevale of Horrors' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.ttslua index 4d4017455..512f2eed0 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Model_Bag Set-aside a45247/Bag Atlach-Nacha 3d83ce.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile Carnevale of Spiders a5891b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile Carnevale of Spiders a5891b.ttslua index 6b3e44012..78c608dc2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile Carnevale of Spiders a5891b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Carnevale of Spiders e57017/Custom_Tile Carnevale of Spiders a5891b.ttslua @@ -1,13 +1,13 @@ -name = 'Carnevale of Horrors' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end +name = 'Carnevale of Horrors' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Bag Additional locations d14543.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Bag Additional locations d14543.ttslua index f82d90245..758efa0e2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Bag Additional locations d14543.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Bag Additional locations d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Setup", click_function="buttonClick_setup", function_owner=self, ---- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={1,1,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Setup", click_function="buttonClick_setup", function_owner=self, +--- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={1,1,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Custom_Tile Consternation on the Constellation bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Custom_Tile Consternation on the Constellation bbb70a.ttslua index 9732c81e8..1b866fa18 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Custom_Tile Consternation on the Constellation bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Consternation on the Constellation 0ec730/Custom_Tile Consternation on the Constellation bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'Consternation' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Consternation' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Bag Locations 73e53d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Bag Locations 73e53d.ttslua index 1cfc46617..be2fd274b 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Bag Locations 73e53d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Bag Locations 73e53d.ttslua @@ -1,5 +1,5 @@ -function onCollisionEnter(collision_info) - self.shuffle() - self.shuffle() - self.shuffle() -end +function onCollisionEnter(collision_info) + self.shuffle() + self.shuffle() + self.shuffle() +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Custom_Tile Curse of the Rougarou cf0c00.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Custom_Tile Curse of the Rougarou cf0c00.ttslua index 8c433dcd4..682e30022 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Custom_Tile Curse of the Rougarou cf0c00.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Curse of the Rougarou db7039/Custom_Tile Curse of the Rougarou cf0c00.ttslua @@ -1,13 +1,13 @@ -name = 'Curse of the Rougarou' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end +name = 'Curse of the Rougarou' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model Dark Matter Custom Data Helper a57738.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model Dark Matter Custom Data Helper a57738.ttslua index eb4a0b421..d42a554fe 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model Dark Matter Custom Data Helper a57738.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model Dark Matter Custom Data Helper a57738.ttslua @@ -1,83 +1,83 @@ --- set true to enable debug logging -DEBUG = false - -function log(message) - if DEBUG then - print(message) - end -end - ---[[ -Known locations and clues. We check this to determine if we should -atttempt to spawn clues, first we look for _ and if -we find nothing we look for -format is [location_guid -> clueCount] -]] -LOCATIONS_DATA_JSON = [[ -{ - "Cargo Hold": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Cryosleep Quarters": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Engine Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Escape Pod Bay": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Infirmary": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Mess Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ship's Bridge": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ventilation Shaft": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Cafeteria": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Classroom K2": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Entrance Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Gymnasium": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Biology Lab": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Library": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "School Grounds": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Cold Wastes": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Crystal Peak": {"type": "perPlayer", "value": 3, "clueSide": "front"}, - "Ice Spires": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Main Facility": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Omni-Transmitters": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Q-Crystal Mines": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Airlocks": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Crew Quarters": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Flight Deck": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Hydroponics": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Infirmary_N": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Ship Mainframe": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Telecoms": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "A Hiding Place": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "A Mutiny": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Adrift in Space": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "An Accident": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "City of Cats": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Fever Dream": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Abandoned Lander": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Cyclopean Caverns": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Garden of Delights": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Grand Ballroom": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Spiral Staircase": {"type": "fixed", "value": 1, "clueSide": "back"}, - "The Yellow Throne": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Whisper Labyrinth": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "New Brooklyn": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Hope": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Yuggoth": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Mount Sinai": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Derelict Ship": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Martian Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Olympus Telescope": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Moonbase Laboratory": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Threshold of Yuggoth": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Earth": {"type": "perPlayer", "value": 2, "clueSide": "front"} -} -]] - -LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) - -function onload(save_state) - local playArea = getObjectFromGUID('721ba2') - playArea.call("updateLocations", {self.getGUID()}) -end +-- set true to enable debug logging +DEBUG = false + +function log(message) + if DEBUG then + print(message) + end +end + +--[[ +Known locations and clues. We check this to determine if we should +atttempt to spawn clues, first we look for _ and if +we find nothing we look for +format is [location_guid -> clueCount] +]] +LOCATIONS_DATA_JSON = [[ +{ + "Cargo Hold": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Cryosleep Quarters": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Engine Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Escape Pod Bay": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Infirmary": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Mess Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ship's Bridge": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ventilation Shaft": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Cafeteria": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Classroom K2": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Entrance Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Gymnasium": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Biology Lab": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Library": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "School Grounds": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Cold Wastes": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Crystal Peak": {"type": "perPlayer", "value": 3, "clueSide": "front"}, + "Ice Spires": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Main Facility": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Omni-Transmitters": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Q-Crystal Mines": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Airlocks": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Crew Quarters": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Flight Deck": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Hydroponics": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Infirmary_N": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Ship Mainframe": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Telecoms": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "A Hiding Place": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "A Mutiny": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Adrift in Space": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "An Accident": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "City of Cats": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Fever Dream": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Abandoned Lander": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Cyclopean Caverns": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Garden of Delights": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Grand Ballroom": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Spiral Staircase": {"type": "fixed", "value": 1, "clueSide": "back"}, + "The Yellow Throne": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Whisper Labyrinth": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "New Brooklyn": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Hope": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Yuggoth": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Mount Sinai": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Derelict Ship": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Martian Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Olympus Telescope": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Moonbase Laboratory": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Threshold of Yuggoth": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Earth": {"type": "perPlayer", "value": 2, "clueSide": "front"} +} +]] + +LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) + +function onload(save_state) + local playArea = getObjectFromGUID('721ba2') + playArea.call("updateLocations", {self.getGUID()}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Electric Nightmare 2bd90b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Electric Nightmare 2bd90b.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Electric Nightmare 2bd90b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Electric Nightmare 2bd90b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Fragment of Carcosa a492bc.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Fragment of Carcosa a492bc.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Fragment of Carcosa a492bc.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Fragment of Carcosa a492bc.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag In the Shadow of Earth 8cfe99.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag In the Shadow of Earth 8cfe99.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag In the Shadow of Earth 8cfe99.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag In the Shadow of Earth 8cfe99.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Lost Quantum c29a78.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Lost Quantum c29a78.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Lost Quantum c29a78.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Lost Quantum c29a78.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Starfall e04c21.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Starfall e04c21.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Starfall e04c21.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Starfall e04c21.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Strange Moons 2ebcda.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Strange Moons 2ebcda.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Strange Moons 2ebcda.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag Strange Moons 2ebcda.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Machine in Yellow 32039e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Machine in Yellow 32039e.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Machine in Yellow 32039e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Machine in Yellow 32039e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Tatteremalion 51fbbc.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Tatteremalion 51fbbc.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Tatteremalion 51fbbc.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Model_Bag The Tatteremalion 51fbbc.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile 0aa185.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile 0aa185.ttslua index 2d033f3ff..73d04e8c1 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile 0aa185.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile 0aa185.ttslua @@ -1,736 +1,736 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First checkbox - { - pos = {0.54,0.11,0.02}, - size = 200, - state = false - }, - --Second checkbox - { - pos = {0.545,0.11,0.07}, - size = 200, - state = false - }, - --Third checkbox - { - pos = {0.553,0.11,0.14}, - size = 200, - state = false - }, - -- Fourth Checkbox - { - pos = {0.505,0.11,0.27}, - size = 200, - state = false - }, - -- Fifth Checkbox - { - pos = {0.715,0.11,0.3}, - size = 200, - state = false - }, - -- Sixth Checkbox - { - pos = {0.54,0.11,0.37}, - size = 200, - state = false - }, - -- Seventh Checkbox - { - pos = {0.575,0.11,0.45}, - size = 200, - state = false - }, - -- Eigth Checkbox - { - pos = {0.675,0.11,0.515}, - size = 200, - state = false - }, - -- Ninth Checkbox - { - pos = {0.64,0.11,0.565}, - size = 200, - state = false - }, - -- Tenth Checkbox - { - pos = {0.428,0.11,0.637}, - size = 200, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --Slot one counter 1 - { - pos = {-0.615,0.11,-0.42}, - size = 300, - value = 0, - hideBG = true - }, - --Slot one counter 2 - { - pos = {-0.47,0.11,-0.42}, - size = 300, - value = 0, - hideBG = true - }, - --Slot one xp 1 - { - pos = {-0.47,0.11,-0.51}, - size = 300, - value = 0, - hideBG = true - }, - --Slot one Memories - { - pos = {-0.615,0.11,-0.335}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 1 - { - pos = {-0.19,0.11,-0.42}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two counter 2 - { - pos = {-0.045,0.11,-0.42}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two xp 1 - { - pos = {-0.045,0.11,-0.51}, - size = 300, - value = 0, - hideBG = true - }, - --Slot two Memories - { - pos = {-0.19,0.11,-0.335}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 1 - { - pos = {-0.615,0.11,0.132}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three counter 2 - { - pos = {-0.47,0.11,0.132}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three xp 1 - { - pos = {-0.47,0.11,0.042}, - size = 300, - value = 0, - hideBG = true - }, - --Slot three Memories - { - pos = {-0.615,0.11,0.217}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 1 - { - pos = {-0.19,0.11,0.132}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four counter 2 - { - pos = {-0.045,0.11,0.132}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four xp 1 - { - pos = {-0.045,0.11,0.042}, - size = 300, - value = 0, - hideBG = true - }, - --Slot four Memories - { - pos = {-0.74,0.11,0.75}, - size = 600, - value = 0, - hideBG = true - }, - --Impending Doom - { - pos = {-0.19,0.11,0.217}, - size = 300, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --Slot one player - { - pos = {-0.615,0.11,-0.635}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one investigator - { - pos = {-0.615,0.11,-0.57}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot one story - { - pos = {-0.615,0.11,-0.21}, - rows = 4, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two player - { - pos = {-0.19,0.11,-0.635}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two investigator - { - pos = {-0.19,0.11,-0.57}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot two story - { - pos = {-0.19,0.1,-0.21}, - rows = 4, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three player - { - pos = {-0.615,0.11,-0.083}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three investigator - { - pos = {-0.615,0.11,-0.017}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot three story - { - pos = {-0.615,0.11,0.34}, - rows = 4, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four player - { - pos = {-0.19,0.11,-0.083}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four investigator - { - pos = {-0.19,0.11,-0.017}, - rows = 1, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Slot four story - { - pos = {-0.19,0.11,0.34}, - rows = 4, - width = 2000, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --Killed Textbox - { - pos = {0.46,0.11,0.85}, - rows = 2, - width = 3000, - font_size = 200, - label = "Click to type", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {0.44,0.11,-0.44}, - rows = 18, - width = 3200, - font_size = 150, - label = "Click to type", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First checkbox + { + pos = {0.54,0.11,0.02}, + size = 200, + state = false + }, + --Second checkbox + { + pos = {0.545,0.11,0.07}, + size = 200, + state = false + }, + --Third checkbox + { + pos = {0.553,0.11,0.14}, + size = 200, + state = false + }, + -- Fourth Checkbox + { + pos = {0.505,0.11,0.27}, + size = 200, + state = false + }, + -- Fifth Checkbox + { + pos = {0.715,0.11,0.3}, + size = 200, + state = false + }, + -- Sixth Checkbox + { + pos = {0.54,0.11,0.37}, + size = 200, + state = false + }, + -- Seventh Checkbox + { + pos = {0.575,0.11,0.45}, + size = 200, + state = false + }, + -- Eigth Checkbox + { + pos = {0.675,0.11,0.515}, + size = 200, + state = false + }, + -- Ninth Checkbox + { + pos = {0.64,0.11,0.565}, + size = 200, + state = false + }, + -- Tenth Checkbox + { + pos = {0.428,0.11,0.637}, + size = 200, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --Slot one counter 1 + { + pos = {-0.615,0.11,-0.42}, + size = 300, + value = 0, + hideBG = true + }, + --Slot one counter 2 + { + pos = {-0.47,0.11,-0.42}, + size = 300, + value = 0, + hideBG = true + }, + --Slot one xp 1 + { + pos = {-0.47,0.11,-0.51}, + size = 300, + value = 0, + hideBG = true + }, + --Slot one Memories + { + pos = {-0.615,0.11,-0.335}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 1 + { + pos = {-0.19,0.11,-0.42}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two counter 2 + { + pos = {-0.045,0.11,-0.42}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two xp 1 + { + pos = {-0.045,0.11,-0.51}, + size = 300, + value = 0, + hideBG = true + }, + --Slot two Memories + { + pos = {-0.19,0.11,-0.335}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 1 + { + pos = {-0.615,0.11,0.132}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three counter 2 + { + pos = {-0.47,0.11,0.132}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three xp 1 + { + pos = {-0.47,0.11,0.042}, + size = 300, + value = 0, + hideBG = true + }, + --Slot three Memories + { + pos = {-0.615,0.11,0.217}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 1 + { + pos = {-0.19,0.11,0.132}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four counter 2 + { + pos = {-0.045,0.11,0.132}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four xp 1 + { + pos = {-0.045,0.11,0.042}, + size = 300, + value = 0, + hideBG = true + }, + --Slot four Memories + { + pos = {-0.74,0.11,0.75}, + size = 600, + value = 0, + hideBG = true + }, + --Impending Doom + { + pos = {-0.19,0.11,0.217}, + size = 300, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --Slot one player + { + pos = {-0.615,0.11,-0.635}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one investigator + { + pos = {-0.615,0.11,-0.57}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot one story + { + pos = {-0.615,0.11,-0.21}, + rows = 4, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two player + { + pos = {-0.19,0.11,-0.635}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two investigator + { + pos = {-0.19,0.11,-0.57}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot two story + { + pos = {-0.19,0.1,-0.21}, + rows = 4, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three player + { + pos = {-0.615,0.11,-0.083}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three investigator + { + pos = {-0.615,0.11,-0.017}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot three story + { + pos = {-0.615,0.11,0.34}, + rows = 4, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four player + { + pos = {-0.19,0.11,-0.083}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four investigator + { + pos = {-0.19,0.11,-0.017}, + rows = 1, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Slot four story + { + pos = {-0.19,0.11,0.34}, + rows = 4, + width = 2000, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --Killed Textbox + { + pos = {0.46,0.11,0.85}, + rows = 2, + width = 3000, + font_size = 200, + label = "Click to type", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {0.44,0.11,-0.44}, + rows = 18, + width = 3200, + font_size = 150, + label = "Click to type", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile Dark Matter b5928a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile Dark Matter b5928a.ttslua index 1f739f097..cb99e61bb 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile Dark Matter b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Tile Dark Matter b5928a.ttslua @@ -1,21 +1,21 @@ -name = 'Dark Matter' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Dark Matter' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 13bc7d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 13bc7d.ttslua index 639b2e969..895f01f1f 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 13bc7d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 13bc7d.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 66dad0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 66dad0.ttslua index 639b2e969..895f01f1f 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 66dad0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 66dad0.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 794376.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 794376.ttslua index 639b2e969..895f01f1f 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 794376.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 794376.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 99db87.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 99db87.ttslua index 639b2e969..895f01f1f 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 99db87.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Dark Matter 7458b7/Custom_Token Memories 99db87.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612/Custom_Tile Darkness Falls b5928a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612/Custom_Tile Darkness Falls b5928a.ttslua index 67ad5da9e..c8c78d011 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612/Custom_Tile Darkness Falls b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Darkness Falls c6a612/Custom_Tile Darkness Falls b5928a.ttslua @@ -1,21 +1,21 @@ -name = 'Darkness Falls' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Darkness Falls' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e.ttslua index 2644aff3f..4cd89ff71 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e/Custom_Tile Delta Geen Convergence 520889.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e/Custom_Tile Delta Geen Convergence 520889.ttslua index 77ec0033d..c97f5a60c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e/Custom_Tile Delta Geen Convergence 520889.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Delta Green Convergence ac164e/Custom_Tile Delta Geen Convergence 520889.ttslua @@ -1,21 +1,21 @@ -name = 'Delta Green' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Delta Green' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Dead by Dawn c29a78.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Dead by Dawn c29a78.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Dead by Dawn c29a78.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Dead by Dawn c29a78.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Late Risers 51fbbc.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Late Risers 51fbbc.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Late Risers 51fbbc.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Late Risers 51fbbc.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Mourning Chorus 24c385.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Mourning Chorus 24c385.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Mourning Chorus 24c385.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Mourning Chorus 24c385.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Night on the Town 2bd90b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Night on the Town 2bd90b.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Night on the Town 2bd90b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Model_Bag Night on the Town 2bd90b.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood ac895d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood ac895d.ttslua index 40fe71a43..49836c550 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood ac895d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood ac895d.ttslua @@ -1,21 +1,21 @@ -name = 'Flesh' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Flesh' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood f5db25.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood f5db25.ttslua index 40fe71a43..49836c550 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood f5db25.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Tile Flesh and Blood f5db25.ttslua @@ -1,21 +1,21 @@ -name = 'Flesh' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Flesh' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Token Generic Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Token Generic Campaign Log eda22b.ttslua index d5fb74c82..588598831 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Token Generic Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Flesh and Blood 613b64/Custom_Token Generic Campaign Log eda22b.ttslua @@ -1,651 +1,651 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.080,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.270,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.000,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.251,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.441,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.171,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {0.579,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {0.389,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {0.659,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {1.407,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {1.217,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {1.487,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.265,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.265,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.265,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.436,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.436,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.436,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {0.394,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {0.394,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {0.394,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {1.222,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {1.222,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {1.222,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.930,0.1,0.930}, - rows = 27, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.820,0.1,0.707}, - rows = 20, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {1.010,0.1,1.700}, - rows = 5, - width = 7400, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.080,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.270,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.000,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.251,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.441,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.171,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {0.579,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {0.389,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {0.659,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {1.407,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {1.217,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {1.487,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.265,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.265,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.265,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.436,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.436,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.436,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {0.394,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {0.394,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {0.394,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {1.222,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {1.222,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {1.222,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.930,0.1,0.930}, + rows = 27, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.820,0.1,0.707}, + rows = 20, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Killed and Insane Investigators + { + pos = {1.010,0.1,1.700}, + rows = 5, + width = 7400, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard b7af99.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard b7af99.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard b7af99.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard b7af99.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard e19c97.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard e19c97.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard e19c97.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Eternal Slumber 9ff406/Custom_Token Scenario - EasyStandard e19c97.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - EasyStandard afc7b5.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - EasyStandard afc7b5.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - EasyStandard afc7b5.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - EasyStandard afc7b5.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - HardExpert 9ed124.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - HardExpert 9ed124.ttslua index 1c555f04c..67da25eae 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - HardExpert 9ed124.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Model_Bag The Night's Usurper 578bcb/Custom_Token Scenario - HardExpert 9ed124.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {0,0,0,98} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,1.45}, - height=600, - width=1000, - alignment = 3, - scale={x=1, y=1, z=1}, - font_size=350, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {0,0,0,98} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,1.45}, + height=600, + width=1000, + alignment = 3, + scale={x=1, y=1, z=1}, + font_size=350, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Tile Guardians of the Abyss 82e1ed.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Tile Guardians of the Abyss 82e1ed.ttslua index 613d25c00..c7cae53da 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Tile Guardians of the Abyss 82e1ed.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Guardians of the Abyss ee987d/Custom_Tile Guardians of the Abyss 82e1ed.ttslua @@ -1,21 +1,21 @@ -name = 'Guardians of the Abyss' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Guardians of the Abyss' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8/Custom_Tile Happy's Funhouse c5008a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8/Custom_Tile Happy's Funhouse c5008a.ttslua index a6a523bb3..8a7490ca8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8/Custom_Tile Happy's Funhouse c5008a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Happy's Funhouse e7d9f8/Custom_Tile Happy's Funhouse c5008a.ttslua @@ -1,21 +1,21 @@ -name = 'Happys Funhouse' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Happys Funhouse' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b.ttslua index 5534586ac..979aaf560 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 1 Bread and Circuses 16ceab.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 1 Bread and Circuses 16ceab.ttslua index 54d591927..0748143c2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 1 Bread and Circuses 16ceab.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 1 Bread and Circuses 16ceab.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 2 Enter the Dragon 4f944f.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 2 Enter the Dragon 4f944f.ttslua index 54d591927..0748143c2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 2 Enter the Dragon 4f944f.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 2 Enter the Dragon 4f944f.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 3 Bon Voyage 49dfb9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 3 Bon Voyage 49dfb9.ttslua index 54d591927..0748143c2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 3 Bon Voyage 49dfb9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 3 Bon Voyage 49dfb9.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 4 Cost of Azure 0fad66.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 4 Cost of Azure 0fad66.ttslua index 54d591927..0748143c2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 4 Cost of Azure 0fad66.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Model_Bag 4 Cost of Azure 0fad66.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Tile Bread and Circuses 82e1ed.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Tile Bread and Circuses 82e1ed.ttslua index d47035472..bd968c218 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Tile Bread and Circuses 82e1ed.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Idol Thoughts 2d417b/Custom_Tile Bread and Circuses 82e1ed.ttslua @@ -1,21 +1,21 @@ -name = 'Bread and Circuses' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Bread and Circuses' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c.ttslua index 5534586ac..979aaf560 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c/Custom_Tile The Initiation bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c/Custom_Tile The Initiation bbb70a.ttslua index 497ce1745..4048d1eb0 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c/Custom_Tile The Initiation bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag In Blackest Pits 68380c/Custom_Tile The Initiation bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'The Initiation' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'The Initiation' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0/Custom_Tile Into the Shadowlands 770021.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0/Custom_Tile Into the Shadowlands 770021.ttslua index 96b1aaa66..4e75f9bfd 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0/Custom_Tile Into the Shadowlands 770021.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 1 Dark Reflections c1aad0/Custom_Tile Into the Shadowlands 770021.ttslua @@ -1,21 +1,21 @@ -name = 'Into the Shadowlands' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Into the Shadowlands' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 2 Endless Horizons b1bc62.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 2 Endless Horizons b1bc62.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 2 Endless Horizons b1bc62.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Into the Shadowlands 019847/Bag 2 Endless Horizons b1bc62.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48/Custom_Tile Jenny's Choice bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48/Custom_Tile Jenny's Choice bbb70a.ttslua index f1cde3b4e..1182c3163 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48/Custom_Tile Jenny's Choice bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Jenny's Choice a61b48/Custom_Tile Jenny's Choice bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'Jennys Choice' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Jennys Choice' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Investigators fba392.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Investigators fba392.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Investigators fba392.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Investigators fba392.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Izanami's Delegates b34bec.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Izanami's Delegates b34bec.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Izanami's Delegates b34bec.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Izanami's Delegates b34bec.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Player Cards 64ad17.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Player Cards 64ad17.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Player Cards 64ad17.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Player Cards 64ad17.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 1 - Modorimonogatari f051fc.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 1 - Modorimonogatari f051fc.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 1 - Modorimonogatari f051fc.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 1 - Modorimonogatari f051fc.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2A - Toshimonogatari 4076cd.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2A - Toshimonogatari 4076cd.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2A - Toshimonogatari 4076cd.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2A - Toshimonogatari 4076cd.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2B - Inarimonogatari ad56f2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2B - Inarimonogatari ad56f2.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2B - Inarimonogatari ad56f2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2B - Inarimonogatari ad56f2.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Inarimonogatari first, choose this bag 1a6190.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Inarimonogatari first, choose this bag 1a6190.ttslua index 103cb00e5..053fbbacb 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Inarimonogatari first, choose this bag 1a6190.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Inarimonogatari first, choose this bag 1a6190.ttslua @@ -1,547 +1,547 @@ - -- Utility memory bag by Directsun --- Version 2.6.0 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - buttonIndexMap = {} - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Workaround for custom PDFs - if obj.Book then - objPos.y = objPos.y + 0.5 - end - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - buttonIndexMap[obj.getGUID()] = howManyButtons - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - self.createButton({ - label="Selection", click_function="editDragSelection", function_owner=self, - position={0,0.3,2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(obj, move) - local index = buttonIndexMap[obj.getGUID()] - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - -function editDragSelection(bagObj, player, remove) - local selectedObjs = Player[player].getSelectedObjects() - if not remove then - for _, obj in ipairs(selectedObjs) do - local index = buttonIndexMap[obj.getGUID()] - --Ignore if already in the memory list, or does not have a button - if index and not memoryList[obj.getGUID()] then - self.editButton({index=index, color={0,1,0,0.6}}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - end - end - else - for _, obj in ipairs(selectedObjs) do - local index = buttonIndexMap[obj.getGUID()] - if index and memoryList[obj.getGUID()] then - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end - end - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end + -- Utility memory bag by Directsun +-- Version 2.6.0 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + buttonIndexMap = {} + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Workaround for custom PDFs + if obj.Book then + objPos.y = objPos.y + 0.5 + end + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + buttonIndexMap[obj.getGUID()] = howManyButtons + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + self.createButton({ + label="Selection", click_function="editDragSelection", function_owner=self, + position={0,0.3,2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(obj, move) + local index = buttonIndexMap[obj.getGUID()] + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +function editDragSelection(bagObj, player, remove) + local selectedObjs = Player[player].getSelectedObjects() + if not remove then + for _, obj in ipairs(selectedObjs) do + local index = buttonIndexMap[obj.getGUID()] + --Ignore if already in the memory list, or does not have a button + if index and not memoryList[obj.getGUID()] then + self.editButton({index=index, color={0,1,0,0.6}}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + end + end + else + for _, obj in ipairs(selectedObjs) do + local index = buttonIndexMap[obj.getGUID()] + if index and memoryList[obj.getGUID()] then + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end + end + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Toshimonogatari first, choose this bag 91392f.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Toshimonogatari first, choose this bag 91392f.ttslua index 103cb00e5..053fbbacb 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Toshimonogatari first, choose this bag 91392f.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 2S - Shinkansenmonogatari 8221db/Bag If you completed Toshimonogatari first, choose this bag 91392f.ttslua @@ -1,547 +1,547 @@ - -- Utility memory bag by Directsun --- Version 2.6.0 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - buttonIndexMap = {} - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Workaround for custom PDFs - if obj.Book then - objPos.y = objPos.y + 0.5 - end - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - buttonIndexMap[obj.getGUID()] = howManyButtons - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - self.createButton({ - label="Selection", click_function="editDragSelection", function_owner=self, - position={0,0.3,2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(obj, move) - local index = buttonIndexMap[obj.getGUID()] - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - -function editDragSelection(bagObj, player, remove) - local selectedObjs = Player[player].getSelectedObjects() - if not remove then - for _, obj in ipairs(selectedObjs) do - local index = buttonIndexMap[obj.getGUID()] - --Ignore if already in the memory list, or does not have a button - if index and not memoryList[obj.getGUID()] then - self.editButton({index=index, color={0,1,0,0.6}}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - end - end - else - for _, obj in ipairs(selectedObjs) do - local index = buttonIndexMap[obj.getGUID()] - if index and memoryList[obj.getGUID()] then - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end - end - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end + -- Utility memory bag by Directsun +-- Version 2.6.0 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + buttonIndexMap = {} + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Workaround for custom PDFs + if obj.Book then + objPos.y = objPos.y + 0.5 + end + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + buttonIndexMap[obj.getGUID()] = howManyButtons + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + self.createButton({ + label="Selection", click_function="editDragSelection", function_owner=self, + position={0,0.3,2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(obj, move) + local index = buttonIndexMap[obj.getGUID()] + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +function editDragSelection(bagObj, player, remove) + local selectedObjs = Player[player].getSelectedObjects() + if not remove then + for _, obj in ipairs(selectedObjs) do + local index = buttonIndexMap[obj.getGUID()] + --Ignore if already in the memory list, or does not have a button + if index and not memoryList[obj.getGUID()] then + self.editButton({index=index, color={0,1,0,0.6}}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + end + end + else + for _, obj in ipairs(selectedObjs) do + local index = buttonIndexMap[obj.getGUID()] + if index and memoryList[obj.getGUID()] then + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end + end + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 3 - Yamamonogatari b99de3.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 3 - Yamamonogatari b99de3.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 3 - Yamamonogatari b99de3.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 3 - Yamamonogatari b99de3.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 4 - Houkaimonogatari 8f297e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 4 - Houkaimonogatari 8f297e.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 4 - Houkaimonogatari 8f297e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 4 - Houkaimonogatari 8f297e.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 5 - Fumeimonogatari b86938.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 5 - Fumeimonogatari b86938.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 5 - Fumeimonogatari b86938.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Model_Bag Scenario 5 - Fumeimonogatari b86938.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Tile Kaimonogatari f5db25.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Tile Kaimonogatari f5db25.ttslua index da38fca54..a559005a4 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Tile Kaimonogatari f5db25.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Tile Kaimonogatari f5db25.ttslua @@ -1,21 +1,21 @@ -name = 'Kaimonogatari' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Kaimonogatari' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Token Monogatari Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Token Monogatari Campaign Log eda22b.ttslua index db191365f..f4ffeef32 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Token Monogatari Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kaimonogatari 2df25a/Custom_Token Monogatari Campaign Log eda22b.ttslua @@ -1,75 +1,75 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) ]] --Prologue { @@ -160,572 +160,572 @@ defaultButtonData = { pos = {0.87,0.1,-0.092}, size = 260, state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.205,0.1,-1.115}, + size = 700, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.418,0.1,-0.962}, + size = 500, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.165,0.1,-0.962}, + size = 500, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.513,0.1,-1.115}, + size = 700, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.73,0.1,-0.962}, + size = 500, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.48,0.1,-0.962}, + size = 500, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {-1.205,0.1,-0.045}, + size = 700, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {-1.418,0.1,0.12}, + size = 500, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {-1.165,0.1,0.12}, + size = 500, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {-0.513,0.1,-0.045}, + size = 700, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {-0.73,0.1,0.12}, + size = 500, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {-0.48,0.1,0.12}, + size = 500, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.42,0.1,-1.381}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.42,0.1,-1.245}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.42,0.1,-0.63}, + rows = 6, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.73,0.1,-1.381}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.73,0.1,-1.245}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.73,0.1,-0.63}, + rows = 6, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {-1.42,0.1,-0.31}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {-1.42,0.1,-0.17}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {-1.42,0.1,0.38}, + rows = 4, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {-0.73,0.1,-0.31}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {-0.73,0.1,-0.17}, + rows = 1, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {-0.73,0.1,0.38}, + rows = 4, + width = 2800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {0.41,0.1,0.52}, + rows = 12, + width = 5800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.205,0.1,-1.115}, - size = 700, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.418,0.1,-0.962}, - size = 500, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.165,0.1,-0.962}, - size = 500, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.513,0.1,-1.115}, - size = 700, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.73,0.1,-0.962}, - size = 500, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.48,0.1,-0.962}, - size = 500, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {-1.205,0.1,-0.045}, - size = 700, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {-1.418,0.1,0.12}, - size = 500, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {-1.165,0.1,0.12}, - size = 500, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {-0.513,0.1,-0.045}, - size = 700, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {-0.73,0.1,0.12}, - size = 500, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {-0.48,0.1,0.12}, - size = 500, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.42,0.1,-1.381}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.42,0.1,-1.245}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.42,0.1,-0.63}, - rows = 6, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.73,0.1,-1.381}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.73,0.1,-1.245}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.73,0.1,-0.63}, - rows = 6, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {-1.42,0.1,-0.31}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {-1.42,0.1,-0.17}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {-1.42,0.1,0.38}, - rows = 4, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {-0.73,0.1,-0.31}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {-0.73,0.1,-0.17}, - rows = 1, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {-0.73,0.1,0.38}, - rows = 4, - width = 2800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {0.41,0.1,0.52}, - rows = 12, - width = 5800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {-1.26,0.1,0.837}, - rows = 4, - width = 5600, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end + --Killed and Insane Investigators + { + pos = {-1.26,0.1,0.837}, + rows = 4, + width = 5600, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Dziwny Przypadek Benedicta Burtona bd069f.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Dziwny Przypadek Benedicta Burtona bd069f.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Dziwny Przypadek Benedicta Burtona bd069f.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Dziwny Przypadek Benedicta Burtona bd069f.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Nieuchwytny 31a93a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Nieuchwytny 31a93a.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Nieuchwytny 31a93a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Nieuchwytny 31a93a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Podniebny Koncert 2889f0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Podniebny Koncert 2889f0.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Podniebny Koncert 2889f0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Podniebny Koncert 2889f0.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Przeznacznenie w Red Hook 1e00a9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Przeznacznenie w Red Hook 1e00a9.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Przeznacznenie w Red Hook 1e00a9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Kiedy sny Stają się Rzeczywiścią acdf16/Bag Przeznacznenie w Red Hook 1e00a9.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8/Custom_Tile Knightfall 271ce2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8/Custom_Tile Knightfall 271ce2.ttslua index c2370fa18..02c9b2688 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8/Custom_Tile Knightfall 271ce2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Knightfall df62e8/Custom_Tile Knightfall 271ce2.ttslua @@ -1,21 +1,21 @@ -name = 'Knightfall' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Knightfall' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca/Custom_Tile Last Call at Roxie's 567db0.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca/Custom_Tile Last Call at Roxie's 567db0.ttslua index 5206cda4e..7c6288894 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca/Custom_Tile Last Call at Roxie's 567db0.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Last Call at Roxie's c6a1ca/Custom_Tile Last Call at Roxie's 567db0.ttslua @@ -1,21 +1,21 @@ -name = 'Last Call at Roxies' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Last Call at Roxies' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8/Custom_Tile Core Difficulty aae2b1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8/Custom_Tile Core Difficulty aae2b1.ttslua index c7ea585c8..ce26fb1d9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8/Custom_Tile Core Difficulty aae2b1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Masks of Nyarlathotep – New York 94a1f8/Custom_Tile Core Difficulty aae2b1.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.ttslua index ca858aa9a..42affc223 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Miskatonic Mouse 0954ef/Custom_Model Custom Data Helper aa3d8a.ttslua @@ -1,38 +1,38 @@ --- set true to enable debug logging -DEBUG = false - -function log(message) - if DEBUG then - print(message) - end -end - ---[[ -Known locations and clues. We check this to determine if we should -atttempt to spawn clues, first we look for _ and if -we find nothing we look for -format is [location_guid -> clueCount] -]] -LOCATIONS_DATA_JSON = [[ -{ - "Park Entrance": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Main Street, U.S.A.": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Park Entrance": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "The Hub": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Adventureland": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Frontierland": {"type": "fixed", "value": 3, "clueSide": "front"}, - "New Orleans Square": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Critter Country": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Galaxy's Edge": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Fantasyland": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Toontown": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Tomorrowland": {"type": "fixed", "value": 3, "clueSide": "front"} -} -]] - -LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) - -function onload(save_state) - local playArea = getObjectFromGUID('721ba2') - playArea.call("updateLocations", {self.getGUID()}) -end +-- set true to enable debug logging +DEBUG = false + +function log(message) + if DEBUG then + print(message) + end +end + +--[[ +Known locations and clues. We check this to determine if we should +atttempt to spawn clues, first we look for _ and if +we find nothing we look for +format is [location_guid -> clueCount] +]] +LOCATIONS_DATA_JSON = [[ +{ + "Park Entrance": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Main Street, U.S.A.": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Park Entrance": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "The Hub": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Adventureland": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Frontierland": {"type": "fixed", "value": 3, "clueSide": "front"}, + "New Orleans Square": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Critter Country": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Galaxy's Edge": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Fantasyland": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Toontown": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Tomorrowland": {"type": "fixed", "value": 3, "clueSide": "front"} +} +]] + +LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) + +function onload(save_state) + local playArea = getObjectFromGUID('721ba2') + playArea.call("updateLocations", {self.getGUID()}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Custom_Tile Murder at the Excelsior Hotel bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Custom_Tile Murder at the Excelsior Hotel bbb70a.ttslua index 46732a4a2..6f70e0940 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Custom_Tile Murder at the Excelsior Hotel bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Murder at the Excelsior Hotel 01d780/Custom_Tile Murder at the Excelsior Hotel bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'Excelsior' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Excelsior' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 1 147dea.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 1 147dea.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 1 147dea.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 1 147dea.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 2 7f9f0d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 2 7f9f0d.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 2 7f9f0d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 2 7f9f0d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 3 df5156.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 3 df5156.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 3 df5156.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Bag Part 3 df5156.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Custom_Tile Core Difficulty ea0896.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Custom_Tile Core Difficulty ea0896.ttslua index c7ea585c8..ce26fb1d9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Custom_Tile Core Difficulty ea0896.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag North Country Cycle aaceca/Custom_Tile Core Difficulty ea0896.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50.ttslua index ed7a62e7d..45f110e8b 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a.ttslua index 1d754d17c..409896272 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a/Custom_Tile Core Difficulty 56a08b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a/Custom_Tile Core Difficulty 56a08b.ttslua index 476f361a0..e79bc79e7 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a/Custom_Tile Core Difficulty 56a08b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 1 Eye on the Prize e54f2a/Custom_Tile Core Difficulty 56a08b.ttslua @@ -1,21 +1,21 @@ -name = 'Of Sphinx' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Of Sphinx' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 2 Chaos in Cairo 6e0236.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 2 Chaos in Cairo 6e0236.ttslua index 1d754d17c..409896272 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 2 Chaos in Cairo 6e0236.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 2 Chaos in Cairo 6e0236.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 3 The Will to Triump 6d8dad.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 3 The Will to Triump 6d8dad.ttslua index 1d754d17c..409896272 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 3 The Will to Triump 6d8dad.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Of Sphinx and Sands eeeb50/Bag 3 The Will to Triump 6d8dad.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202.ttslua index d88f19b4b..a085f3c96 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Midnight in Paris 7cda3f.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Midnight in Paris 7cda3f.ttslua index 360f86347..7a4d95fda 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Midnight in Paris 7cda3f.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Midnight in Paris 7cda3f.ttslua @@ -1,505 +1,505 @@ --- Utility memory bag by Directsun --- Version 2.5 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - print("updating memory with moves") - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - print(guid) - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - print(_) - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + print("updating memory with moves") + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + print(guid) + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + print(_) + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Shadows of Brocéliande 7b28eb.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Shadows of Brocéliande 7b28eb.ttslua index a6759c861..a40fbbd64 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Shadows of Brocéliande 7b28eb.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Shadows of Brocéliande 7b28eb.ttslua @@ -1,505 +1,505 @@ --- Utility memory bag by Directsun --- Version 2.5 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - print("updating memory with moves") - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - print(guid) - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - print(_) - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + print("updating memory with moves") + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + print(guid) + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + print(_) + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag The München Conspiracy 286579.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag The München Conspiracy 286579.ttslua index a6759c861..a40fbbd64 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag The München Conspiracy 286579.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag The München Conspiracy 286579.ttslua @@ -1,505 +1,505 @@ --- Utility memory bag by Directsun --- Version 2.5 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - print("updating memory with moves") - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - print(guid) - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - print(_) - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + print("updating memory with moves") + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + print(guid) + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + print(_) + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Tibetan Winds ba2ded.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Tibetan Winds ba2ded.ttslua index 360f86347..7a4d95fda 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Tibetan Winds ba2ded.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Bag Tibetan Winds ba2ded.ttslua @@ -1,505 +1,505 @@ --- Utility memory bag by Directsun --- Version 2.5 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - print("updating memory with moves") - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - print(guid) - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - print(_) - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Move", click_function="buttonClick_transpose", function_owner=self, - position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + print("updating memory with moves") + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + print(guid) + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + print(_) + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0,0.3,-3.6}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0,0.3,-4.4}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0,0.3,-5.2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Move", click_function="buttonClick_transpose", function_owner=self, + position={-2.8,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Custom_Tile Ordo Templi Orientis bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Custom_Tile Ordo Templi Orientis bbb70a.ttslua index 97ed54b6f..606e250c5 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Custom_Tile Ordo Templi Orientis bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Ordo Templi Orientis 7cf202/Custom_Tile Ordo Templi Orientis bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'Ordis' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'Ordis' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag c0897e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag c0897e.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag c0897e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag c0897e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 1 Nightmare or Dream f39e68.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 1 Nightmare or Dream f39e68.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 1 Nightmare or Dream f39e68.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 1 Nightmare or Dream f39e68.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 2 Awake 6ca52c.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 2 Awake 6ca52c.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 2 Awake 6ca52c.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Bag 2 Awake 6ca52c.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Custom_Tile Core Difficulty 56a08b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Custom_Tile Core Difficulty 56a08b.ttslua index c7ea585c8..ce26fb1d9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Custom_Tile Core Difficulty 56a08b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Parallel Universe 28e0a1/Custom_Tile Core Difficulty 56a08b.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Adding Pokemon To An Existing Campaign 7b57ad.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Adding Pokemon To An Existing Campaign 7b57ad.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Adding Pokemon To An Existing Campaign 7b57ad.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Adding Pokemon To An Existing Campaign 7b57ad.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Basic Pokemon d14543.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Basic Pokemon d14543.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Basic Pokemon d14543.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Basic Pokemon d14543.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Pokemon Investigators 05109d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Pokemon Investigators 05109d.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Pokemon Investigators 05109d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Pokemon Investigators 05109d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1/Custom_Tile Pokemon Eldritch Edition 3837a5.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1/Custom_Tile Pokemon Eldritch Edition 3837a5.ttslua index 71c417e00..5093ba655 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1/Custom_Tile Pokemon Eldritch Edition 3837a5.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 1 The Conjuring e1caf1/Custom_Tile Pokemon Eldritch Edition 3837a5.ttslua @@ -1,21 +1,21 @@ -name = 'Pokemon' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Pokemon' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2a The Winding Road 61801e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2a The Winding Road 61801e.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2a The Winding Road 61801e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2a The Winding Road 61801e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2b Shipments From The Unknown 13ed7d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2b Shipments From The Unknown 13ed7d.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2b Shipments From The Unknown 13ed7d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 2b Shipments From The Unknown 13ed7d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3a Viridian f040a6.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3a Viridian f040a6.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3a Viridian f040a6.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3a Viridian f040a6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3b Deep Secrets 3da6dd.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3b Deep Secrets 3da6dd.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3b Deep Secrets 3da6dd.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 3b Deep Secrets 3da6dd.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 4 The Unconjuring 52d102.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 4 The Unconjuring 52d102.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 4 The Unconjuring 52d102.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Scenario 4 The Unconjuring 52d102.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15/Custom_Tile Eldritch Safari 3837a5.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15/Custom_Tile Eldritch Safari 3837a5.ttslua index 854b30bd5..749dcbfa9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15/Custom_Tile Eldritch Safari 3837a5.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 1 Eldritch Safari 1fae15/Custom_Tile Eldritch Safari 3837a5.ttslua @@ -1,21 +1,21 @@ -name = 'Safari' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Safari' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf/Custom_Tile Project Cerulean 3837a5.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf/Custom_Tile Project Cerulean 3837a5.ttslua index 937603789..a5c1bbe0b 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf/Custom_Tile Project Cerulean 3837a5.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Side-Story 2 Project Cerulean 4c07bf/Custom_Tile Project Cerulean 3837a5.ttslua @@ -1,21 +1,21 @@ -name = 'Cerulean' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Cerulean' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Upgrade Pokemon 2cea4e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Upgrade Pokemon 2cea4e.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Upgrade Pokemon 2cea4e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Bag Upgrade Pokemon 2cea4e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Custom_Token Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Custom_Token Campaign Log eda22b.ttslua index d5fb74c82..588598831 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Custom_Token Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Pokemon Eldritch Edition 75fe78/Custom_Token Campaign Log eda22b.ttslua @@ -1,651 +1,651 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.080,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.270,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.000,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.251,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.441,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.171,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {0.579,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {0.389,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {0.659,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {1.407,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {1.217,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {1.487,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.265,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.265,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.265,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.436,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.436,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.436,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {0.394,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {0.394,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {0.394,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {1.222,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {1.222,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {1.222,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.930,0.1,0.930}, - rows = 27, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.820,0.1,0.707}, - rows = 20, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {1.010,0.1,1.700}, - rows = 5, - width = 7400, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.080,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.270,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.000,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.251,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.441,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.171,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {0.579,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {0.389,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {0.659,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {1.407,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {1.217,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {1.487,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.265,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.265,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.265,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.436,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.436,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.436,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {0.394,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {0.394,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {0.394,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {1.222,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {1.222,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {1.222,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.930,0.1,0.930}, + rows = 27, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.820,0.1,0.707}, + rows = 20, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Killed and Insane Investigators + { + pos = {1.010,0.1,1.700}, + rows = 5, + width = 7400, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Custom_Tile Read or Die b5928a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Custom_Tile Read or Die b5928a.ttslua index 42778aed7..0dd8ca8e1 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Custom_Tile Read or Die b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Read or Die 9e73fa/Custom_Tile Read or Die b5928a.ttslua @@ -1,21 +1,21 @@ -name = 'Read or Die' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Read or Die' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 1 In Search Of Sanity 961940.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 1 In Search Of Sanity 961940.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 1 In Search Of Sanity 961940.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 1 In Search Of Sanity 961940.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 2 The Thrushmoor Terror eea51b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 2 The Thrushmoor Terror eea51b.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 2 The Thrushmoor Terror eea51b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Bag 2 The Thrushmoor Terror eea51b.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Custom_Tile Strange Aeons 82e1ed.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Custom_Tile Strange Aeons 82e1ed.ttslua index 8f300ba86..e74915067 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Custom_Tile Strange Aeons 82e1ed.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Strange Aeons 2abdd6/Custom_Tile Strange Aeons 82e1ed.ttslua @@ -1,21 +1,21 @@ -name = 'Strange Aeons' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'Strange Aeons' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301/Custom_Tile Stranger Things bc825a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301/Custom_Tile Stranger Things bc825a.ttslua index accf324f6..23e08a4d9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301/Custom_Tile Stranger Things bc825a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Stranger Things 408301/Custom_Tile Stranger Things bc825a.ttslua @@ -1,21 +1,21 @@ -name = 'Stranger Things' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Stranger Things' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.ttslua index 54d591927..0748143c2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 1 Plot Uncovered 67d524.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 1 Plot Uncovered 67d524.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 1 Plot Uncovered 67d524.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 1 Plot Uncovered 67d524.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 2 Dark Waters 90aab1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 2 Dark Waters 90aab1.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 2 Dark Waters 90aab1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 2 Dark Waters 90aab1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 3 Curiosities 20982e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 3 Curiosities 20982e.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 3 Curiosities 20982e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 3 Curiosities 20982e.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 4 Shadow Rails 3a3b5a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 4 Shadow Rails 3a3b5a.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 4 Shadow Rails 3a3b5a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 4 Shadow Rails 3a3b5a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 5 lair of the Cult 266dcb.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 5 lair of the Cult 266dcb.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 5 lair of the Cult 266dcb.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 5 lair of the Cult 266dcb.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 6 Domain of Baal 84cdaf.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 6 Domain of Baal 84cdaf.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 6 Domain of Baal 84cdaf.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Bag 6 Domain of Baal 84cdaf.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Custom_Tile The Approaching Storm 7521a9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Custom_Tile The Approaching Storm 7521a9.ttslua index 7af28b4f4..1c0f40de9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Custom_Tile The Approaching Storm 7521a9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Approaching Storm 0fad66/Custom_Tile The Approaching Storm 7521a9.ttslua @@ -1,21 +1,21 @@ -name = 'Approaching Storm' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Approaching Storm' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Epic Multiplayer 2c10cf.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Epic Multiplayer 2c10cf.ttslua index f82d90245..758efa0e2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Epic Multiplayer 2c10cf.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Epic Multiplayer 2c10cf.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Setup", click_function="buttonClick_setup", function_owner=self, ---- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={1,1,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Setup", click_function="buttonClick_setup", function_owner=self, +--- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={1,1,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Single Group 830305.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Single Group 830305.ttslua index f82d90245..758efa0e2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Single Group 830305.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Bag Single Group 830305.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Setup", click_function="buttonClick_setup", function_owner=self, ---- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={1,1,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Setup", click_function="buttonClick_setup", function_owner=self, +--- position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={1,1,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_Tile The Blob that Ate Everything bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_Tile The Blob that Ate Everything bbb70a.ttslua index ac13f876e..ad353a3f2 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_Tile The Blob that Ate Everything bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Blob that Ate Everything 4dee5a/Custom_Tile The Blob that Ate Everything bbb70a.ttslua @@ -1,25 +1,25 @@ -name = 'The Blob' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'The Blob' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb/Custom_Tile The Collector 150603.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb/Custom_Tile The Collector 150603.ttslua index af63b7201..91fb38d19 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb/Custom_Tile The Collector 150603.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Collector 9810eb/Custom_Tile The Collector 150603.ttslua @@ -1,21 +1,21 @@ -name = 'The Collector' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Collector' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff/Custom_Tile The Colour out of Space 2e887e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff/Custom_Tile The Colour out of Space 2e887e.ttslua index dbc84856b..9e9359d36 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff/Custom_Tile The Colour out of Space 2e887e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Colour out of Space 5b81ff/Custom_Tile The Colour out of Space 2e887e.ttslua @@ -1,21 +1,21 @@ -name = 'The Colour out of Space' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Colour out of Space' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d/Custom_Tile The Curse of Amultep b3cbc1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d/Custom_Tile The Curse of Amultep b3cbc1.ttslua index 31eb20a69..354659bc7 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d/Custom_Tile The Curse of Amultep b3cbc1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Curse of Amulotep 0d7a8d/Custom_Tile The Curse of Amultep b3cbc1.ttslua @@ -1,21 +1,21 @@ -name = 'The Curse of Amultep' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Curse of Amultep' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9/Custom_Tile The Dying Star 8d62ae.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9/Custom_Tile The Dying Star 8d62ae.ttslua index 75a63c904..931990e74 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9/Custom_Tile The Dying Star 8d62ae.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 1 b310b9/Custom_Tile The Dying Star 8d62ae.ttslua @@ -1,21 +1,21 @@ -name = 'The Dying Star' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Dying Star' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d/Custom_Tile The Dying Star a148f2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d/Custom_Tile The Dying Star a148f2.ttslua index 75a63c904..931990e74 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d/Custom_Tile The Dying Star a148f2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Dying Star bcfff6/Bag Part 2 c2a55d/Custom_Tile The Dying Star a148f2.ttslua @@ -1,21 +1,21 @@ -name = 'The Dying Star' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Dying Star' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a/Custom_Tile The Festival 4b81f6.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a/Custom_Tile The Festival 4b81f6.ttslua index 392b969e5..c8283e89f 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a/Custom_Tile The Festival 4b81f6.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Festival 29d22a/Custom_Tile The Festival 4b81f6.ttslua @@ -1,21 +1,21 @@ -name = 'The Festival' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Festival' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1/Custom_Tile Core Difficulty 9cd1ad.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1/Custom_Tile Core Difficulty 9cd1ad.ttslua index c7ea585c8..ce26fb1d9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1/Custom_Tile Core Difficulty 9cd1ad.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Grand Oak Hotel 4255b1/Custom_Tile Core Difficulty 9cd1ad.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group A 79b534.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group B c7c4c1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Epic Group C c352ac.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group A 2ea2a2.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group B 14808b.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Bag Single Group C 76b476.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.ttslua index 91793b491..1ef613c2a 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Labyrinths of Lunacy 4c173f/Custom_Tile The Labyrinths of Lunacy f4dcee.ttslua @@ -1,21 +1,21 @@ -name = 'The Labyrinths of Lunacy' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Labyrinths of Lunacy' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2.ttslua index 5aa27be92..d3a91c848 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Tile The Legend of Sleepy Hollow bbb70a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Tile The Legend of Sleepy Hollow bbb70a.ttslua index ed6b304fe..0294acb1d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Tile The Legend of Sleepy Hollow bbb70a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Tile The Legend of Sleepy Hollow bbb70a.ttslua @@ -1,13 +1,13 @@ -name = 'Sleepy Hollow' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) +name = 'Sleepy Hollow' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Token Generic Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Token Generic Campaign Log eda22b.ttslua index 4ea5509ad..0942cf0ac 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Token Generic Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Legend of Sleepy Hollow b46db2/Custom_Token Generic Campaign Log eda22b.ttslua @@ -1,509 +1,509 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.080,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.270,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.000,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.251,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.441,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.171,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {0.579,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {0.389,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {0.659,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {1.407,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {1.217,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {1.487,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.265,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.265,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.265,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.436,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.436,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.436,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {0.394,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {0.394,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {0.394,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {1.222,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {1.222,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {1.222,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 1 - { - pos = {-0.930,0.1,0.930}, - rows = 27, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes 2 - { - pos = {0.820,0.1,0.707}, - rows = 20, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {1.010,0.1,1.700}, - rows = 5, - width = 7400, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -function updateSave() - saved_data = JSON.encode(ref_buttonData) - if disableSave==true then saved_data="" end - self.script_state = saved_data -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end -end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.080,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.270,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.000,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.251,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.441,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.171,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {0.579,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {0.389,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {0.659,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {1.407,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {1.217,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {1.487,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.265,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.265,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.265,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.436,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.436,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.436,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {0.394,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {0.394,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {0.394,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {1.222,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {1.222,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {1.222,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 1 + { + pos = {-0.930,0.1,0.930}, + rows = 27, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes 2 + { + pos = {0.820,0.1,0.707}, + rows = 20, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Killed and Insane Investigators + { + pos = {1.010,0.1,1.700}, + rows = 5, + width = 7400, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +function updateSave() + saved_data = JSON.encode(ref_buttonData) + if disableSave==true then saved_data="" end + self.script_state = saved_data +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55/Custom_Tile A Loving Spouse ea41d9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55/Custom_Tile A Loving Spouse ea41d9.ttslua index 7ad001427..8c66c0fe3 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55/Custom_Tile A Loving Spouse ea41d9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 1 A Loving Spouse 4c5c55/Custom_Tile A Loving Spouse ea41d9.ttslua @@ -1,21 +1,21 @@ -name = 'London Set 1' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'London Set 1' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66/Custom_Tile Mrs Tillywingers Cat 0ae91a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66/Custom_Tile Mrs Tillywingers Cat 0ae91a.ttslua index 562cf43bf..392146f03 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66/Custom_Tile Mrs Tillywingers Cat 0ae91a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 2 Mrs Tillywingers Cat c56f66/Custom_Tile Mrs Tillywingers Cat 0ae91a.ttslua @@ -1,21 +1,21 @@ -name = 'London Set 2' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'London Set 2' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3/Custom_Tile Disgracing Alderman Whitney c2736e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3/Custom_Tile Disgracing Alderman Whitney c2736e.ttslua index 83121ac95..8e7652429 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3/Custom_Tile Disgracing Alderman Whitney c2736e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The London Set 0f96ac/Bag 3 Disgracing Alderman Whitn 905ad3/Custom_Tile Disgracing Alderman Whitney c2736e.ttslua @@ -1,21 +1,21 @@ -name = 'London Set 3' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'London Set 3' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12/Custom_Tile The Nephew Calls 54707a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12/Custom_Tile The Nephew Calls 54707a.ttslua index 8849d7feb..a51884f2c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12/Custom_Tile The Nephew Calls 54707a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Nephew Calls 3ddd12/Custom_Tile The Nephew Calls 54707a.ttslua @@ -1,21 +1,21 @@ -name = 'The Nephew Calls' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Nephew Calls' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 1 526ff9.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 1 526ff9.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 1 526ff9.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 1 526ff9.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 2 5b3ac7.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 2 5b3ac7.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 2 5b3ac7.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 2 5b3ac7.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 3 d166f2.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 3 d166f2.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 3 d166f2.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Bag Part 3 d166f2.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Custom_Tile The Outsider d5b06c.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Custom_Tile The Outsider d5b06c.ttslua index 9686b0f8a..c7d360676 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Custom_Tile The Outsider d5b06c.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Outsider 3c175c/Custom_Tile The Outsider d5b06c.ttslua @@ -1,21 +1,21 @@ -name = 'The Outsider' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'The Outsider' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38/Custom_Tile The Pensher Wyrm c606a1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38/Custom_Tile The Pensher Wyrm c606a1.ttslua index e71cfb253..89881072c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38/Custom_Tile The Pensher Wyrm c606a1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Pensher Wyrm 504f38/Custom_Tile The Pensher Wyrm c606a1.ttslua @@ -1,21 +1,21 @@ -name = 'The Pensher Wyrm' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end +name = 'The Pensher Wyrm' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Red Room fa4327.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Red Room fa4327.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Red Room fa4327.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Red Room fa4327.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4/Custom_Tile Core Difficulty ec7a73.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4/Custom_Tile Core Difficulty ec7a73.ttslua index c7ea585c8..ce26fb1d9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4/Custom_Tile Core Difficulty ec7a73.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Stolen Baillius bfefd4/Custom_Tile Core Difficulty ec7a73.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b/Custom_Tile Core Difficulty a751fe.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b/Custom_Tile Core Difficulty a751fe.ttslua index c7ea585c8..ce26fb1d9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b/Custom_Tile Core Difficulty a751fe.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Svalbard Event 7bc42b/Custom_Tile Core Difficulty a751fe.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Model Custom Data Helper c0b834.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Model Custom Data Helper c0b834.ttslua index 2f7f3a921..7db02d708 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Model Custom Data Helper c0b834.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Model Custom Data Helper c0b834.ttslua @@ -1,37 +1,37 @@ --- set true to enable debug logging -DEBUG = false - -function log(message) - if DEBUG then - print(message) - end -end - ---[[ -Known locations and clues. We check this to determine if we should -atttempt to spawn clues, first we look for _ and if -we find nothing we look for -format is [location_guid -> clueCount] -]] -LOCATIONS_DATA_JSON = [[ -{ - "Entrance Hall": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Main Lobby": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Gallery": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Auditorium": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Anechoic Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Instrument Closet": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Recording Studio": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Rehearsal Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Scene Shop": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Tiring Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Stage Hall": {"type": "fixed", "value": 1, "clueSide": "front"} -} -]] - -LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) - -function onload(save_state) - local playArea = getObjectFromGUID('721ba2') - playArea.call("updateLocations", {self.getGUID()}) -end +-- set true to enable debug logging +DEBUG = false + +function log(message) + if DEBUG then + print(message) + end +end + +--[[ +Known locations and clues. We check this to determine if we should +atttempt to spawn clues, first we look for _ and if +we find nothing we look for +format is [location_guid -> clueCount] +]] +LOCATIONS_DATA_JSON = [[ +{ + "Entrance Hall": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Main Lobby": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Gallery": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Auditorium": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Anechoic Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Instrument Closet": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Recording Studio": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Rehearsal Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Scene Shop": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Tiring Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Stage Hall": {"type": "fixed", "value": 1, "clueSide": "front"} +} +]] + +LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) + +function onload(save_state) + local playArea = getObjectFromGUID('721ba2') + playArea.call("updateLocations", {self.getGUID()}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Tile The Symphony of Erich Zann f4c93e.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Tile The Symphony of Erich Zann f4c93e.ttslua index 9cecde9ef..e0c809bfe 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Tile The Symphony of Erich Zann f4c93e.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Symphony of Erich Zann b7c6be/Custom_Tile The Symphony of Erich Zann f4c93e.ttslua @@ -1,25 +1,25 @@ -name = 'Erich Zann' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) -end +name = 'Erich Zann' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49/Custom_Tile Core Difficulty 2261a5.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49/Custom_Tile Core Difficulty 2261a5.ttslua index c7ea585c8..ce26fb1d9 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49/Custom_Tile Core Difficulty 2261a5.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The Thing in the Woods c90c49/Custom_Tile Core Difficulty 2261a5.ttslua @@ -1,21 +1,21 @@ -name = 'Core Set' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Core Set' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 1 First Contact f70a0d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 1 First Contact f70a0d.ttslua index cae387265..013eb65ca 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 1 First Contact f70a0d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 1 First Contact f70a0d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 2 Phobos and Deimos 313523.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 2 Phobos and Deimos 313523.ttslua index cae387265..013eb65ca 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 2 Phobos and Deimos 313523.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 2 Phobos and Deimos 313523.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 3 The Thirsting Void a0d2b1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 3 The Thirsting Void a0d2b1.ttslua index cae387265..013eb65ca 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 3 The Thirsting Void a0d2b1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Model_Bag 3 The Thirsting Void a0d2b1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1* 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=400, width=400, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPosition(entry.pos) - obj.setRotation(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1* 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=400, width=400, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPosition(entry.pos) + obj.setRotation(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Tile War of the Worlds b5928a.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Tile War of the Worlds b5928a.ttslua index 267e4346b..4a3502c94 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Tile War of the Worlds b5928a.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Tile War of the Worlds b5928a.ttslua @@ -1,21 +1,21 @@ name = 'War of the Worlds' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Token War of the Worlds Campaign Log eda22b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Token War of the Worlds Campaign Log eda22b.ttslua index 6011ced73..64a6b9bcb 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Token War of the Worlds Campaign Log eda22b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag The War of the Worlds 19d469/Custom_Token War of the Worlds Campaign Log eda22b.ttslua @@ -1,682 +1,682 @@ ---[[ Character Sheet Template by: MrStump - -You can set up your own character sheet if you follow these steps. - -Step 1) Change the character sheet image - -Right click on the character sheet, click Custom - -Replace the image URL with one for your character sheet - -Click import, make sure your sheet loads - -SAVE THE GAME (the table setup) - -LOAD FROM THAT SAVE YOU JUST MADE - -Step 2) Edit script to fit your character sheet - -Below you will see some general options, and then the big data table - -The data table is what determines how many of which buttons are made - -Checkboxes - -Counters - -Textboxes - -By default, there are 3 of each. You can add more or remove entries - -If you intend to add/remove, be sure only to add/remove ENTRIES - -This is what an entry looks like: - { - pos = {-0.977,0.1,-0.589}, - size = 800, - state = false - }, - -Deleting the whole thing would remove that specific item on the sheet - -Copy and pasting it after another entry would create another - -Each entry type has unique data points (pos, size, state, etc) - -Do not try to add in your own data points or remove them individually - -There is a summary of what each point does at the top of its category - -Step 3) Save and check script changes - -Hit Save & Apply in the script window to save your code - -You can edit your code as needed and Save+Apply as often as needed - -When you are finished, make disableSave = false below then Save+apply - -This enables saving, so your sheet will remember whats on it. - -Bonus) Finding/Editing Positions for elements - I have included a tool to get positions for buttons in {x,y,z} form - Place it where you want the center of your element to be - Then copy the table from the notes (lower right of screen) - You can highlight it and CTRL+C - Paste it into the data table where needed (pos=) - If you want to manually tweek the values: - {0,0,0} is the center of the character sheet - {1,0,0} is right, {-1,0,0} is left - {0,0,-1} is up, {0,0,1} is down - 0.1 for Y is the height off of the page. - If it was 0, it would be down inside the model of the sheet - -Begin editing below: ]] - ---Set this to true while editing and false when you have finished -disableSave = false ---Remember to set this to false once you are done making changes ---Then, after you save & apply it, save your game too - ---Color information for button text (r,g,b, values of 0-1) -buttonFontColor = {0,0,0} ---Color information for button background -buttonColor = {1,1,1} ---Change scale of button (Avoid changing if possible) -buttonScale = {0.1,0.1,0.1} - ---This is the button placement information -defaultButtonData = { - --Add checkboxes - checkbox = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for checkbox - state = default starting value for checkbox (true=checked, false=not) - ]] - --First Contact - { - pos = {-1.730,0.1,1.140}, - size = 500, - state = false - }, - --Phobos and Deimos - { - pos = {-0.968,0.1,1.355}, - size = 500, - state = false - }, - --The Stillness - { - pos = {-1.683,0.1,1.560}, - size = 500, - state = false - }, - --The Thirsting Void - { - pos = {-0.888,0.1,1.746}, - size = 500, - state = false - }, - --End of checkboxes - }, - --Add counters that have a + and - button - counter = { - --[[ - pos = the position (pasted from the helper tool) - size = height/width/font_size for counter - value = default starting value for counter - hideBG = if background of counter is hidden (true=hidden, false=not) - ]] - --1st Player Experience - { - pos = {-1.080,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --1st Player Physical Trauma - { - pos = {-1.270,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --1st Player Mental Trauma - { - pos = {-1.000,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Experience - { - pos = {-0.251,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --2nd Player Physical Trauma - { - pos = {-0.441,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --2nd Player Mental Trauma - { - pos = {-0.171,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Experience - { - pos = {0.579,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --3rd Player Physical Trauma - { - pos = {0.389,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --3rd Player Mental Trauma - { - pos = {0.659,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Experience - { - pos = {1.407,0.1,-1.010}, - size = 800, - value = 0, - hideBG = true - }, - --4th Player Physical Trauma - { - pos = {1.217,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --4th Player Mental Trauma - { - pos = {1.487,0.1,-0.790}, - size = 600, - value = 0, - hideBG = true - }, - --Sacrifices to Nodens - { - pos = {0.890,0.1,1.150}, - size = 1000, - value = 0, - hideBG = true - }, - --End of counters - }, - --Add editable text boxes - textbox = { - --[[ - pos = the position (pasted from the helper tool) - rows = how many lines of text you want for this box - width = how wide the text box is - font_size = size of text. This and "rows" effect overall height - label = what is shown when there is no text. "" = nothing - value = text entered into box. "" = nothing - alignment = Number to indicate how you want text aligned - (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) - ]] - --1st Player Name - { - pos = {-1.265,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Investigator - { - pos = {-1.265,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --1st Player Story Assets/Weaknesses - { - pos = {-1.265,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Name - { - pos = {-0.436,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Investigator - { - pos = {-0.436,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --2nd Player Story Assets/Weaknesses - { - pos = {-0.436,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Name - { - pos = {0.394,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Investigator - { - pos = {0.394,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --3rd Player Story Assets/Weaknesses - { - pos = {0.394,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Name - { - pos = {1.222,0.1,-1.390}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Investigator - { - pos = {1.222,0.1,-1.195}, - rows = 1, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --4th Player Story Assets/Weaknesses - { - pos = {1.222,0.1,-0.420}, - rows = 7, - width = 3800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Campaign Notes - { - pos = {-0.930,0.1,0.620}, - rows = 12, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Evacuated Locations - { - pos = {0.820,0.1,0.500}, - rows = 10, - width = 7800, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --Killed and Insane Investigators - { - pos = {1.010,0.1,1.700}, - rows = 5, - width = 7400, - font_size = 300, - label = "Empty", - value = "", - alignment = 2 - }, - --End of textboxes - } -} - - - ---Lua beyond this point, I recommend doing something more fun with your life - - - ---Save function -local alreadySaving = false -- Copy this too! -function updateSave() - - function string.replaceText(text, old, new) - local b,e = text:find(old,1,true) - if b==nil then - return text - else - return text:sub(1,b-1) .. new .. text:sub(e+1) - end - end - - function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time - end - - function deepcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in next, orig, nil do - copy[deepcopy(orig_key)] = deepcopy(orig_value) - end - setmetatable(copy, deepcopy(getmetatable(orig))) - else -- number, string, boolean, etc - copy = orig - end - return copy - end - - function startSaving() - while alreadySaving do - wait(0.01) - end - alreadySaving = true - local ref_buttonData = deepcopy(ref_buttonData) - local input_values = {} - local checkbox_values = {} - local counter_values = {} - - local GUID = self.getGUID() - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - input_values[counter] = val.value - val.value = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - if val.label != nil then - input_values[counter] = val.label - val.label = "u"..GUID..":iv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - checkbox_values[counter] = val.value - val.value = "u"..GUID..":bv:"..counter.."u" - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - counter_values[counter] = val.value - val.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - counter_values[counter] = val2.value - val2.value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - if val2.change_value != nil then - counter_values[counter] = val2.change_value - val2.change_value = "u"..GUID..":cv:"..counter.."u" - counter = counter + 1 - end - end - end - - end - end - - saved_data = JSON.encode(ref_buttonData) - - local counter = 1 - for _, val in ipairs(ref_buttonData.textbox) do - if val.value != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.value = input_values[counter] - counter = counter + 1 - end - if val.label != nil then - saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) - val.label = input_values[counter] - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.checkbox) do - if val.value != nil then - val.value = checkbox_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - - local counter = 1 - for _, val in ipairs(ref_buttonData.counter) do - if val.value != nil then - val.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - - if val.counters != nil then - for _, val2 in ipairs(val.counters) do - if val2.value != nil then - val2.value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - if val2.change_value != nil then - val2.change_value = counter_values[counter] - saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) - counter = counter + 1 - end - end - end - - end - end - if disableSave==true then saved_data="" end - self.script_state = saved_data - - alreadySaving = false - return 1 - end - startLuaCoroutine(self, "startSaving") -end - ---Startup procedure -function onload(saved_data) - if disableSave==true then saved_data="" end - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - ref_buttonData = loaded_data - else - ref_buttonData = defaultButtonData - end - - spawnedButtonCount = 0 - createCheckbox() - createCounter() - createTextbox() -end - - - ---Click functions for buttons - - - ---Checks or unchecks the given box -function click_checkbox(tableIndex, buttonIndex) - if ref_buttonData.checkbox[tableIndex].state == true then - ref_buttonData.checkbox[tableIndex].state = false - self.editButton({index=buttonIndex, label=""}) - else - ref_buttonData.checkbox[tableIndex].state = true - self.editButton({index=buttonIndex, label=string.char(10008)}) - end - updateSave() -end - ---Applies value to given counter display -function click_counter(tableIndex, buttonIndex, amount) - ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount - self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) - updateSave() -end - ---Updates saved value for given text box -function click_textbox(i, value, selected) - if selected == false then - ref_buttonData.textbox[i].value = value - updateSave() - end -end - ---Dud function for if you have a background on a counter -function click_none() end - - - ---Button creation - - - ---Makes checkboxes -function createCheckbox() - for i, data in ipairs(ref_buttonData.checkbox) do - --Sets up reference function - local buttonNumber = spawnedButtonCount - local funcName = "checkbox"..i - local func = function() click_checkbox(i, buttonNumber) end - self.setVar(funcName, func) - --Sets up label - local label = "" - if data.state==true then label=string.char(10008) end - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=data.pos, height=data.size, width=data.size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - ---Makes counters -function createCounter() - for i, data in ipairs(ref_buttonData.counter) do - --Sets up display - local displayNumber = spawnedButtonCount - --Sets up label - local label = data.value - --Sets height/width for display - local size = data.size - if data.hideBG == true then size = 0 end - --Creates button and counts it - self.createButton({ - label=label, click_function="click_none", function_owner=self, - position=data.pos, height=size, width=size, - font_size=data.size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up add 1 - local funcName = "counterAdd"..i - local func = function() click_counter(i, displayNumber, 1) end - self.setVar(funcName, func) - --Sets up label - local label = "+" - --Sets up position - local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) - local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} - --Sets up size - local size = data.size / 2 - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - - --Sets up subtract 1 - local funcName = "counterSub"..i - local func = function() click_counter(i, displayNumber, -1) end - self.setVar(funcName, func) - --Sets up label - local label = "-" - --Set up position - local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} - --Creates button and counts it - self.createButton({ - label=label, click_function=funcName, function_owner=self, - position=pos, height=size, width=size, - font_size=size, scale=buttonScale, - color=buttonColor, font_color=buttonFontColor - }) - spawnedButtonCount = spawnedButtonCount + 1 - end -end - -function createTextbox() - for i, data in ipairs(ref_buttonData.textbox) do - --Sets up reference function - local funcName = "textbox"..i - local func = function(_,_,val,sel) click_textbox(i,val,sel) end - self.setVar(funcName, func) - - self.createInput({ - input_function = funcName, - function_owner = self, - label = data.label, - alignment = data.alignment, - position = data.pos, - scale = buttonScale, - width = data.width, - height = (data.font_size*data.rows)+24, - font_size = data.font_size, - color = buttonColor, - font_color = buttonFontColor, - value = data.value, - }) - end +--[[ Character Sheet Template by: MrStump + +You can set up your own character sheet if you follow these steps. + +Step 1) Change the character sheet image + -Right click on the character sheet, click Custom + -Replace the image URL with one for your character sheet + -Click import, make sure your sheet loads + -SAVE THE GAME (the table setup) + -LOAD FROM THAT SAVE YOU JUST MADE + +Step 2) Edit script to fit your character sheet + -Below you will see some general options, and then the big data table + -The data table is what determines how many of which buttons are made + -Checkboxes + -Counters + -Textboxes + -By default, there are 3 of each. You can add more or remove entries + -If you intend to add/remove, be sure only to add/remove ENTRIES + -This is what an entry looks like: + { + pos = {-0.977,0.1,-0.589}, + size = 800, + state = false + }, + -Deleting the whole thing would remove that specific item on the sheet + -Copy and pasting it after another entry would create another + -Each entry type has unique data points (pos, size, state, etc) + -Do not try to add in your own data points or remove them individually + -There is a summary of what each point does at the top of its category + +Step 3) Save and check script changes + -Hit Save & Apply in the script window to save your code + -You can edit your code as needed and Save+Apply as often as needed + -When you are finished, make disableSave = false below then Save+apply + -This enables saving, so your sheet will remember whats on it. + +Bonus) Finding/Editing Positions for elements + I have included a tool to get positions for buttons in {x,y,z} form + Place it where you want the center of your element to be + Then copy the table from the notes (lower right of screen) + You can highlight it and CTRL+C + Paste it into the data table where needed (pos=) + If you want to manually tweek the values: + {0,0,0} is the center of the character sheet + {1,0,0} is right, {-1,0,0} is left + {0,0,-1} is up, {0,0,1} is down + 0.1 for Y is the height off of the page. + If it was 0, it would be down inside the model of the sheet + +Begin editing below: ]] + +--Set this to true while editing and false when you have finished +disableSave = false +--Remember to set this to false once you are done making changes +--Then, after you save & apply it, save your game too + +--Color information for button text (r,g,b, values of 0-1) +buttonFontColor = {0,0,0} +--Color information for button background +buttonColor = {1,1,1} +--Change scale of button (Avoid changing if possible) +buttonScale = {0.1,0.1,0.1} + +--This is the button placement information +defaultButtonData = { + --Add checkboxes + checkbox = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for checkbox + state = default starting value for checkbox (true=checked, false=not) + ]] + --First Contact + { + pos = {-1.730,0.1,1.140}, + size = 500, + state = false + }, + --Phobos and Deimos + { + pos = {-0.968,0.1,1.355}, + size = 500, + state = false + }, + --The Stillness + { + pos = {-1.683,0.1,1.560}, + size = 500, + state = false + }, + --The Thirsting Void + { + pos = {-0.888,0.1,1.746}, + size = 500, + state = false + }, + --End of checkboxes + }, + --Add counters that have a + and - button + counter = { + --[[ + pos = the position (pasted from the helper tool) + size = height/width/font_size for counter + value = default starting value for counter + hideBG = if background of counter is hidden (true=hidden, false=not) + ]] + --1st Player Experience + { + pos = {-1.080,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --1st Player Physical Trauma + { + pos = {-1.270,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --1st Player Mental Trauma + { + pos = {-1.000,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Experience + { + pos = {-0.251,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --2nd Player Physical Trauma + { + pos = {-0.441,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --2nd Player Mental Trauma + { + pos = {-0.171,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Experience + { + pos = {0.579,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --3rd Player Physical Trauma + { + pos = {0.389,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --3rd Player Mental Trauma + { + pos = {0.659,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Experience + { + pos = {1.407,0.1,-1.010}, + size = 800, + value = 0, + hideBG = true + }, + --4th Player Physical Trauma + { + pos = {1.217,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --4th Player Mental Trauma + { + pos = {1.487,0.1,-0.790}, + size = 600, + value = 0, + hideBG = true + }, + --Sacrifices to Nodens + { + pos = {0.890,0.1,1.150}, + size = 1000, + value = 0, + hideBG = true + }, + --End of counters + }, + --Add editable text boxes + textbox = { + --[[ + pos = the position (pasted from the helper tool) + rows = how many lines of text you want for this box + width = how wide the text box is + font_size = size of text. This and "rows" effect overall height + label = what is shown when there is no text. "" = nothing + value = text entered into box. "" = nothing + alignment = Number to indicate how you want text aligned + (1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified) + ]] + --1st Player Name + { + pos = {-1.265,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Investigator + { + pos = {-1.265,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --1st Player Story Assets/Weaknesses + { + pos = {-1.265,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Name + { + pos = {-0.436,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Investigator + { + pos = {-0.436,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --2nd Player Story Assets/Weaknesses + { + pos = {-0.436,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Name + { + pos = {0.394,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Investigator + { + pos = {0.394,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --3rd Player Story Assets/Weaknesses + { + pos = {0.394,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Name + { + pos = {1.222,0.1,-1.390}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Investigator + { + pos = {1.222,0.1,-1.195}, + rows = 1, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --4th Player Story Assets/Weaknesses + { + pos = {1.222,0.1,-0.420}, + rows = 7, + width = 3800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Campaign Notes + { + pos = {-0.930,0.1,0.620}, + rows = 12, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Evacuated Locations + { + pos = {0.820,0.1,0.500}, + rows = 10, + width = 7800, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --Killed and Insane Investigators + { + pos = {1.010,0.1,1.700}, + rows = 5, + width = 7400, + font_size = 300, + label = "Empty", + value = "", + alignment = 2 + }, + --End of textboxes + } +} + + + +--Lua beyond this point, I recommend doing something more fun with your life + + + +--Save function +local alreadySaving = false -- Copy this too! +function updateSave() + + function string.replaceText(text, old, new) + local b,e = text:find(old,1,true) + if b==nil then + return text + else + return text:sub(1,b-1) .. new .. text:sub(e+1) + end + end + + function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time + end + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + function startSaving() + while alreadySaving do + wait(0.01) + end + alreadySaving = true + local ref_buttonData = deepcopy(ref_buttonData) + local input_values = {} + local checkbox_values = {} + local counter_values = {} + + local GUID = self.getGUID() + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + input_values[counter] = val.value + val.value = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + if val.label != nil then + input_values[counter] = val.label + val.label = "u"..GUID..":iv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + checkbox_values[counter] = val.value + val.value = "u"..GUID..":bv:"..counter.."u" + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + counter_values[counter] = val.value + val.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + counter_values[counter] = val2.value + val2.value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + if val2.change_value != nil then + counter_values[counter] = val2.change_value + val2.change_value = "u"..GUID..":cv:"..counter.."u" + counter = counter + 1 + end + end + end + + end + end + + saved_data = JSON.encode(ref_buttonData) + + local counter = 1 + for _, val in ipairs(ref_buttonData.textbox) do + if val.value != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.value = input_values[counter] + counter = counter + 1 + end + if val.label != nil then + saved_data = saved_data:replaceText("u"..GUID..":iv:"..counter.."u", string.gsub(input_values[counter], "[\\\"']", "\\%1")) + val.label = input_values[counter] + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.checkbox) do + if val.value != nil then + val.value = checkbox_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":bv:"..counter.."u", string.gsub(checkbox_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + + local counter = 1 + for _, val in ipairs(ref_buttonData.counter) do + if val.value != nil then + val.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + + if val.counters != nil then + for _, val2 in ipairs(val.counters) do + if val2.value != nil then + val2.value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + if val2.change_value != nil then + val2.change_value = counter_values[counter] + saved_data = saved_data:replaceText("u"..GUID..":cv:"..counter.."u", string.gsub(counter_values[counter], "[\\\"']", "\\%1")) + counter = counter + 1 + end + end + end + + end + end + if disableSave==true then saved_data="" end + self.script_state = saved_data + + alreadySaving = false + return 1 + end + startLuaCoroutine(self, "startSaving") +end + +--Startup procedure +function onload(saved_data) + if disableSave==true then saved_data="" end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + ref_buttonData = loaded_data + else + ref_buttonData = defaultButtonData + end + + spawnedButtonCount = 0 + createCheckbox() + createCounter() + createTextbox() +end + + + +--Click functions for buttons + + + +--Checks or unchecks the given box +function click_checkbox(tableIndex, buttonIndex) + if ref_buttonData.checkbox[tableIndex].state == true then + ref_buttonData.checkbox[tableIndex].state = false + self.editButton({index=buttonIndex, label=""}) + else + ref_buttonData.checkbox[tableIndex].state = true + self.editButton({index=buttonIndex, label=string.char(10008)}) + end + updateSave() +end + +--Applies value to given counter display +function click_counter(tableIndex, buttonIndex, amount) + ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount + self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value}) + updateSave() +end + +--Updates saved value for given text box +function click_textbox(i, value, selected) + if selected == false then + ref_buttonData.textbox[i].value = value + updateSave() + end +end + +--Dud function for if you have a background on a counter +function click_none() end + + + +--Button creation + + + +--Makes checkboxes +function createCheckbox() + for i, data in ipairs(ref_buttonData.checkbox) do + --Sets up reference function + local buttonNumber = spawnedButtonCount + local funcName = "checkbox"..i + local func = function() click_checkbox(i, buttonNumber) end + self.setVar(funcName, func) + --Sets up label + local label = "" + if data.state==true then label=string.char(10008) end + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=data.pos, height=data.size, width=data.size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +--Makes counters +function createCounter() + for i, data in ipairs(ref_buttonData.counter) do + --Sets up display + local displayNumber = spawnedButtonCount + --Sets up label + local label = data.value + --Sets height/width for display + local size = data.size + if data.hideBG == true then size = 0 end + --Creates button and counts it + self.createButton({ + label=label, click_function="click_none", function_owner=self, + position=data.pos, height=size, width=size, + font_size=data.size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up add 1 + local funcName = "counterAdd"..i + local func = function() click_counter(i, displayNumber, 1) end + self.setVar(funcName, func) + --Sets up label + local label = "+" + --Sets up position + local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002) + local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]} + --Sets up size + local size = data.size / 2 + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + + --Sets up subtract 1 + local funcName = "counterSub"..i + local func = function() click_counter(i, displayNumber, -1) end + self.setVar(funcName, func) + --Sets up label + local label = "-" + --Set up position + local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]} + --Creates button and counts it + self.createButton({ + label=label, click_function=funcName, function_owner=self, + position=pos, height=size, width=size, + font_size=size, scale=buttonScale, + color=buttonColor, font_color=buttonFontColor + }) + spawnedButtonCount = spawnedButtonCount + 1 + end +end + +function createTextbox() + for i, data in ipairs(ref_buttonData.textbox) do + --Sets up reference function + local funcName = "textbox"..i + local func = function(_,_,val,sel) click_textbox(i,val,sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = data.label, + alignment = data.alignment, + position = data.pos, + scale = buttonScale, + width = data.width, + height = (data.font_size*data.rows)+24, + font_size = data.font_size, + color = buttonColor, + font_color = buttonFontColor, + value = data.value, + }) + end end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.ttslua index d4332d4c8..d08a19f8d 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 2 - objPos.z = objPos.z * globalScaleFactor * 0.9 - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + 2 + objPos.z = objPos.z * globalScaleFactor * 0.9 + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-0.6,0.1,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={0.6,0.3,-2.1}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={0.6,0.3,-2.5}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-0.6,0.3,-2.9}, rotation={0,0,0}, height=220, width=550, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.ttslua index cd3338fb2..60cac86c8 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag War of the Outer Gods fc7674/Custom_Tile War of the Outer Gods dcb241.ttslua @@ -1,25 +1,25 @@ -name = 'WotOG' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) -end - -function standaloneClick() - Global.call('fillContainer', {object=self, key=name, mode='standalone'}) +name = 'WotOG' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) +end + +function standaloneClick() + Global.call('fillContainer', {object=self, key=name, mode='standalone'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057.ttslua index 46067f58e..901ce543c 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, - font_size=130, color={0,0,0}, font_color={1,1,1} - }) --- self.createButton({ --- label="Setup", click_function="buttonClick_setup", function_owner=self, --- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, --- font_size=250, color={0,0,0}, font_color={1,1,1} --- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-0.6,0.1,2.1}, rotation={0,0,0}, height=220, width=500, + font_size=130, color={0,0,0}, font_color={1,1,1} + }) +-- self.createButton({ +-- label="Setup", click_function="buttonClick_setup", function_owner=self, +-- position={2,0.3,0}, rotation={0,90,0}, height=350, width=800, +-- font_size=250, color={0,0,0}, font_color={1,1,1} +-- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Frozen Tracks 11429d.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Frozen Tracks 11429d.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Frozen Tracks 11429d.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Frozen Tracks 11429d.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Stranded in the Urals 8077a1.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Stranded in the Urals 8077a1.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Stranded in the Urals 8077a1.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag Stranded in the Urals 8077a1.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag The Forgotten Village ddd10b.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag The Forgotten Village ddd10b.ttslua index 4acf9ea11..baa7b8b87 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag The Forgotten Village ddd10b.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Bag The Forgotten Village ddd10b.ttslua @@ -1,273 +1,273 @@ -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function onload(saved_data) - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects() - createSetupActionButtons() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects() - local howManyButtons = 0 - for _, obj in ipairs(getAllObjects()) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1.25 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj) end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color={0.75,0.25,0.25,0.6}, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons() - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj) - local color = {0,1,0,0.6} - if memoryList[obj.getGUID()] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - memoryList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - self.editButton({index=index, color=color}) - memoryList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) -end - ---Saves selections -function buttonClick_submit() - if next(memoryList) == nil then - broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) - else - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - end -end - ---Resets bag to starting status -function buttonClick_reset() - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local deltaPos = {} - local bounds = obj.getBounds() - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function onload(saved_data) + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects() + createSetupActionButtons() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects() + local howManyButtons = 0 + for _, obj in ipairs(getAllObjects()) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1.25 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj) end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=1000, width=1000, + color={0.75,0.25,0.25,0.6}, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons() + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=1100, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj) + local color = {0,1,0,0.6} + if memoryList[obj.getGUID()] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + memoryList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + self.editButton({index=index, color=color}) + memoryList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) +end + +--Saves selections +function buttonClick_submit() + if next(memoryList) == nil then + broadcastToAll("You cannot submit without any selections.", {0.75, 0.25, 0.25}) + else + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + end +end + +--Resets bag to starting status +function buttonClick_reset() + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={0,0.3,-2}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={0,0.3,-2.8}, rotation={0,180,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={-2,0.3,0}, rotation={0,270,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local deltaPos = {} + local bounds = obj.getBounds() + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + (bounds.size.y - bounds.offset.y) + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end diff --git a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Custom_Tile Winter Winds d54710.ttslua b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Custom_Tile Winter Winds d54710.ttslua index 600057539..65189ba86 100644 --- a/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Custom_Tile Winter Winds d54710.ttslua +++ b/unpacked/Custom_Model_Bag The Side Missions 2d16e1/Custom_Model_Bag Winter Winds 754057/Custom_Tile Winter Winds d54710.ttslua @@ -1,21 +1,21 @@ -name = 'Winter Winds' - -function onLoad() - Global.call('createSetupButtons', {object=self, key=name}) -end - -function easyClick() - Global.call('fillContainer', {object=self, key=name, mode='easy'}) -end - -function normalClick() - Global.call('fillContainer', {object=self, key=name, mode='normal'}) -end - -function hardClick() - Global.call('fillContainer', {object=self, key=name, mode='hard'}) -end - -function expertClick() - Global.call('fillContainer', {object=self, key=name, mode='expert'}) +name = 'Winter Winds' + +function onLoad() + Global.call('createSetupButtons', {object=self, key=name}) +end + +function easyClick() + Global.call('fillContainer', {object=self, key=name, mode='easy'}) +end + +function normalClick() + Global.call('fillContainer', {object=self, key=name, mode='normal'}) +end + +function hardClick() + Global.call('fillContainer', {object=self, key=name, mode='hard'}) +end + +function expertClick() + Global.call('fillContainer', {object=self, key=name, mode='expert'}) end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd.ttslua b/unpacked/Custom_Model_Bag Weakness decks 750fdd.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Weakness decks 750fdd.ttslua +++ b/unpacked/Custom_Model_Bag Weakness decks 750fdd.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4.ttslua b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4.ttslua index b25806e6f..f999547e7 100644 --- a/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4.ttslua +++ b/unpacked/Custom_Model_Bag Weakness decks 750fdd/Custom_Model_Bag Weakness decks 1ae6a4.ttslua @@ -1,503 +1,503 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=500, width=500, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, - font_size=250, color={0,0,0}, font_color={1,1,1} - }) ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult +-- Utility memory bag by Directsun +-- Version 2.5.2 +-- Fork of Memory Bag 2.0 by MrStump + +function updateSave() + local data_to_save = {["ml"]=memoryList} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function combineMemoryFromBagsWithin() + local bagObjList = self.getObjects() + for _, bagObj in ipairs(bagObjList) do + local data = bagObj.lua_script_state + if data ~= nil then + local j = JSON.decode(data) + if j ~= nil and j.ml ~= nil then + for guid, entry in pairs(j.ml) do + memoryList[guid] = entry + end + end + end + end +end + +function updateMemoryWithMoves() + memoryList = memoryListBackup + --get the first transposed object's coordinates + local obj = getObjectFromGUID(moveGuid) + + -- p1 is where needs to go, p2 is where it was + local refObjPos = memoryList[moveGuid].pos + local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) + local movedRotation = obj.getRotation() + for guid, entry in pairs(memoryList) do + memoryList[guid].pos.x = entry.pos.x - deltaPos.x + memoryList[guid].pos.y = entry.pos.y - deltaPos.y + memoryList[guid].pos.z = entry.pos.z - deltaPos.z + -- memoryList[guid].rot.x = movedRotation.x + -- memoryList[guid].rot.y = movedRotation.y + -- memoryList[guid].rot.z = movedRotation.z + end + + --theList[obj.getGUID()] = { + -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + -- lock=obj.getLock() + --} + moveList = {} +end + +function onload(saved_data) + fresh = true + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + --Set up information off of loaded_data + memoryList = loaded_data.ml + else + --Set up information for if there is no saved saved data + memoryList = {} + end + + moveList = {} + moveGuid = nil + + if next(memoryList) == nil then + createSetupButton() + else + fresh = false + createMemoryActionButtons() + end +end + + +--Beginning Setup + + +--Make setup button +function createSetupButton() + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + +--Triggered by Transpose button +function buttonClick_transpose() + moveGuid = nil + broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + moveList = {} + self.clearButtons() + createButtonsOnAllObjects(true) + createSetupActionButtons(true) +end + +--Triggered by setup button, +function buttonClick_setup() + memoryListBackup = duplicateTable(memoryList) + memoryList = {} + self.clearButtons() + createButtonsOnAllObjects(false) + createSetupActionButtons(false) +end + +function getAllObjectsInMemory() + local objTable = {} + local curObj = {} + + for guid in pairs(memoryListBackup) do + curObj = getObjectFromGUID(guid) + table.insert(objTable, curObj) + end + + return objTable + -- return getAllObjects() +end + +--Creates selection buttons on objects +function createButtonsOnAllObjects(move) + local howManyButtons = 0 + + local objsToHaveButtons = {} + if move == true then + objsToHaveButtons = getAllObjectsInMemory() + else + objsToHaveButtons = getAllObjects() + end + + for _, obj in ipairs(objsToHaveButtons) do + if obj ~= self then + local dummyIndex = howManyButtons + --On a normal bag, the button positions aren't the same size as the bag. + globalScaleFactor = 1 * 1/self.getScale().x + --Super sweet math to set button positions + local selfPos = self.getPosition() + local objPos = obj.getPosition() + local deltaPos = findOffsetDistance(selfPos, objPos, obj) + local objPos = rotateLocalCoordinates(deltaPos, self) + objPos.x = -objPos.x * globalScaleFactor + objPos.y = objPos.y * globalScaleFactor + objPos.z = objPos.z * globalScaleFactor + --Offset rotation of bag + local rot = self.getRotation() + rot.y = -rot.y + 180 + --Create function + local funcName = "selectButton_" .. howManyButtons + local func = function() buttonClick_selection(dummyIndex, obj, move) end + local color = {0.75,0.25,0.25,0.6} + local colorMove = {0,0,1,0.6} + if move == true then + color = colorMove + end + self.setVar(funcName, func) + self.createButton({ + click_function=funcName, function_owner=self, + position=objPos, rotation=rot, height=500, width=500, + color=color, + }) + howManyButtons = howManyButtons + 1 + end + end +end + +--Creates submit and cancel buttons +function createSetupActionButtons(move) + self.createButton({ + label="Cancel", click_function="buttonClick_cancel", function_owner=self, + position={-1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + self.createButton({ + label="Submit", click_function="buttonClick_submit", function_owner=self, + position={-1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + + if move == false then + self.createButton({ + label="Add", click_function="buttonClick_add", function_owner=self, + position={1,0.1,-2.1}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.25,1,0.25} + }) + + if fresh == false then + self.createButton({ + label="Set New", click_function="buttonClick_setNew", function_owner=self, + position={1,0.1,-3.7}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={0.75,0.75,1} + }) + self.createButton({ + label="Remove", click_function="buttonClick_remove", function_owner=self, + position={1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,0.25,0.25} + }) + end + end + + self.createButton({ + label="Reset", click_function="buttonClick_reset", function_owner=self, + position={-1,0.1,-2.9}, rotation={0,0,0}, height=350, width=900, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +end + + +--During Setup + + +--Checks or unchecks buttons +function buttonClick_selection(index, obj, move) + local colorMove = {0,0,1,0.6} + local color = {0,1,0,0.6} + + previousGuid = selectedGuid + selectedGuid = obj.getGUID() + + theList = memoryList + if move == true then + theList = moveList + if previousGuid ~= nil and previousGuid ~= selectedGuid then + local prevObj = getObjectFromGUID(previousGuid) + prevObj.highlightOff() + self.editButton({index=previousIndex, color=colorMove}) + theList[previousGuid] = nil + end + previousIndex = index + end + + if theList[selectedGuid] == nil then + self.editButton({index=index, color=color}) + --Adding pos/rot to memory table + local pos, rot = obj.getPosition(), obj.getRotation() + --I need to add it like this or it won't save due to indexing issue + theList[obj.getGUID()] = { + pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, + rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, + lock=obj.getLock() + } + obj.highlightOn({0,1,0}) + else + color = {0.75,0.25,0.25,0.6} + if move == true then + color = colorMove + end + self.editButton({index=index, color=color}) + theList[obj.getGUID()] = nil + obj.highlightOff() + end +end + +--Cancels selection process +function buttonClick_cancel() + memoryList = memoryListBackup + moveList = {} + self.clearButtons() + if next(memoryList) == nil then + createSetupButton() + else + createMemoryActionButtons() + end + removeAllHighlights() + broadcastToAll("Selection Canceled", {1,1,1}) + moveGuid = nil +end + +--Saves selections +function buttonClick_submit() + fresh = false + if next(moveList) ~= nil then + for guid in pairs(moveList) do + moveGuid = guid + end + if memoryListBackup[moveGuid] == nil then + broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) + else + broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(moveList) do + moveGuid = guid + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + updateMemoryWithMoves() + updateSave() + buttonClick_place() + end + elseif next(memoryList) == nil and moveGuid == nil then + memoryList = memoryListBackup + broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) + end + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() + moveGuid = nil +end + +function combineTables(first_table, second_table) + for k,v in pairs(second_table) do first_table[k] = v end +end + +function buttonClick_add() + fresh = false + combineTables(memoryList, memoryListBackup) + broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) + combineMemoryFromBagsWithin() + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + updateSave() +end + +function buttonClick_remove() + broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for guid in pairs(memoryList) do + count = count + 1 + memoryListBackup[guid] = nil + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.highlightOff() end + end + broadcastToAll(count.." Objects Removed", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +function buttonClick_setNew() + broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) + self.clearButtons() + createMemoryActionButtons() + local count = 0 + for _, obj in ipairs(getAllObjects()) do + guid = obj.guid + if memoryListBackup[guid] ~= nil then + count = count + 1 + memoryListBackup[guid].pos = obj.getPosition() + memoryListBackup[guid].rot = obj.getRotation() + memoryListBackup[guid].lock = obj.getLock() + end + end + broadcastToAll(count.." Objects Saved", {1,1,1}) + memoryList = memoryListBackup + updateSave() +end + +--Resets bag to starting status +function buttonClick_reset() + fresh = true + memoryList = {} + self.clearButtons() + createSetupButton() + removeAllHighlights() + broadcastToAll("Tool Reset", {1,1,1}) + updateSave() +end + + +--After Setup + + +--Creates recall and place buttons +function createMemoryActionButtons() + self.createButton({ + label="Place", click_function="buttonClick_place", function_owner=self, + position={1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Recall", click_function="buttonClick_recall", function_owner=self, + position={-1,0.1,2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) + self.createButton({ + label="Setup", click_function="buttonClick_setup", function_owner=self, + position={0,0.1,-2.1}, rotation={0,0,0}, height=350, width=800, + font_size=250, color={0,0,0}, font_color={1,1,1} + }) +--- self.createButton({ +--- label="Move", click_function="buttonClick_transpose", function_owner=self, +--- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, +--- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} +--- }) +end + +--Sends objects from bag/table to their saved position/rotation +function buttonClick_place() + local bagObjList = self.getObjects() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + --If obj is out on the table, move it to the saved pos/rot + if obj ~= nil then + obj.setPositionSmooth(entry.pos) + obj.setRotationSmooth(entry.rot) + obj.setLock(entry.lock) + else + --If obj is inside of the bag + for _, bagObj in ipairs(bagObjList) do + if bagObj.guid == guid then + local item = self.takeObject({ + guid=guid, position=entry.pos, rotation=entry.rot, smooth=false + }) + item.setLock(entry.lock) + break + end + end + end + end + broadcastToAll("Objects Placed", {1,1,1}) +end + +--Recalls objects to bag from table +function buttonClick_recall() + for guid, entry in pairs(memoryList) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then self.putObject(obj) end + end + broadcastToAll("Objects Recalled", {1,1,1}) +end + + +--Utility functions + + +--Find delta (difference) between 2 x/y/z coordinates +function findOffsetDistance(p1, p2, obj) + local yOffset = 0 + if obj ~= nil then + local bounds = obj.getBounds() + yOffset = (bounds.size.y - bounds.offset.y) + end + local deltaPos = {} + deltaPos.x = (p2.x-p1.x) + deltaPos.y = (p2.y-p1.y) + yOffset + deltaPos.z = (p2.z-p1.z) + return deltaPos +end + +--Used to rotate a set of coordinates by an angle +function rotateLocalCoordinates(desiredPos, obj) + local objPos, objRot = obj.getPosition(), obj.getRotation() + local angle = math.rad(objRot.y) + local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) + local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) + --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} + return {x=x, y=desiredPos.y, z=z} +end + +function rotateMyCoordinates(desiredPos, obj) + local angle = math.rad(obj.getRotation().y) + local x = desiredPos.x * math.sin(angle) + local z = desiredPos.z * math.cos(angle) + return {x=x, y=desiredPos.y, z=z} +end + +--Coroutine delay, in seconds +function wait(time) + local start = os.time() + repeat coroutine.yield(0) until os.time() > start + time +end + +--Duplicates a table (needed to prevent it making reference to the same objects) +function duplicateTable(oldTable) + local newTable = {} + for k, v in pairs(oldTable) do + newTable[k] = v + end + return newTable +end + +--Moves scripted highlight from all objects +function removeAllHighlights() + for _, obj in ipairs(getAllObjects()) do + obj.highlightOff() + end +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult end \ No newline at end of file diff --git a/unpacked/Custom_Tile Data Helper 708279.ttslua b/unpacked/Custom_Tile Data Helper 708279.ttslua index e13bad86e..7c82d9f63 100644 --- a/unpacked/Custom_Tile Data Helper 708279.ttslua +++ b/unpacked/Custom_Tile Data Helper 708279.ttslua @@ -1,1822 +1,1822 @@ --- set true to enable debug logging -DEBUG = false - -function log(message) - if DEBUG then - print(message) - end -end - ---[[ -Known locations and clues. We check this to determine if we should -atttempt to spawn clues, first we look for _ and if -we find nothing we look for -format is [location_guid -> clueCount] -]] -LOCATIONS_DATA_JSON = [[ -{ - "Study": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Study_670914": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Attic_377b20": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Attic": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Cellar_5d3bcc": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Cellar": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Bathroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Bedroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Far Above Your House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Deep Below Your House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Northside_86faac": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Northside": {"type" : "perPlayer", "value": 2, "clueSide": "back"}, - "Graveyard": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Miskatonic University_cedb0a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Miskatonic University": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Downtown_1aa7cb": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Downtown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "St. Mary's Hospital": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Easttown_88245c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Easttown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Southside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Rivertown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Your House_377b20": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Your House_b28633": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Ritual Site": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Arkham Woods_e8e04b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Arkham Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "New Orleans_5ab18a": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "New Orleans": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Riverside_ab9d69": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Riverside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Wilderness_3c5ea8": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Wilderness": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unhallowed Land_552a1d": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Unhallowed Land": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Flooded Square": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Streets of Venice": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Rialto Bridge": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Venetian Garden": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Guardian": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Canal-side": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Accademia Bridge": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Bridge of Sighs": {"type": "fixed", "value": 2, "clueSide": "back"}, - - "Warren Observatory": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Science Building": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Orne Library": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Administration Building": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Student Union": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Humanities Building": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Dormitories": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - "Faculty Offices": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Faculty Offices_1c567d": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - - "La Bella Luna": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Back Hall Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Museum Entrance": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Security Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Security Office_fcb3e4": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Administration Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Administration Office_d2eb25": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Exhibit Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Exhibit Hall_563240": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Exhibit Hall_f3ffb6": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Exhibit Hall_0b0c58": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Exhibit Hall_2d87e6": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Exhibit Hall_da02ea": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - - "Train Car": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Train Car_f3f902": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Train Car_905f69": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Train Car_a3a321": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Train Car_464528": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Train Car_3cfca4": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Train Car_64ffb0": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Train Car_0fb5f0": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - "Engine Car": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "House in the Reeds": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Osborn's General Store": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Congregational Church": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Bishop's Brook": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Burned Ruins": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Schoolhouse": {"type": "fixed", "value": 1, "clueSide": "back"}, - - "Dunwich Village": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Dunwich Village_ac4427": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Cold Spring Glen": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Cold Spring Glen_e58475": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Ten-Acre Meadow": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Ten-Acre Meadow_05b0dd": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Blasted Heath": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Blasted Heath_995fe7": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Whateley Ruins": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Devil's Hop Yard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Devil's Hop Yard_f7dd31": {"type": "fixed", "value": 2, "clueSide": "back"}, - - "Base of the Hill": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Base of the Hill_80236e": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Ascending Path": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Ascending Path_d3ae26": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Sentinel Peak": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Diverging Path": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Diverging Path_7239aa": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Altered Path": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "The Edge of the Universe": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Tear Through Time": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Prismatic Cascade": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Towering Luminosity": {"type": "fixed", "value": 4, "clueSide": "front"}, - "Tear Through Space": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Endless Bridge": {"type": "fixed", "value": 2, "clueSide": "front"}, - "Dimensional Doorway": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Steps of Y'hagharl": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Unstable Vortex": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Indecipherable Stairs": {"type": "fixed", "value": 1, "clueSide": "front"}, - - "Backstage Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Backstage Doorway_0797a9": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Lobby Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Lobby Doorway_7605cf": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Lobby": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Backstage": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Foyer": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Historical Society": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Historical Society_40f79d": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Historical Society_b352f8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Historical Society_0cf5d5": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Historical Society_abc0cb": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Historical Society_ab6a72": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Hidden Library": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - - "Patient Confinement": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Asylum Halls": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Asylum Halls_f99530": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Asylum Halls_576595": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Infirmary": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Basement Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Yard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Garden": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Kitchen": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Mess Hall": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Grand Guignol": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Montmartre": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Montmartre_cbaacc": {"type": "perPlayer", "value": 0, "clueSide": "front"}, - "Montparnasse": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Notre-Dame": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Gare d'Orsay": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Opéra Garnier": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Canal Saint-Martin": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Le Marais": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Gardens of Luxembourg": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Père Lachaise Cemetery": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Catacombs": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Catacombs_29170f": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_f1237c": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_c3151e": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_14b1cb": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_81920c": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_c14c8b": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Catacombs_ea2a55": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Catacombs_8bcab3": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Catacombs_7c7f4a": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Catacombs_80cf41": {"type": "fixed", "value": 0, "clueSide": "back"}, - - "Abbey Church": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Porte de l'Avancée": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Grand Rue": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Cloister": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Knight's Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Chœur Gothique": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Outer Wall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Outer Wall_014bd6": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "North Tower": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "North Tower_69eae5": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Chapel of St. Aubert": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - "Chapel of St. Aubert_e75ba8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Abbey Tower": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - "Abbey Tower_2f3d21": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Shores of Hali": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Dark Spires": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Palace of the King": {"type": "perPlayer", "value": 3, "clueSide": "front"}, - "Palace of the King_60d758": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Ruins of Carcosa": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Dim Streets": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Depths of Demhe": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Bleak Plains": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Recesses of Your Own Mind": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "The Throne Room": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Stage of the Ward Theatre": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Serpent’s Haven": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ruins of Eztli": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Rope Bridge": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Overgrown Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "River Canyon": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Path of Thorns": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Temple of the Fang": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Circuitous Trail": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Riverside Temple": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Waterfall": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Trail of the Dead": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Cloud Forest": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Chamber of Time": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ancient Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ancient Hall_b9acb8": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Grand Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Entryway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Underground Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Burial Pit": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Secret Passage": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Snake Pit": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Throne Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Mosaic Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Tomb of the Ancients": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Town Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Curiositie Shoppe": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "At the Station": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "At the Station_e0833c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Missing Persons": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Relic is Missing!": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Trial of the Huntress": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Search for the Meaning": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Seeking Trouble": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Seeking Trouble_42f93b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - - "Sacred Woods": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Chapultepec Hill": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Chapultepec Hill_baec21": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Canals of Tenochtitlán": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Lake Xochimilco": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Lake Xochimilco_59bf7d": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Templo Mayor": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Templo Mayor_fb0083": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Temples of Tenochtitlán": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Temples of Tenochtitlán_80cef8": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Mouth of K'n-yan_38a3e5": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Stone Altar": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Time-Wracked Woods": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Vast Passages": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Perilous Gulch": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Dark Hollow": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Hall of Idolatry": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Crystal Pillars": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Ruins of K’n-yan": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Chthonian Depths": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Subterranean Swamp": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Treacherous Descent": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Interview Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Interview Room_b1861c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Halls of Pnakotus": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Deconstruction Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Towers of Pnakotus": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Laboratory of the Great Race": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Yithian Orrery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Great Library": {"type": "fixed", "value": 4, "clueSide": "back"}, - "Cyclopean Vaults": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Alien Conservatory": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "City of the Serpents": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Bridge over N'kai": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Abandoned Site": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Caverns of Yoth": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Hall of Heresy": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Bright Canyon": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Forked Path": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - - "Nexus of N'kai": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "A Pocket in Time": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "City of the Unseen": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Valusia": {"type": "fixed", "value": 2, "clueSide": "front"}, - "Great Hall of Celeano": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Buenos Aires": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Ultima Thule": {"type": "fixed", "value": 2, "clueSide": "front"}, - - "Shores of R’lyeh": {"type": "fixed", "value": 2, "clueSide": "front"}, - "Atlantis": {"type": "fixed", "value": 2, "clueSide": "front"}, - "Pnakotus": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Ruins of New York": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Yuggoth": {"type": "fixed", "value": 3, "clueSide": "front"}, - "Mu": {"type": "fixed", "value": 4, "clueSide": "front"}, - "Plateau of Leng_0ab6ff": {"type": "fixed", "value": 1, "clueSide": "front"}, - - "Billiards Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Billiards Room_33990b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Trophy Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Trophy Room_e9160a": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Master Bedroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Balcony_1b5483": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Office_a1bd9a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Witch-Haunted Woods_1539ea": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Witch-Haunted Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Witch-Haunted Woods_d3f8c3": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Witch-Haunted Woods_eca18e": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Paths into Twilight": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - - "The Imperial Entrance": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Dark Stairwell": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Stairway": {"type": "fixed", "value": 1, "clueSide": "back"}, - "The Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Back Booths": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Lobby": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Backroom Door": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Backroom Door_ed439d": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Dining Area": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Dance Floor": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Gateway to the East": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Back Alley": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Mingzhu Laundry": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Dragon's Den": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "The Phoenix's Nest": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Golden Temple of the Heavens": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Flea Market": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Zihao's House of Fighting Arts": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Daiyu's Tea Garden": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Moldy Halls": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Decrepit Door": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Walter Gilman's Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unknown Places_b538f8": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Unknown Places_7bea34": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Unknown Places": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Unknown Places_9a471d": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unknown Places_0ac3ea": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Strange Geometry": {"type": "fixed", "value": 1, "clueSide": "front"}, - "Site of the Sacrifice": {"type": "perPlayer", "value": 3, "clueSide": "back"}, - - "Hangman's Brook": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Abandoned Chapel": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Haunted Fields": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Lobby_1c2dfe": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Lobby_bcd556": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Lodge Gates_fa6a29": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Lodge Gates": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Lodge Cellar": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Lodge Cellar_8ea4fd": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Lounge": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Vault": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Inner Sanctum": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Library": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Library_47ccbc": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Sanctum Doorway": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Sanctum Doorway_4da6c3": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "The Geist-Trap": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Forbidding Shore": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unvisited Isle": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Rivertown_92ee68": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Rivertown_db4b20": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Southside_c898a0": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Southside_e7f5fa": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Silver Twilight Lodge": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Silver Twilight Lodge_17e686": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Hangman's Hill": {"type": "fixed", "value": 0, "clueSide": "back"}, - "Hangman's Hill_5f4d8a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Cosmic Ingress": {"type": "fixed", "value": 3, "clueSide": "back"}, - "Cosmos": {"type": "fixed", "value": 1, "clueSide": "back"}, - "Cosmos_a89dbf": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Cosmos_1a0ad2": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Cosmos_30fc53": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Cosmos_8f3e16": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Cosmos_4e8ae3": {"type": "fixed", "value": 2, "clueSide": "back"}, - "Cosmos_a8d84d": {"type": "fixed", "value": 4, "clueSide": "back"}, - "Cosmos_7a3ece": {"type": "fixed", "value": 6, "clueSide": "back"}, - "Cosmos_311eb1": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Seventy Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Seven Hundred Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Base of the Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Enchanted Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Stairwell": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Basement Door_42fa87": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Basement Door": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Waiting Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Emergency Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Experimental Therapies Ward": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Records Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Foyer_9a9f9a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Room 245": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Hotel Roof": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Office_b3ed47": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Room 212": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Basement": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Second Floor Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Room 225": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Restaurant": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Suite Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Ulthar": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Dylath-Leen": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Mt. Ngranek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Baharna": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Zulan-Thek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Sarnath": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "City-Which-Appears-On-No-Map": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Celephaïs": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Nameless Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Kadatheron": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Ilek-Vad": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Ruins of Ib": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Temple of Unattainable Desires": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Hazuth-Kleg": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Serannian": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Mysterious Stairs": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Mysterious Stairs_df1a40": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Attic_10faf9": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unmarked Tomb": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Upstairs Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Front Porch": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Downstairs Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Downstairs Doorway_c93906": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Burial Ground": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Temple of the Moon Lizard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "City of the Moon-Beasts": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Moon-Forest": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Dark Crater": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Caverns Beneath the Moon": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Black Core": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Light Side of the Moon": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "City of Gugs": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Vaults of Zin": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Plain of the Ghouls": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Sea of Bones": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Vale of Pnath": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Crag of the Ghouls": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Sea of Pitch": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Plateau of Leng": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Cold Wastes": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Monastery of Leng": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Onyx Gates": {"type": "fixed", "value": 12, "clueSide": "back"}, - "Forsaken Tower": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "The Crater": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Quarantine Zone": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Quarantine Zone_5f2a9b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Quarantine Zone_4a8e9c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Quarantine Zone_5193e9": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Quarantine Zone_b3a920": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "The Great Web": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Great Web_39ace3": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Great Web_727790": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Great Web_5c5ec4": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Great Web_361fd7": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "The Great Web_dfdc8c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Expedition Camp": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Desert Oasis": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Untouched Vault": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Sands of Dashur": {"type": "perPlayer", "value": 0, "clueSide": "front"}, - "Sandswept Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Nile River": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Faceless Sphinx": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Dunes of the Sahara": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Streets of Cairo": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Cairo Bazaar": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Temple Courtyard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Museum of Egyptian Antiquities": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Outskirts of Cairo": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Eldritch Gate": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Mist-Filled Caverns": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Stairway to Sarkomand": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Tunnels under Ngranek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "The Great Abyss": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "A Dream Betwixt": {"type": "perPlayer", "value": 0, "clueSide": "front"}, - - "Velma's Doghouse": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Barkham City Pound": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Barkham Asylum": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Beasttown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Tailside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Slobbertown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Snoutside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Muttskatonic University": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Boneyard": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "St. Mary's Animal Hospital": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Arkham": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Streets of New York City": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Penthouse": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Burning Pit": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Streets of Providence": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Athenaeum of the Empty Sky": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Arcade": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Streets of Montréal": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Chateau Ramezay": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Shrine of Magh’an Ark’at": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "Unfamiliar Chamber": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Tidal Tunnel": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Tidal Tunnel_0f20fc": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Tidal Tunnel_d5566b": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Tidal Tunnel_dc9eb7": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - "Tidal Tunnel_513d82": {"type": "perPlayer", "value": 0, "clueSide": "back"}, - - "First National Grocery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Marsh Refinery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Innsmouth Square": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Innsmouth Harbour": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Fish Street Bridge_b6b9b7": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Gilman House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Little Bookshop": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - - "Innsmouth Jail_f63738": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "New Church Green_d1ef9c": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Sawbone Alley_899c2c": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "The House on Water Street_e4f53a": {"type": "perPlayer", "value": 2, "clueSide": "front"}, - "Shoreward Slums_24e42d": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - "Esoteric Order of Dagon_28c301": {"type": "perPlayer", "value": 1, "clueSide": "front"}, - - "Esoteric Order of Dagon_ef8cef": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "New Church Green_921a9b": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Marsh Refinery_44c342": {"type": "fixed", "value": 1, "clueSide": "back"}, - "The House on Water Street_104e07": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "The Little Bookshop_a17a82": {"type": "fixed", "value": 1, "clueSide": "back"}, - "First National Grocery_9ae75c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Fish Street Bridge_a358fc": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Innsmouth Harbour_30b2c0": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Sawbone Alley_e58cff": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Gilman House_e589b8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Innsmouth Jail_755fc0": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Shoreward Slums_c0d0df": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Desolate Coastline": {"type": "fixed", "value": 1, "clueSide": "back"}, - - "Unfathomable Depths_cb5e3e": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Unfathomable Depths_7d180e": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unfathomable Depths_fdf43f": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Unfathomable Depths_431ca2": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - "Unfathomable Depths_dfc9b4": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "Unfathomable Depths_086743": {"type": "perPlayer", "value": 1, "clueSide": "back"}, - - "XXXX": {"type": "perPlayer", "value": 2, "clueSide": "back"}, - "xxx": {"type": "perPlayer", "value": 2, "clueSide": "back"} -} -]] ---[[ -Player cards with token counts and types -]] -PLAYER_CARD_DATA_JSON = [[ -{ - "Flashlight": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Shrivelling": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Shrivelling (3)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Grotesque Statue (4)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Forbidden Knowledge": { - "tokenType": "resource", - "tokenCount": 4 - }, - ".45 Automatic": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Shotgun (4)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Liquid Courage": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Song of the Dead (2)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Cover Up": { - "tokenType": "clue", - "tokenCount": 3 - }, - "Roland's .38 Special": { - "tokenType": "resource", - "tokenCount": 4 - }, - "First Aid": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scrying": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".41 Derringer": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Painkillers": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Smoking Pipe": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Clarity of Mind": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Rite of Seeking": { - "tokenType": "resource", - "tokenCount": 3 - }, - "M1918 BAR (4)": { - "tokenType": "resource", - "tokenCount": 8 - }, - "Ornate Bow (3)": { - "tokenType": "resource", - "tokenCount": 1 - }, - ".41 Derringer (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Suggestion (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Chicago Typewriter (4)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Lupara (3)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "First Aid (3)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Springfield M1903 (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Springfield M1903 (4) (Taboo)": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".32 Colt": { - "tokenType": "resource", - "tokenCount": 6 - }, - "Venturer": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Lockpicks (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Finn's Trusty .38": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".45 Automatic (2)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Lightning Gun (5)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Strange Solution (4)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Strange Solution (4):Acidic Ichor": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Strange Solution (4):Empowering Elixir": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Arcane Insight (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Archaic Glyphs (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "In the Know (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Rite of Seeking (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Alchemical Transmutation": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scrying (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Shrivelling (5)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Mists of R'lyeh": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Mists of R'lyeh (4)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Colt Vest Pocket": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Old Hunting Rifle (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Thermos": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Feed the Mind (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Seal of the Seventh Sign (5)": { - "tokenType": "resource", - "tokenCount": 7 - }, - "Flamethrower (5)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Flamethrower (5) (Taboo)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Pnakotic Manuscripts (5)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Kerosene (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Shards of the Void (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Try and Try Again (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Arcane Initiate": { - "tokenType": "doom", - "tokenCount": 1 - }, - "Detective's Colt 1911s": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Extra Ammunition (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Rite of Seeking (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Arcane Initiate (3)": { - "tokenType": "doom", - "tokenCount": 1 - }, - "Clarity of Mind (3)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Fingerprint Kit": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Truth from Fiction": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Enchanted Blade": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Tennessee Sour Mash": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Scroll of Secrets": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scroll of Secrets (Taboo)": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".45 Thompson": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Mr. \"Rook\"": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Mr. \"Rook\" (Taboo)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scroll of Secrets (3):Seeker": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scroll of Secrets (3) (Taboo):Seeker": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Scroll of Secrets (3):Mystic": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Scroll of Secrets (3) (Taboo):Mystic": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Enchanted Blade (3):Guardian": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Enchanted Blade (3):Mystic": { - "tokenType": "resource", - "tokenCount": 4 - }, - ".45 Thompson (3)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Esoteric Atlas (1)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Tennessee Sour Mash (3):Rogue": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Tennessee Sour Mash (3):Survivor": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Mk 1 Grenades (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Dayana Esperence (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Pendant of the Queen": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".32 Colt (2)": { - "tokenType": "resource", - "tokenCount": 6 - }, - "Alchemical Transmutation (2)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Suggestion (1)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Gate Box": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Tony's .38 Long Colt": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Gregory Gry": { - "tokenType": "resource", - "tokenCount": 9 - }, - "Scroll of Prophecies": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Healing Words": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Otherworld Codex (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".35 Winchester": { - "tokenType": "resource", - "tokenCount": 5 - }, - ".35 Winchester (Taboo)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Old Book of Lore (3)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Sawed-Off Shotgun (5)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Mind's Eye (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Colt Vest Pocket (2)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Mists of R'lyeh (2)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "The Chthonian Stone (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Flesh Ward": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Physical Training (4)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Encyclopedia": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Feed the Mind": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Forbidden Tome": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Esoteric Atlas (2)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "The Necronomicon (5)": { - "tokenType": "resource", - "tokenCount": 6 - }, - "The Necronomicon (5) (Taboo)": { - "tokenType": "resource", - "tokenCount": 6 - }, - "Mauser C96": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Liquid Courage (1)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Mauser C96 (2)": { - "tokenType": "resource", - "tokenCount": 5 - }, - "Beretta M1918 (4)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Scrying Mirror": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Azure Flame": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Clairvoyance": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Ineffable Truth": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Grotesque Statue (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Azure Flame (3)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Clairvoyance (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Ineffable Truth (3)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Arcane Studies (4)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Azure Flame (5)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Clairvoyance (5)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Ineffable Truth (5)": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".18 Derringer": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Grimm's Fairy Tales": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Old Keyring": { - "tokenType": "resource", - "tokenCount": 2 - }, - ".18 Derringer (2)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Chainsaw (4)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Becky": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Book of Psalms": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Cryptographic Cipher": { - "tokenType": "resource", - "tokenCount": 3 - }, - ".25 Automatic": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Obfuscation": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Eldritch Sophist": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Armageddon": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Eye of Chaos": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Shroud of Shadows": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Tool Belt (0)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Tool Belt (3)": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Gabriel": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Fingerprint Kit (5)": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Old Keyring (5)": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Flux Stabilizer": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Cultes des Goules": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Dragon Idol": { - "tokenType": "resource", - "tokenCount": 2 - }, - "Elixir of Life": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Fetch Stick": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Heart of Winter": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Massa di Requiem per Shuggay": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Mi-Go Brain Case": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Milk of Shub-Niggurath": { - "tokenType": "resource", - "tokenCount": 1 - }, - "Ruby of R'yleh": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Sword of Saint Jerome": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Sword of Y'ha-Talla": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Vach-Viraj Chant": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Zanthu Tablets": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Lamp of Alhazred": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Soul Gem": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Book of the Believer": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Mask of Wisdom": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Key of Tawil At-Umr": { - "tokenType": "resource", - "tokenCount": 3 - }, - "Warding Statue": { - "tokenType": "resource", - "tokenCount": 4 - }, - "Yithian Rifle": { - "tokenType": "resource", - "tokenCount": 3 - }, - "xxx": { - "tokenType": "resource", - "tokenCount": 3 - } -} -]] -LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) -PLAYER_CARD_DATA = JSON.decode(PLAYER_CARD_DATA_JSON) - -PLAYER_CARD_TOKEN_OFFSETS = { - [1] = { - { 0, 3, -0.2 }, - }, - [2] = { - { 0.4, 3, -0.2 }, - { -0.4, 3, -0.2 }, - }, - [3] = { - { 0, 3, -0.9 }, - { 0.4, 3, -0.2 }, - { -0.4, 3, -0.2 }, - }, - [4] = { - { 0.4, 3, -0.9 }, - { -0.4, 3, -0.9 }, - { 0.4, 3, -0.2 }, - { -0.4, 3, -0.2 } - }, - [5] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.4, 3, -0.2 }, - { -0.4, 3, -0.2 } - }, - [6] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.7, 3, -0.2 }, - { 0, 3, -0.2 }, - { -0.7, 3, -0.2 }, - }, - [7] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.7, 3, -0.2 }, - { 0, 3, -0.2 }, - { -0.7, 3, -0.2 }, - { 0, 3, 0.5 }, - }, - [8] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.7, 3, -0.2 }, - { 0, 3, -0.2 }, - { -0.7, 3, -0.2 }, - { -0.35, 3, 0.5 }, - { 0.35, 3, 0.5 }, - }, - [9] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.7, 3, -0.2 }, - { 0, 3, -0.2 }, - { -0.7, 3, -0.2 }, - { 0.7, 3, 0.5 }, - { 0, 3, 0.5 }, - { -0.7, 3, 0.5 }, - }, - [12] = { - { 0.7, 3, -0.9 }, - { 0, 3, -0.9 }, - { -0.7, 3, -0.9 }, - { 0.7, 3, -0.2 }, - { 0, 3, -0.2 }, - { -0.7, 3, -0.2 }, - { 0.7, 3, 0.5 }, - { 0, 3, 0.5 }, - { -0.7, 3, 0.5 }, - { 0.7, 3, 1.2 }, - { 0, 3, 1.2 }, - { -0.7, 3, 1.2 }, - } - -} - -modeData = { - ['Core Set'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['The Devourer Below'] = { - easy = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, - normal = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, - hard = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, - expert = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' } - }, - -----------------The Dunwich Legacy - - ['The Dunwich Legacy'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'red', 'blue' } } - }, - ['The Miskatonic Museum'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Essex County Express'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Blood on the Altar'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Undimensioned and Unseen'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Where Doom Awaits'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Lost in Time and Space'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - -----------------The Path to Carcosa - - ['The Path to Carcosa'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'skull', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'red', 'blue' } } - }, - ['The Last King'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['Echoes of the Past'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['The Unspeakable Oath'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['A Phantom of Truth'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['The Pallid Mask'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['Black Stars Rise'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } - }, - ['Dim Carcosa'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' } } - }, - -----------------The Forgotten Age - - ['The Forgotten Age'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } - }, - ['The Doom of Eztli'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Threads of Fate'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Boundary Beyond'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The City of Archives'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Depths of Yoth'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Heart of the Elders'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Shattered Aeons'] = { - standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } } - }, - - -----------------The Circle Undone - - ['The Circle Undone'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm6', 'm8', 'skull', 'skull', 'red', 'blue' } } - }, - ["At Death's Doorstep"] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Secret Name'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Wages of Sin'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['For the Greater Good'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Union and Disillusion'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['In the Clutches of Chaos'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Before the Black Throne'] = { - standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - - - -----------------The Dream-Eaters - - ['TDE_A'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['TDE_B'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } - }, - ['The Search For Kadath'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['A Thousand Shapes of Horror'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } - }, - ['Dark Side of the Moon'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['Point of No Return'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } - }, - ['Where the Gods Dwell'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['Weaver of the Cosmos'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } - }, - - - -----------------The Innsmouth Conspiracy - ['The Innsmouth Conspiracy'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } , - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } - }, - ['The Vanishing of Elina Harper'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } - }, - ['In Too Deep'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } - }, - ['Devil Reef'] = { - standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } - }, - - -----------------The Side Missions - --official - ['Curse of the Rougarou'] = { - normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Carnevale of Horrors'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Labyrinths of Lunacy'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'red', 'blue' } }, - hard = { token = { 'p1', '0','m1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'red', 'blue' } } - }, - ['Guardians of the Abyss'] = { - normal = { token = { 'p1', 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Excelsior'] = { - normal = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Read or Die'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['All or Nothing'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - - ['Meowlathotep'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - - ['WotOG'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'skull', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'skull', 'red', 'blue' } } - }, - - ['Bad Blood'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - - --fan-made - ['Carnevale of Spiders'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - - ['The Nephew Calls'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Outsider'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Stranger Things'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Winter Winds'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'skull', 'cultist', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'cultist', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'cultist', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'cultist', 'red', 'blue' } } - }, - ['The Festival'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Forbidding Desert'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['Happys Funhouse'] = { - normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm5', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Knightfall'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'cultist', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Last Call at Roxies'] = { - easy = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } - }, - ['The Limens of Belief'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } - }, - ['Blood Spilled in Salem'] = { - normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Bread and Circuses'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['Bridge of Sighs'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['The Collector'] = { - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['The Colour out of Space'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Curse of Amultep'] = { - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['The Dying Star'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'blue', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'blue', 'red', 'blue' } } - }, - ['Against the Wendigo'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Pensher Wyrm'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'elder', 'red', 'blue' } } - }, - ['Approaching Storm'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Into the Shadowlands'] = { - easy = { token = { 'p1', 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['London Set 1'] = { - easy = { token = { 'p2', 'p1', '0', '0', '0', 'm1', 'm2', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm2', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - }, - ['London Set 2'] = { - normal = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'elder', 'tablet', 'red', 'blue' } }, - }, - ['London Set 3'] = { - normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - }, - ['Delta Green'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Jennys Choice'] = { - easy = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4','skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'elder', 'red', 'blue' } } - }, - ['The Blob'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['The Initiation'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } - }, - ['Consternation'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'red', 'blue' } }, - }, - ['Of Sphinx'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'elder', 'cultist', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'elder', 'cultist', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'elder', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['Ordis'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['Darkness Falls'] = { - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - ['War of the Worlds'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } - }, - ['Alice in Wonderland'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } - }, - ['Pokemon'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Safari'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Cerulean'] = { - normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Erich Zann'] = { - easy = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - normal = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } - }, - ['Kaimonogatari'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'skull', 'skull', 'cultist', 'red', 'blue' } }, - expert = { token = { '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm6', 'm8', 'skull', 'skull', 'cultist', 'red', 'blue' } } - }, - ['Sleepy Hollow'] = { - normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, - }, - ['Flesh'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, - }, - ['Dark Matter'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } } - }, - ['XXXX'] = { - easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, - expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } - }, - -} - -function onSave() - local globalState = JSON.encode(SPAWNED_PLAYER_CARD_GUIDS) - log('saving global state: ' .. globalState) - self.script_state = globalState -end - -function onload(save_state) - if save_state ~= '' then - log('loading global state: ' .. save_state) - SPAWNED_PLAYER_CARD_GUIDS = JSON.decode(save_state) - else - SPAWNED_PLAYER_CARD_GUIDS = {} - end -end - -function getSpawnedPlayerCardGuid(params) - local guid = params[1] - if SPAWNED_PLAYER_CARD_GUIDS == nil then - return nil - end - return SPAWNED_PLAYER_CARD_GUIDS[guid] -end - -function setSpawnedPlayerCardGuid(params) - local guid = params[1] - local value = params[2] - if SPAWNED_PLAYER_CARD_GUIDS ~= nil then - SPAWNED_PLAYER_CARD_GUIDS[guid] = value - return true - end - return false +-- set true to enable debug logging +DEBUG = false + +function log(message) + if DEBUG then + print(message) + end +end + +--[[ +Known locations and clues. We check this to determine if we should +atttempt to spawn clues, first we look for _ and if +we find nothing we look for +format is [location_guid -> clueCount] +]] +LOCATIONS_DATA_JSON = [[ +{ + "Study": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Study_670914": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Attic_377b20": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Attic": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Cellar_5d3bcc": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Cellar": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Bathroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Bedroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Far Above Your House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Deep Below Your House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Northside_86faac": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Northside": {"type" : "perPlayer", "value": 2, "clueSide": "back"}, + "Graveyard": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Miskatonic University_cedb0a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Miskatonic University": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Downtown_1aa7cb": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Downtown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "St. Mary's Hospital": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Easttown_88245c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Easttown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Southside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Rivertown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Your House_377b20": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Your House_b28633": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Ritual Site": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Arkham Woods_e8e04b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Arkham Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "New Orleans_5ab18a": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "New Orleans": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Riverside_ab9d69": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Riverside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Wilderness_3c5ea8": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Wilderness": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unhallowed Land_552a1d": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Unhallowed Land": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Flooded Square": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Streets of Venice": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Rialto Bridge": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Venetian Garden": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Guardian": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Canal-side": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Accademia Bridge": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Bridge of Sighs": {"type": "fixed", "value": 2, "clueSide": "back"}, + + "Warren Observatory": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Science Building": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Orne Library": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Administration Building": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Student Union": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Humanities Building": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Dormitories": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + "Faculty Offices": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Faculty Offices_1c567d": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + + "La Bella Luna": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Back Hall Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Museum Entrance": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Security Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Security Office_fcb3e4": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Administration Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Administration Office_d2eb25": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Exhibit Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Exhibit Hall_563240": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Exhibit Hall_f3ffb6": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Exhibit Hall_0b0c58": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Exhibit Hall_2d87e6": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Exhibit Hall_da02ea": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + + "Train Car": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Train Car_f3f902": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Train Car_905f69": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Train Car_a3a321": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Train Car_464528": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Train Car_3cfca4": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Train Car_64ffb0": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Train Car_0fb5f0": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + "Engine Car": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "House in the Reeds": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Osborn's General Store": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Congregational Church": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Bishop's Brook": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Burned Ruins": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Schoolhouse": {"type": "fixed", "value": 1, "clueSide": "back"}, + + "Dunwich Village": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Dunwich Village_ac4427": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Cold Spring Glen": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Cold Spring Glen_e58475": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Ten-Acre Meadow": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Ten-Acre Meadow_05b0dd": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Blasted Heath": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Blasted Heath_995fe7": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Whateley Ruins": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Devil's Hop Yard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Devil's Hop Yard_f7dd31": {"type": "fixed", "value": 2, "clueSide": "back"}, + + "Base of the Hill": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Base of the Hill_80236e": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Ascending Path": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Ascending Path_d3ae26": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Sentinel Peak": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Diverging Path": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Diverging Path_7239aa": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Altered Path": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "The Edge of the Universe": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Tear Through Time": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Prismatic Cascade": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Towering Luminosity": {"type": "fixed", "value": 4, "clueSide": "front"}, + "Tear Through Space": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Endless Bridge": {"type": "fixed", "value": 2, "clueSide": "front"}, + "Dimensional Doorway": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Steps of Y'hagharl": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Unstable Vortex": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Indecipherable Stairs": {"type": "fixed", "value": 1, "clueSide": "front"}, + + "Backstage Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Backstage Doorway_0797a9": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Lobby Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Lobby Doorway_7605cf": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Lobby": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Backstage": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Foyer": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Historical Society": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Historical Society_40f79d": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Historical Society_b352f8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Historical Society_0cf5d5": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Historical Society_abc0cb": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Historical Society_ab6a72": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Hidden Library": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + + "Patient Confinement": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Asylum Halls": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Asylum Halls_f99530": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Asylum Halls_576595": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Infirmary": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Basement Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Yard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Garden": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Kitchen": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Mess Hall": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Grand Guignol": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Montmartre": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Montmartre_cbaacc": {"type": "perPlayer", "value": 0, "clueSide": "front"}, + "Montparnasse": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Notre-Dame": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Gare d'Orsay": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Opéra Garnier": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Canal Saint-Martin": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Le Marais": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Gardens of Luxembourg": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Père Lachaise Cemetery": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Catacombs": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Catacombs_29170f": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_f1237c": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_c3151e": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_14b1cb": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_81920c": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_c14c8b": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Catacombs_ea2a55": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Catacombs_8bcab3": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Catacombs_7c7f4a": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Catacombs_80cf41": {"type": "fixed", "value": 0, "clueSide": "back"}, + + "Abbey Church": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Porte de l'Avancée": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Grand Rue": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Cloister": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Knight's Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Chœur Gothique": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Outer Wall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Outer Wall_014bd6": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "North Tower": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "North Tower_69eae5": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Chapel of St. Aubert": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + "Chapel of St. Aubert_e75ba8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Abbey Tower": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + "Abbey Tower_2f3d21": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Shores of Hali": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Dark Spires": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Palace of the King": {"type": "perPlayer", "value": 3, "clueSide": "front"}, + "Palace of the King_60d758": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Ruins of Carcosa": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Dim Streets": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Depths of Demhe": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Bleak Plains": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Recesses of Your Own Mind": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "The Throne Room": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Stage of the Ward Theatre": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Serpent’s Haven": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ruins of Eztli": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Rope Bridge": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Overgrown Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "River Canyon": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Path of Thorns": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Temple of the Fang": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Circuitous Trail": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Riverside Temple": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Waterfall": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Trail of the Dead": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Cloud Forest": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Chamber of Time": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ancient Hall": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ancient Hall_b9acb8": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Grand Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Entryway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Underground Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Burial Pit": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Secret Passage": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Snake Pit": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Throne Room": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Mosaic Chamber": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Tomb of the Ancients": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Town Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Curiositie Shoppe": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "At the Station": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "At the Station_e0833c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Missing Persons": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Relic is Missing!": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Trial of the Huntress": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Search for the Meaning": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Seeking Trouble": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Seeking Trouble_42f93b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + + "Sacred Woods": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Chapultepec Hill": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Chapultepec Hill_baec21": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Canals of Tenochtitlán": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Lake Xochimilco": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Lake Xochimilco_59bf7d": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Templo Mayor": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Templo Mayor_fb0083": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Temples of Tenochtitlán": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Temples of Tenochtitlán_80cef8": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Mouth of K'n-yan_38a3e5": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Stone Altar": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Time-Wracked Woods": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Vast Passages": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Perilous Gulch": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Dark Hollow": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Hall of Idolatry": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Crystal Pillars": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Ruins of K’n-yan": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Chthonian Depths": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Subterranean Swamp": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Treacherous Descent": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Interview Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Interview Room_b1861c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Halls of Pnakotus": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Deconstruction Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Towers of Pnakotus": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Laboratory of the Great Race": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Yithian Orrery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Great Library": {"type": "fixed", "value": 4, "clueSide": "back"}, + "Cyclopean Vaults": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Alien Conservatory": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "City of the Serpents": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Bridge over N'kai": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Abandoned Site": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Caverns of Yoth": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Hall of Heresy": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Bright Canyon": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Forked Path": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + + "Nexus of N'kai": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "A Pocket in Time": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "City of the Unseen": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Valusia": {"type": "fixed", "value": 2, "clueSide": "front"}, + "Great Hall of Celeano": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Buenos Aires": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Ultima Thule": {"type": "fixed", "value": 2, "clueSide": "front"}, + + "Shores of R’lyeh": {"type": "fixed", "value": 2, "clueSide": "front"}, + "Atlantis": {"type": "fixed", "value": 2, "clueSide": "front"}, + "Pnakotus": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Ruins of New York": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Yuggoth": {"type": "fixed", "value": 3, "clueSide": "front"}, + "Mu": {"type": "fixed", "value": 4, "clueSide": "front"}, + "Plateau of Leng_0ab6ff": {"type": "fixed", "value": 1, "clueSide": "front"}, + + "Billiards Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Billiards Room_33990b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Trophy Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Trophy Room_e9160a": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Master Bedroom": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Balcony_1b5483": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Office_a1bd9a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Witch-Haunted Woods_1539ea": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Witch-Haunted Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Witch-Haunted Woods_d3f8c3": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Witch-Haunted Woods_eca18e": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Paths into Twilight": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + + "The Imperial Entrance": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Dark Stairwell": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Stairway": {"type": "fixed", "value": 1, "clueSide": "back"}, + "The Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Back Booths": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Lobby": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Backroom Door": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Backroom Door_ed439d": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Dining Area": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Dance Floor": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Gateway to the East": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Back Alley": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Mingzhu Laundry": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Dragon's Den": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "The Phoenix's Nest": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Golden Temple of the Heavens": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Flea Market": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Zihao's House of Fighting Arts": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Daiyu's Tea Garden": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Moldy Halls": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Decrepit Door": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Walter Gilman's Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unknown Places_b538f8": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Unknown Places_7bea34": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Unknown Places": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Unknown Places_9a471d": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unknown Places_0ac3ea": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Strange Geometry": {"type": "fixed", "value": 1, "clueSide": "front"}, + "Site of the Sacrifice": {"type": "perPlayer", "value": 3, "clueSide": "back"}, + + "Hangman's Brook": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Abandoned Chapel": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Haunted Fields": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Lobby_1c2dfe": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Lobby_bcd556": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Lodge Gates_fa6a29": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Lodge Gates": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Lodge Cellar": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Lodge Cellar_8ea4fd": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Lounge": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Vault": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Inner Sanctum": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Library": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Library_47ccbc": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Sanctum Doorway": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Sanctum Doorway_4da6c3": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "The Geist-Trap": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Forbidding Shore": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unvisited Isle": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Rivertown_92ee68": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Rivertown_db4b20": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Southside_c898a0": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Southside_e7f5fa": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Silver Twilight Lodge": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Silver Twilight Lodge_17e686": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Hangman's Hill": {"type": "fixed", "value": 0, "clueSide": "back"}, + "Hangman's Hill_5f4d8a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Cosmic Ingress": {"type": "fixed", "value": 3, "clueSide": "back"}, + "Cosmos": {"type": "fixed", "value": 1, "clueSide": "back"}, + "Cosmos_a89dbf": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Cosmos_1a0ad2": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Cosmos_30fc53": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Cosmos_8f3e16": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Cosmos_4e8ae3": {"type": "fixed", "value": 2, "clueSide": "back"}, + "Cosmos_a8d84d": {"type": "fixed", "value": 4, "clueSide": "back"}, + "Cosmos_7a3ece": {"type": "fixed", "value": 6, "clueSide": "back"}, + "Cosmos_311eb1": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Seventy Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Seven Hundred Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Base of the Steps": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Enchanted Woods": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Stairwell": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Basement Door_42fa87": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Basement Door": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Waiting Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Emergency Room": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Experimental Therapies Ward": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Records Office": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Foyer_9a9f9a": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Room 245": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Hotel Roof": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Office_b3ed47": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Room 212": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Basement": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Second Floor Hall": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Room 225": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Restaurant": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Suite Balcony": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Ulthar": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Dylath-Leen": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Mt. Ngranek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Baharna": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Zulan-Thek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Sarnath": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "City-Which-Appears-On-No-Map": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Celephaïs": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Nameless Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Kadatheron": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Ilek-Vad": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Ruins of Ib": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Temple of Unattainable Desires": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Hazuth-Kleg": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Serannian": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Mysterious Stairs": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Mysterious Stairs_df1a40": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Attic_10faf9": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unmarked Tomb": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Upstairs Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Front Porch": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Downstairs Doorway": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Downstairs Doorway_c93906": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Burial Ground": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Temple of the Moon Lizard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "City of the Moon-Beasts": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Moon-Forest": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Dark Crater": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Caverns Beneath the Moon": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Black Core": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Light Side of the Moon": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "City of Gugs": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Vaults of Zin": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Plain of the Ghouls": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Sea of Bones": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Vale of Pnath": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Crag of the Ghouls": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Sea of Pitch": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Plateau of Leng": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Cold Wastes": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Monastery of Leng": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Onyx Gates": {"type": "fixed", "value": 12, "clueSide": "back"}, + "Forsaken Tower": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "The Crater": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Quarantine Zone": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Quarantine Zone_5f2a9b": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Quarantine Zone_4a8e9c": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Quarantine Zone_5193e9": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Quarantine Zone_b3a920": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "The Great Web": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Great Web_39ace3": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Great Web_727790": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Great Web_5c5ec4": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Great Web_361fd7": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "The Great Web_dfdc8c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Expedition Camp": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Desert Oasis": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Untouched Vault": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Sands of Dashur": {"type": "perPlayer", "value": 0, "clueSide": "front"}, + "Sandswept Ruins": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Nile River": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Faceless Sphinx": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Dunes of the Sahara": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Streets of Cairo": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Cairo Bazaar": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Temple Courtyard": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Museum of Egyptian Antiquities": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Outskirts of Cairo": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Eldritch Gate": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Mist-Filled Caverns": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Stairway to Sarkomand": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Tunnels under Ngranek": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "The Great Abyss": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "A Dream Betwixt": {"type": "perPlayer", "value": 0, "clueSide": "front"}, + + "Velma's Doghouse": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Barkham City Pound": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Barkham Asylum": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Beasttown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Tailside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Slobbertown": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Snoutside": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Muttskatonic University": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Boneyard": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "St. Mary's Animal Hospital": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Arkham": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Streets of New York City": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Penthouse": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Burning Pit": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Streets of Providence": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Athenaeum of the Empty Sky": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Arcade": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Streets of Montréal": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Chateau Ramezay": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Shrine of Magh’an Ark’at": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "Unfamiliar Chamber": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Tidal Tunnel": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Tidal Tunnel_0f20fc": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Tidal Tunnel_d5566b": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Tidal Tunnel_dc9eb7": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + "Tidal Tunnel_513d82": {"type": "perPlayer", "value": 0, "clueSide": "back"}, + + "First National Grocery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Marsh Refinery": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Innsmouth Square": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Innsmouth Harbour": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Fish Street Bridge_b6b9b7": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Gilman House": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Little Bookshop": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + + "Innsmouth Jail_f63738": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "New Church Green_d1ef9c": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Sawbone Alley_899c2c": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "The House on Water Street_e4f53a": {"type": "perPlayer", "value": 2, "clueSide": "front"}, + "Shoreward Slums_24e42d": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + "Esoteric Order of Dagon_28c301": {"type": "perPlayer", "value": 1, "clueSide": "front"}, + + "Esoteric Order of Dagon_ef8cef": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "New Church Green_921a9b": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Marsh Refinery_44c342": {"type": "fixed", "value": 1, "clueSide": "back"}, + "The House on Water Street_104e07": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "The Little Bookshop_a17a82": {"type": "fixed", "value": 1, "clueSide": "back"}, + "First National Grocery_9ae75c": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Fish Street Bridge_a358fc": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Innsmouth Harbour_30b2c0": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Sawbone Alley_e58cff": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Gilman House_e589b8": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Innsmouth Jail_755fc0": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Shoreward Slums_c0d0df": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Desolate Coastline": {"type": "fixed", "value": 1, "clueSide": "back"}, + + "Unfathomable Depths_cb5e3e": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Unfathomable Depths_7d180e": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unfathomable Depths_fdf43f": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Unfathomable Depths_431ca2": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + "Unfathomable Depths_dfc9b4": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "Unfathomable Depths_086743": {"type": "perPlayer", "value": 1, "clueSide": "back"}, + + "XXXX": {"type": "perPlayer", "value": 2, "clueSide": "back"}, + "xxx": {"type": "perPlayer", "value": 2, "clueSide": "back"} +} +]] +--[[ +Player cards with token counts and types +]] +PLAYER_CARD_DATA_JSON = [[ +{ + "Flashlight": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Shrivelling": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Shrivelling (3)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Grotesque Statue (4)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Forbidden Knowledge": { + "tokenType": "resource", + "tokenCount": 4 + }, + ".45 Automatic": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Shotgun (4)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Liquid Courage": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Song of the Dead (2)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Cover Up": { + "tokenType": "clue", + "tokenCount": 3 + }, + "Roland's .38 Special": { + "tokenType": "resource", + "tokenCount": 4 + }, + "First Aid": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scrying": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".41 Derringer": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Painkillers": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Smoking Pipe": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Clarity of Mind": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Rite of Seeking": { + "tokenType": "resource", + "tokenCount": 3 + }, + "M1918 BAR (4)": { + "tokenType": "resource", + "tokenCount": 8 + }, + "Ornate Bow (3)": { + "tokenType": "resource", + "tokenCount": 1 + }, + ".41 Derringer (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Suggestion (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Chicago Typewriter (4)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Lupara (3)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "First Aid (3)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Springfield M1903 (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Springfield M1903 (4) (Taboo)": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".32 Colt": { + "tokenType": "resource", + "tokenCount": 6 + }, + "Venturer": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Lockpicks (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Finn's Trusty .38": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".45 Automatic (2)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Lightning Gun (5)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Strange Solution (4)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Strange Solution (4):Acidic Ichor": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Strange Solution (4):Empowering Elixir": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Arcane Insight (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Archaic Glyphs (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "In the Know (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Rite of Seeking (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Alchemical Transmutation": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scrying (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Shrivelling (5)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Mists of R'lyeh": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Mists of R'lyeh (4)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Colt Vest Pocket": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Old Hunting Rifle (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Thermos": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Feed the Mind (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Seal of the Seventh Sign (5)": { + "tokenType": "resource", + "tokenCount": 7 + }, + "Flamethrower (5)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Flamethrower (5) (Taboo)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Pnakotic Manuscripts (5)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Kerosene (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Shards of the Void (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Try and Try Again (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Arcane Initiate": { + "tokenType": "doom", + "tokenCount": 1 + }, + "Detective's Colt 1911s": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Extra Ammunition (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Rite of Seeking (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Arcane Initiate (3)": { + "tokenType": "doom", + "tokenCount": 1 + }, + "Clarity of Mind (3)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Fingerprint Kit": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Truth from Fiction": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Enchanted Blade": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Tennessee Sour Mash": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Scroll of Secrets": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scroll of Secrets (Taboo)": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".45 Thompson": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Mr. \"Rook\"": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Mr. \"Rook\" (Taboo)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scroll of Secrets (3):Seeker": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scroll of Secrets (3) (Taboo):Seeker": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Scroll of Secrets (3):Mystic": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Scroll of Secrets (3) (Taboo):Mystic": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Enchanted Blade (3):Guardian": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Enchanted Blade (3):Mystic": { + "tokenType": "resource", + "tokenCount": 4 + }, + ".45 Thompson (3)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Esoteric Atlas (1)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Tennessee Sour Mash (3):Rogue": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Tennessee Sour Mash (3):Survivor": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Mk 1 Grenades (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Dayana Esperence (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Pendant of the Queen": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".32 Colt (2)": { + "tokenType": "resource", + "tokenCount": 6 + }, + "Alchemical Transmutation (2)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Suggestion (1)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Gate Box": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Tony's .38 Long Colt": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Gregory Gry": { + "tokenType": "resource", + "tokenCount": 9 + }, + "Scroll of Prophecies": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Healing Words": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Otherworld Codex (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".35 Winchester": { + "tokenType": "resource", + "tokenCount": 5 + }, + ".35 Winchester (Taboo)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Old Book of Lore (3)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Sawed-Off Shotgun (5)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Mind's Eye (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Colt Vest Pocket (2)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Mists of R'lyeh (2)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "The Chthonian Stone (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Flesh Ward": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Physical Training (4)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Encyclopedia": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Feed the Mind": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Forbidden Tome": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Esoteric Atlas (2)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "The Necronomicon (5)": { + "tokenType": "resource", + "tokenCount": 6 + }, + "The Necronomicon (5) (Taboo)": { + "tokenType": "resource", + "tokenCount": 6 + }, + "Mauser C96": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Liquid Courage (1)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Mauser C96 (2)": { + "tokenType": "resource", + "tokenCount": 5 + }, + "Beretta M1918 (4)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Scrying Mirror": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Azure Flame": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Clairvoyance": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Ineffable Truth": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Grotesque Statue (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Azure Flame (3)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Clairvoyance (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Ineffable Truth (3)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Arcane Studies (4)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Azure Flame (5)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Clairvoyance (5)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Ineffable Truth (5)": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".18 Derringer": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Grimm's Fairy Tales": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Old Keyring": { + "tokenType": "resource", + "tokenCount": 2 + }, + ".18 Derringer (2)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Chainsaw (4)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Becky": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Book of Psalms": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Cryptographic Cipher": { + "tokenType": "resource", + "tokenCount": 3 + }, + ".25 Automatic": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Obfuscation": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Eldritch Sophist": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Armageddon": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Eye of Chaos": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Shroud of Shadows": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Tool Belt (0)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Tool Belt (3)": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Gabriel": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Fingerprint Kit (5)": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Old Keyring (5)": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Flux Stabilizer": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Cultes des Goules": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Dragon Idol": { + "tokenType": "resource", + "tokenCount": 2 + }, + "Elixir of Life": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Fetch Stick": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Heart of Winter": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Massa di Requiem per Shuggay": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Mi-Go Brain Case": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Milk of Shub-Niggurath": { + "tokenType": "resource", + "tokenCount": 1 + }, + "Ruby of R'yleh": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Sword of Saint Jerome": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Sword of Y'ha-Talla": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Vach-Viraj Chant": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Zanthu Tablets": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Lamp of Alhazred": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Soul Gem": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Book of the Believer": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Mask of Wisdom": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Key of Tawil At-Umr": { + "tokenType": "resource", + "tokenCount": 3 + }, + "Warding Statue": { + "tokenType": "resource", + "tokenCount": 4 + }, + "Yithian Rifle": { + "tokenType": "resource", + "tokenCount": 3 + }, + "xxx": { + "tokenType": "resource", + "tokenCount": 3 + } +} +]] +LOCATIONS_DATA = JSON.decode(LOCATIONS_DATA_JSON) +PLAYER_CARD_DATA = JSON.decode(PLAYER_CARD_DATA_JSON) + +PLAYER_CARD_TOKEN_OFFSETS = { + [1] = { + { 0, 3, -0.2 }, + }, + [2] = { + { 0.4, 3, -0.2 }, + { -0.4, 3, -0.2 }, + }, + [3] = { + { 0, 3, -0.9 }, + { 0.4, 3, -0.2 }, + { -0.4, 3, -0.2 }, + }, + [4] = { + { 0.4, 3, -0.9 }, + { -0.4, 3, -0.9 }, + { 0.4, 3, -0.2 }, + { -0.4, 3, -0.2 } + }, + [5] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.4, 3, -0.2 }, + { -0.4, 3, -0.2 } + }, + [6] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.7, 3, -0.2 }, + { 0, 3, -0.2 }, + { -0.7, 3, -0.2 }, + }, + [7] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.7, 3, -0.2 }, + { 0, 3, -0.2 }, + { -0.7, 3, -0.2 }, + { 0, 3, 0.5 }, + }, + [8] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.7, 3, -0.2 }, + { 0, 3, -0.2 }, + { -0.7, 3, -0.2 }, + { -0.35, 3, 0.5 }, + { 0.35, 3, 0.5 }, + }, + [9] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.7, 3, -0.2 }, + { 0, 3, -0.2 }, + { -0.7, 3, -0.2 }, + { 0.7, 3, 0.5 }, + { 0, 3, 0.5 }, + { -0.7, 3, 0.5 }, + }, + [12] = { + { 0.7, 3, -0.9 }, + { 0, 3, -0.9 }, + { -0.7, 3, -0.9 }, + { 0.7, 3, -0.2 }, + { 0, 3, -0.2 }, + { -0.7, 3, -0.2 }, + { 0.7, 3, 0.5 }, + { 0, 3, 0.5 }, + { -0.7, 3, 0.5 }, + { 0.7, 3, 1.2 }, + { 0, 3, 1.2 }, + { -0.7, 3, 1.2 }, + } + +} + +modeData = { + ['Core Set'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['The Devourer Below'] = { + easy = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, + normal = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, + hard = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' }, + expert = { parent = 'Core Set', append = { 'elder' }, message = 'An additional token for the preparation of this scenario has been added to the bag.' } + }, + -----------------The Dunwich Legacy + + ['The Dunwich Legacy'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'red', 'blue' } } + }, + ['The Miskatonic Museum'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Essex County Express'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Blood on the Altar'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Undimensioned and Unseen'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Where Doom Awaits'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Lost in Time and Space'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + -----------------The Path to Carcosa + + ['The Path to Carcosa'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'skull', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'red', 'blue' } } + }, + ['The Last King'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['Echoes of the Past'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['The Unspeakable Oath'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['A Phantom of Truth'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['The Pallid Mask'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['Black Stars Rise'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' }, random = { {'cultist', 'cultist'}, {'tablet', 'tablet'}, {'elder', 'elder'} } } + }, + ['Dim Carcosa'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'red', 'blue' } } + }, + -----------------The Forgotten Age + + ['The Forgotten Age'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } + }, + ['The Doom of Eztli'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Threads of Fate'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Boundary Beyond'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The City of Archives'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Depths of Yoth'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Heart of the Elders'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Shattered Aeons'] = { + standalone = { token = { 'p1', '0', '0', '0','m1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } } + }, + + -----------------The Circle Undone + + ['The Circle Undone'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm6', 'm8', 'skull', 'skull', 'red', 'blue' } } + }, + ["At Death's Doorstep"] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Secret Name'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Wages of Sin'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['For the Greater Good'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Union and Disillusion'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['In the Clutches of Chaos'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Before the Black Throne'] = { + standalone = { token = { 'p1', '0', '0', 'm1','m1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + + + -----------------The Dream-Eaters + + ['TDE_A'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['TDE_B'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } + }, + ['The Search For Kadath'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['A Thousand Shapes of Horror'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } + }, + ['Dark Side of the Moon'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['Point of No Return'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } + }, + ['Where the Gods Dwell'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['Weaver of the Cosmos'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'cultist', 'elder', 'elder', 'red', 'blue' } } + }, + + + -----------------The Innsmouth Conspiracy + ['The Innsmouth Conspiracy'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } , + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + ['The Vanishing of Elina Harper'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + ['In Too Deep'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + ['Devil Reef'] = { + standalone = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + + -----------------The Side Missions + --official + ['Curse of the Rougarou'] = { + normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Carnevale of Horrors'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Labyrinths of Lunacy'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'red', 'blue' } }, + hard = { token = { 'p1', '0','m1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'red', 'blue' } } + }, + ['Guardians of the Abyss'] = { + normal = { token = { 'p1', 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Excelsior'] = { + normal = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Read or Die'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['All or Nothing'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + + ['Meowlathotep'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + + ['WotOG'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'skull', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'skull', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'skull', 'red', 'blue' } } + }, + + ['Bad Blood'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + + --fan-made + ['Carnevale of Spiders'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + + ['The Nephew Calls'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Outsider'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Stranger Things'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Winter Winds'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'skull', 'cultist', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'cultist', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'cultist', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'cultist', 'red', 'blue' } } + }, + ['The Festival'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Forbidding Desert'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['Happys Funhouse'] = { + normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm5', 'm7', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Knightfall'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'cultist', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Last Call at Roxies'] = { + easy = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + ['The Limens of Belief'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } } + }, + ['Blood Spilled in Salem'] = { + normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Bread and Circuses'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['Bridge of Sighs'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['The Collector'] = { + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['The Colour out of Space'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Curse of Amultep'] = { + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['The Dying Star'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'blue', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'blue', 'red', 'blue' } } + }, + ['Against the Wendigo'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Pensher Wyrm'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'elder', 'red', 'blue' } } + }, + ['Approaching Storm'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Into the Shadowlands'] = { + easy = { token = { 'p1', 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['London Set 1'] = { + easy = { token = { 'p2', 'p1', '0', '0', '0', 'm1', 'm2', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm2', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + }, + ['London Set 2'] = { + normal = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'elder', 'tablet', 'red', 'blue' } }, + }, + ['London Set 3'] = { + normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + }, + ['Delta Green'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Jennys Choice'] = { + easy = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4','skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm5', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'elder', 'red', 'blue' } } + }, + ['The Blob'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['The Initiation'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } + }, + ['Consternation'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'm7', 'skull', 'skull', 'skull', 'red', 'blue' } }, + }, + ['Of Sphinx'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'elder', 'cultist', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'skull', 'elder', 'cultist', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'elder', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['Ordis'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'elder', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['Darkness Falls'] = { + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + ['War of the Worlds'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } + }, + ['Alice in Wonderland'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'm5', 'm6', 'skull', 'skull', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7', 'm8', 'skull', 'skull', 'elder', 'red', 'blue' } } + }, + ['Pokemon'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'm8', 'skull', 'skull', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Safari'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Cerulean'] = { + normal = { token = { 'p1', '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', 'm1', 'm2', 'm3', 'm3', 'm4', 'm6', 'skull', 'skull', 'cultist', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Erich Zann'] = { + easy = { token = { 'p1', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + normal = { token = { 'p1', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } } + }, + ['Kaimonogatari'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm2', 'm2', 'm3', 'm4', 'm4', 'm5', 'skull', 'skull', 'cultist', 'red', 'blue' } }, + expert = { token = { '0', '0', 'm1', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm6', 'm8', 'skull', 'skull', 'cultist', 'red', 'blue' } } + }, + ['Sleepy Hollow'] = { + normal = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + hard = { token = { 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'skull', 'cultist', 'tablet', 'elder', 'red', 'blue' } }, + }, + ['Flesh'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm3', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', 'm1', 'm1', 'm2', 'm3', 'm3', 'm4', 'm4', 'm6', 'skull', 'skull', 'cultist', 'tablet', 'tablet', 'red', 'blue' } }, + }, + ['Dark Matter'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'cultist', 'red', 'blue' } } + }, + ['XXXX'] = { + easy = { token = { 'p1', 'p1', '0', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + normal = { token = { 'p1', '0', '0', 'm1', 'm1', 'm1', 'm2', 'm2', 'm3', 'm4', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + hard = { token = { '0', '0', '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm5', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } }, + expert = { token = { '0', 'm1', 'm1', 'm2', 'm2', 'm3', 'm3', 'm4', 'm4', 'm5', 'm6', 'm8', 'skull', 'skull', 'cultist', 'tablet', 'red', 'blue' } } + }, + +} + +function onSave() + local globalState = JSON.encode(SPAWNED_PLAYER_CARD_GUIDS) + log('saving global state: ' .. globalState) + self.script_state = globalState +end + +function onload(save_state) + if save_state ~= '' then + log('loading global state: ' .. save_state) + SPAWNED_PLAYER_CARD_GUIDS = JSON.decode(save_state) + else + SPAWNED_PLAYER_CARD_GUIDS = {} + end +end + +function getSpawnedPlayerCardGuid(params) + local guid = params[1] + if SPAWNED_PLAYER_CARD_GUIDS == nil then + return nil + end + return SPAWNED_PLAYER_CARD_GUIDS[guid] +end + +function setSpawnedPlayerCardGuid(params) + local guid = params[1] + local value = params[2] + if SPAWNED_PLAYER_CARD_GUIDS ~= nil then + SPAWNED_PLAYER_CARD_GUIDS[guid] = value + return true + end + return false end \ No newline at end of file diff --git a/unpacked/Custom_Tile New Deck Importer edad66.ttslua b/unpacked/Custom_Tile New Deck Importer edad66.ttslua index 58fb460b9..0bcc84b01 100644 --- a/unpacked/Custom_Tile New Deck Importer edad66.ttslua +++ b/unpacked/Custom_Tile New Deck Importer edad66.ttslua @@ -1,431 +1,431 @@ ---[[ Lua code. See documentation: https://api.tabletopsimulator.com/ --]] - ---[[ The onLoad event is called after the game save finishes loading. --]] -function onLoad() - init() - -- Setup... - publicDeckURL="https://arkhamdb.com/api/public/decklist/" - privateDeckURL="https://arkhamdb.com/api/public/deck/" - cardURL="https://arkhamdb.com/api/public/card/" - tabooListURL="https://arkhamdb.com/api/public/taboos/" - subnameCards={{name="Randolph Carter",xp=0},{name="Dream Diary",xp=3},{name="Relic of Ages",xp=0},{name="The Necronomicon",xp=0},{name="Archaic Glyphs",xp=3},{name="Strange Solution",xp=4},{name="Forbidden Tome",xp=3},{name="Relic of Ages",xp=0}, {name="Ancient Stone",xp=4}, {"Dream Diary",xp=0},{name="Empower Self",xp=2}} - extraPermanents={["Duke"]=true,["Sophie"]=true,["Gate Box"]=true,["Dark Insight"]=true} - multiClassCards={{name=".45 Thompson",xp=3},{name="Scroll of Secrets",xp=3},{name="Tennessee Sour Mash",xp=3},{name="Enchanted Blade",xp=3},{name="Grisly Totem",xp=3}} - returningCards={{name="On Your Own"}} - advancedSignatures={{name="Daisy's Tote Bag"},{name="The Necronomicon"},{name="On the Lam"},{name="Hospital Debts"},{name="Dark Memory"},{name="Heirloom of Hyperborea"}} - bondedCardsOneThree={{name="Hallowed Mirror",bondedName="Soothing Melody",bondedCode=05314},{name="Occult Lexicon",bondedName="Blood-Rite",bondedCode=05317},{name="The Hungering Blade",bondedName="Bloodlust",bondedCode=06019},{name="Nightmare Bauble",bondedName="Dream Parasite",bondedCode=06331},{name="Miss Doyle",bondedName="Hope",bondedCode=06031,bondedNameSecond="Zeal",bondedCodeSecond=06032,bondedNameThird="Augur",bondedCodeThird=06033}} - bondedCardsBoolean = {{name="Gate Box",bondedName="Dream-Gate",bondedCode="06015a",bondCount=1},{name="Crystallizer of Dreams",bondedName="Guardian of the Crystallizer",bondedCode=06025,bondCount=2},{name="Dream Diary",bondedName="Essence of the Dream",bondedCode=06113,bondCount=1},{name="Empty Vessel",bondedName="Wish Eater",bondedCode=06277,bondCount=1},{name="Segment of Onyx",bondedName="Pendant of the Queen",bondedCode=06022,bondCount=1},{name="Stargazing",bondedName="The Stars Are Right",bondedCode=06028,bondCount=2},{name="Summoned Hound",bondedName="Unbound Beast",bondedCode=06283,bondCount=2}} - privateDeck = true - - makeText() - makeButton() - makeCheckboxPP() - - all_cards_bag = getObjectFromGUID("15bb07") - weaknesses_bag = getObjectFromGUID("770c4e") - - -- Get current taboolist - tabooList = {} - WebRequest.get(tabooListURL, self, 'tabooListCallback') -end - -function init() - cardList = {} - doneSlots = 0 - totalCards = 0 - tabooID = 0 -end - --- Previously this was "spawnZone" -function get_deck() - if deckID == nil then - broadcastToAll("Deck ID required", {0.5,0.5,0.5}) - return 1 - end - - deckPos = self.positionToWorld({0.285,1.5,0.48}) - permPos = self.positionToWorld({-0.285,1.5,0.48}) - - -- Get deck from ArkhamDB.. - local deckURL - if privateDeck then deckURL = privateDeckURL - else deckURL = publicDeckURL - end - - WebRequest.get(deckURL .. deckID, self, 'deckReadCallback') -end - -function deckReadCallback(req) - -- Result check.. - if req.is_done and not req.is_error - then - if string.find(req.text, "") - then - broadcastToAll("Private deck "..deckID.." is not shared", {0.5,0.5,0.5}) - return - end - JsonDeckRes = JSON.decode(req.text) - else - print (req.error) - return - end - if (JsonDeckRes == nil) - then - broadcastToAll("Deck not found!", {0.5,0.5,0.5}) - return - else - print("Found decklist: "..JsonDeckRes.name) - end - -- Count number of cards in decklist - numSlots=0 - for cardid,number in - pairs(JsonDeckRes.slots) - do - numSlots = numSlots + 1 - end - - -- Check for taboos - tabooID = JsonDeckRes.taboo_id - if tabooID - then - print("Using List of Taboos from "..tabooList[tabooID].date..".") - end - - -- Save card id, number in table and request card info from ArkhamDB - for cardID,number in pairs(JsonDeckRes.slots) - do - local row = {} - row.cardName = "" - row.cardCount = number - cardList[cardID] = row - WebRequest.get(cardURL .. cardID, self, 'cardReadCallback') - totalCards = totalCards + number - end -end - -function cardReadCallback(req) - -- Result check.. - if req.is_done and not req.is_error - then - -- Find unicode before using JSON.decode since it doesnt handle hex UTF-16 - local tmpText = string.gsub(req.text,"\\u(%w%w%w%w)", convertHexToDec) - JsonCardRes = JSON.decode(tmpText) - else - print(req.error) - return - end - - -- Update card name in table - if(JsonCardRes.xp == nil or JsonCardRes.xp == 0) - then - cardList[JsonCardRes.code].cardName = JsonCardRes.real_name - else - cardList[JsonCardRes.code].cardName = JsonCardRes.real_name .. " (" .. JsonCardRes.xp .. ")" - end - - -- Make Subname blank if it does not exist - if (JsonCardRes.subname == nil and (JsonCardRes.subtype_name ~= "Basic Weakness" and JsonCardRes.subtype_name ~= "Weakness")) - then - cardList[JsonCardRes.code].subName = JsonCardRes.subname - end - - -- Check for subname - for k,v in pairs(subnameCards) do - if (v.name == JsonCardRes.real_name and (v.xp == JsonCardRes.xp or JsonCardRes.xp == nil)) - then - cardList[JsonCardRes.code].subName = nil - end - end - - -- Check for multiclass - for k,v in pairs(multiClassCards) do - if (v.name == JsonCardRes.real_name and (v.xp == JsonCardRes.xp or JsonCardRes.xp == nil)) - then - cardList[JsonCardRes.code].subName = JsonCardRes.faction_name - end - end - - -- Check for returning cards (cards with the same name/level but different and from a new set) - for k,v in pairs(returningCards) do - if (v.name == JsonCardRes.real_name and JsonCardRes.pack_name == "Return to the Forgotten Age") - then - cardList[JsonCardRes.code].subName = "Permanent" - end - end - - -- Check for advanced signature cards (this happens after subname check, so it should be fine) - for k,v in pairs(advancedSignatures) do - if (v.name == JsonCardRes.real_name) then - --The Necronomicon is a whole can of worms, so handle it separately - if (JsonCardRes.real_name == "The Necronomicon") then - if (JsonCardRes.pack_name == "Read or Die") then - cardList[JsonCardRes.code].subName = "John Dee Translation (Advanced)" - elseif (JsonCardRes.pack_name == "The Miskatonic Museum") then - cardList[JsonCardRes.code].subName = "Olaus Wormius Translation" - elseif (JsonCardRes.pack_name == "Harvey Walters") then - cardList[JsonCardRes.code].subName = "Petrus de Dacia Translation" - else - cardList[JsonCardRes.code].subName = "John Dee Translation" - end - elseif (JsonCardRes.pack_name == "Read or Die" or JsonCardRes.pack_name == "All or Nothing" or JsonCardRes.pack_name == "Bad Blood") then - if (v.name == "Heirloom of Hyperborea") then - cardList[JsonCardRes.code].subName = "Artifact from Another Life (Advanced)" - else - cardList[JsonCardRes.code].subName = "Advanced" - end - else - if (cardList[JsonCardRes.code].subName == nil) then - if (v.name == "Heirloom of Hyperborea") then - cardList[JsonCardRes.code].subName = "Artifact from Another Life" - else - cardList[JsonCardRes.code].subName = "Signature" - end - end - end - end - end - - -- Check if card is permanent (always) - if (JsonCardRes.permanent == true or extraPermanents[JsonCardRes.real_name]) then - cardList[JsonCardRes.code].permanent = true - else - cardList[JsonCardRes.code].permanent = false - end - - -- Check for '1:3' bonding cards, which always brings in 3 bonded cards, where the original card is limit 1 per deck. - for k,v in pairs(bondedCardsOneThree) do - if (v.name == JsonCardRes.real_name) - then - - -- Check for Miss Doyle, who has a special exception since her 3 cards are different - if (v.name == "Miss Doyle") - then - local row = {} - local rowSecond = {} - local rowThird = {} - row.cardName = v.bondedName - rowSecond.cardName = v.bondedNameSecond - rowThird.cardName = v.bondedNameThird - row.cardCount = 1 - rowSecond.cardCount = 1 - rowThird.cardCount = 1 - row.permanent = true - rowSecond.permanent = true - rowThird.permanent = true - cardList[v.bondedCode] = row - cardList[v.bondedCodeSecond] = rowSecond - cardList[v.bondedCodeThird] = rowThird - else - local row = {} - row.cardName = v.bondedName - row.cardCount = 3 - row.permanent = true - cardList[v.bondedCode] = row - end - end - end - - -- Check for more complicated bonding cards - for k,v in pairs(bondedCardsBoolean) do - if (v.name == JsonCardRes.real_name and cardList[v.bondedCode] == nil) - then - local row = {} - row.cardName = v.bondedName - row.cardCount = v.bondCount - row.permanent = true - cardList[v.bondedCode] = row - end - end - - - -- Check for Taboos (add " (Taboo)" to card name) - if tabooID then - for k,v in pairs(tabooList[tabooID].cards) do - if v.code == JsonCardRes.code - then - cardList[JsonCardRes.code].cardName = cardList[JsonCardRes.code].cardName .. " (Taboo)" - end - end - end - - -- Update number of processed slots, if complete, start building the deck - doneSlots = doneSlots + 1 - if (doneSlots == numSlots) - then - createDeck() - end -end - -function createDeck() - for k,v in pairs(cardList) do - searchForCard(v.cardName, v.subName, v.cardCount, v.permanent) - end -end - -function searchForCard(cardName, subName, cardCount, permanent) - if cardName == 'Random Basic Weakness' then - -- pull a weakness card instead - weaknesses_bag.shuffle() - local taken = weaknesses_bag.takeObject({ - position = deckPos, - index = 0, - smooth = false, - params = { cardName, cardCount, false } - }) - -- just special case the one permanent for now - if taken.getName() == 'Indebted' then - taken.setPosition(permPos) - end - broadcastToAll("Drew random basic weakness: " .. taken.getName()) - return - end - - allCards = all_cards_bag.getObjects() - for k,v in pairs(allCards) do - if (v.nickname == cardName) - then - if(subName == nil or v.description == subName) - then - all_cards_bag.takeObject({ - position = {0, 1.5, 0}, - callback = 'cardTaken', - callback_owner=self, - index = v.index, - smooth = false, - params = { cardName, cardCount, permanent, v.guid } - }) - print('Added '.. cardCount .. ' of ' .. cardName) - return - end - end - end - broadcastToAll("Card not found: "..cardName, {0.5,0.5,0.5}) -end - -function cardTaken(card, params) - -- Check destination deck (permanent?) - local destPos - local rotation = self.getRotation() - if (params[3] == true) then -- permanent card - destPos = permPos - else - destPos = deckPos - rotation = rotation + Vector(0, 0, 180) -- Flip non-permanents facedown - end - - if (card.getName() == params[1]) then - for i=1, params[2] do - local cloneParams = {} - cloneParams.position=destPos - card.clone(cloneParams).setRotation(rotation) - end - all_cards_bag.putObject(card) - else - print('Wrong card: ' .. card.getName()) - all_cards_bag.putObject(card) - end -end - -function tabooListCallback(req) - -- Result check.. - if req.is_done and not req.is_error - then - -- Find unicode before using JSON.decode since it doesnt handle hex UTF-16 - local tmpText = string.gsub(req.text,"\\u(%w%w%w%w)", convertHexToDec) - JsonTabooRes = JSON.decode(tmpText) - else - print(req.error) - return - end - for k,v in pairs(JsonTabooRes) do - local row = {} - row.date = v.date_start - row.cards = JSON.decode(v.cards) - tabooList[v.id] = row - end -end - -function makeText() - -- Create textbox - local input_parameters = {} - input_parameters.input_function = "inputTyped" - input_parameters.function_owner = self - input_parameters.position = {0.33,0.1,-0.255} - input_parameters.width = 2200 - input_parameters.scale = {0.1,0.1,0.1} - input_parameters.height = 500 - input_parameters.font_size = 450 - input_parameters.tooltip = "*****PLEASE USE AN UNPUBLISHED DECK IF JUST FOR TTS TO AVOID FLOODING ARKHAMDB PUBLISHED DECK LISTS!*****\nInput deck ID from ArkhamDB URL of the deck\nExample: For the URL 'https://arkhamdb.com/decklist/view/101/knowledge-overwhelming-solo-deck-1.0', you should input '101'" - input_parameters.alignment = 3 -- (1 = Automatic, 2 = Left, 3 = Center, 4 = Right, 5 = Justified) –Optional - input_parameters.value="" - input_parameters.color = {0.9,0.7,0.5} - input_parameters.validation = 2 - self.createInput(input_parameters) -end - -function inputTyped(objectInputTyped, playerColorTyped, input_value, selected) - deckID = input_value -end - -function makeButton() - -- Create Button - local button_parameters = {} - button_parameters.click_function = "buttonClicked" - button_parameters.function_owner = self - button_parameters.position = {0,0.05,-0.1} - button_parameters.width = 300 - button_parameters.height = 100 - button_parameters.tooltip = "Click to build your deck!" - button_parameters.scale = {1,1,0.6} - self.createButton(button_parameters) -end - -function buttonClicked() - -- Reset - init() - - get_deck() -end - -function makeCheckboxPP() - -- Create Private/Published checkbox - local checkbox_parameters = {} - checkbox_parameters.click_function = "checkboxPPClicked" - checkbox_parameters.function_owner = self - checkbox_parameters.position = {-0.33,0.1,-0.255} - checkbox_parameters.width = 2100 - checkbox_parameters.height = 500 - checkbox_parameters.tooltip = "Click to toggle Private/Published deck ID" - checkbox_parameters.label = "Private" - checkbox_parameters.font_size = 350 - checkbox_parameters.scale = {0.1,0.1,0.1} - checkbox_parameters.color = {0.9,0.7,0.5} - checkbox_parameters.hover_color = {0.4,0.6,0.8} - self.createButton(checkbox_parameters) -end - -function checkboxPPClicked() - buttons = self.getButtons() - for k,v in pairs(buttons) do - if (v.label == "Private") then - local button_parameters = {} - button_parameters.label = "Published" - button_parameters.index = v.index - self.editButton(button_parameters) - privateDeck = false - else - if (v.label == "Published") then - local button_parameters = {} - button_parameters.label = "Private" - button_parameters.index = v.index - self.editButton(button_parameters) - privateDeck = true - end - end - end -end - --- Function to convert utf-16 hex to actual character since JSON.decode doesn't seem to handle utf-16 hex very well.. -function convertHexToDec(a) - return string.char(tonumber(a,16)) -end +--[[ Lua code. See documentation: https://api.tabletopsimulator.com/ --]] + +--[[ The onLoad event is called after the game save finishes loading. --]] +function onLoad() + init() + -- Setup... + publicDeckURL="https://arkhamdb.com/api/public/decklist/" + privateDeckURL="https://arkhamdb.com/api/public/deck/" + cardURL="https://arkhamdb.com/api/public/card/" + tabooListURL="https://arkhamdb.com/api/public/taboos/" + subnameCards={{name="Randolph Carter",xp=0},{name="Dream Diary",xp=3},{name="Relic of Ages",xp=0},{name="The Necronomicon",xp=0},{name="Archaic Glyphs",xp=3},{name="Strange Solution",xp=4},{name="Forbidden Tome",xp=3},{name="Relic of Ages",xp=0}, {name="Ancient Stone",xp=4}, {"Dream Diary",xp=0},{name="Empower Self",xp=2}} + extraPermanents={["Duke"]=true,["Sophie"]=true,["Gate Box"]=true,["Dark Insight"]=true} + multiClassCards={{name=".45 Thompson",xp=3},{name="Scroll of Secrets",xp=3},{name="Tennessee Sour Mash",xp=3},{name="Enchanted Blade",xp=3},{name="Grisly Totem",xp=3}} + returningCards={{name="On Your Own"}} + advancedSignatures={{name="Daisy's Tote Bag"},{name="The Necronomicon"},{name="On the Lam"},{name="Hospital Debts"},{name="Dark Memory"},{name="Heirloom of Hyperborea"}} + bondedCardsOneThree={{name="Hallowed Mirror",bondedName="Soothing Melody",bondedCode=05314},{name="Occult Lexicon",bondedName="Blood-Rite",bondedCode=05317},{name="The Hungering Blade",bondedName="Bloodlust",bondedCode=06019},{name="Nightmare Bauble",bondedName="Dream Parasite",bondedCode=06331},{name="Miss Doyle",bondedName="Hope",bondedCode=06031,bondedNameSecond="Zeal",bondedCodeSecond=06032,bondedNameThird="Augur",bondedCodeThird=06033}} + bondedCardsBoolean = {{name="Gate Box",bondedName="Dream-Gate",bondedCode="06015a",bondCount=1},{name="Crystallizer of Dreams",bondedName="Guardian of the Crystallizer",bondedCode=06025,bondCount=2},{name="Dream Diary",bondedName="Essence of the Dream",bondedCode=06113,bondCount=1},{name="Empty Vessel",bondedName="Wish Eater",bondedCode=06277,bondCount=1},{name="Segment of Onyx",bondedName="Pendant of the Queen",bondedCode=06022,bondCount=1},{name="Stargazing",bondedName="The Stars Are Right",bondedCode=06028,bondCount=2},{name="Summoned Hound",bondedName="Unbound Beast",bondedCode=06283,bondCount=2}} + privateDeck = true + + makeText() + makeButton() + makeCheckboxPP() + + all_cards_bag = getObjectFromGUID("15bb07") + weaknesses_bag = getObjectFromGUID("770c4e") + + -- Get current taboolist + tabooList = {} + WebRequest.get(tabooListURL, self, 'tabooListCallback') +end + +function init() + cardList = {} + doneSlots = 0 + totalCards = 0 + tabooID = 0 +end + +-- Previously this was "spawnZone" +function get_deck() + if deckID == nil then + broadcastToAll("Deck ID required", {0.5,0.5,0.5}) + return 1 + end + + deckPos = self.positionToWorld({0.285,1.5,0.48}) + permPos = self.positionToWorld({-0.285,1.5,0.48}) + + -- Get deck from ArkhamDB.. + local deckURL + if privateDeck then deckURL = privateDeckURL + else deckURL = publicDeckURL + end + + WebRequest.get(deckURL .. deckID, self, 'deckReadCallback') +end + +function deckReadCallback(req) + -- Result check.. + if req.is_done and not req.is_error + then + if string.find(req.text, "") + then + broadcastToAll("Private deck "..deckID.." is not shared", {0.5,0.5,0.5}) + return + end + JsonDeckRes = JSON.decode(req.text) + else + print (req.error) + return + end + if (JsonDeckRes == nil) + then + broadcastToAll("Deck not found!", {0.5,0.5,0.5}) + return + else + print("Found decklist: "..JsonDeckRes.name) + end + -- Count number of cards in decklist + numSlots=0 + for cardid,number in + pairs(JsonDeckRes.slots) + do + numSlots = numSlots + 1 + end + + -- Check for taboos + tabooID = JsonDeckRes.taboo_id + if tabooID + then + print("Using List of Taboos from "..tabooList[tabooID].date..".") + end + + -- Save card id, number in table and request card info from ArkhamDB + for cardID,number in pairs(JsonDeckRes.slots) + do + local row = {} + row.cardName = "" + row.cardCount = number + cardList[cardID] = row + WebRequest.get(cardURL .. cardID, self, 'cardReadCallback') + totalCards = totalCards + number + end +end + +function cardReadCallback(req) + -- Result check.. + if req.is_done and not req.is_error + then + -- Find unicode before using JSON.decode since it doesnt handle hex UTF-16 + local tmpText = string.gsub(req.text,"\\u(%w%w%w%w)", convertHexToDec) + JsonCardRes = JSON.decode(tmpText) + else + print(req.error) + return + end + + -- Update card name in table + if(JsonCardRes.xp == nil or JsonCardRes.xp == 0) + then + cardList[JsonCardRes.code].cardName = JsonCardRes.real_name + else + cardList[JsonCardRes.code].cardName = JsonCardRes.real_name .. " (" .. JsonCardRes.xp .. ")" + end + + -- Make Subname blank if it does not exist + if (JsonCardRes.subname == nil and (JsonCardRes.subtype_name ~= "Basic Weakness" and JsonCardRes.subtype_name ~= "Weakness")) + then + cardList[JsonCardRes.code].subName = JsonCardRes.subname + end + + -- Check for subname + for k,v in pairs(subnameCards) do + if (v.name == JsonCardRes.real_name and (v.xp == JsonCardRes.xp or JsonCardRes.xp == nil)) + then + cardList[JsonCardRes.code].subName = nil + end + end + + -- Check for multiclass + for k,v in pairs(multiClassCards) do + if (v.name == JsonCardRes.real_name and (v.xp == JsonCardRes.xp or JsonCardRes.xp == nil)) + then + cardList[JsonCardRes.code].subName = JsonCardRes.faction_name + end + end + + -- Check for returning cards (cards with the same name/level but different and from a new set) + for k,v in pairs(returningCards) do + if (v.name == JsonCardRes.real_name and JsonCardRes.pack_name == "Return to the Forgotten Age") + then + cardList[JsonCardRes.code].subName = "Permanent" + end + end + + -- Check for advanced signature cards (this happens after subname check, so it should be fine) + for k,v in pairs(advancedSignatures) do + if (v.name == JsonCardRes.real_name) then + --The Necronomicon is a whole can of worms, so handle it separately + if (JsonCardRes.real_name == "The Necronomicon") then + if (JsonCardRes.pack_name == "Read or Die") then + cardList[JsonCardRes.code].subName = "John Dee Translation (Advanced)" + elseif (JsonCardRes.pack_name == "The Miskatonic Museum") then + cardList[JsonCardRes.code].subName = "Olaus Wormius Translation" + elseif (JsonCardRes.pack_name == "Harvey Walters") then + cardList[JsonCardRes.code].subName = "Petrus de Dacia Translation" + else + cardList[JsonCardRes.code].subName = "John Dee Translation" + end + elseif (JsonCardRes.pack_name == "Read or Die" or JsonCardRes.pack_name == "All or Nothing" or JsonCardRes.pack_name == "Bad Blood") then + if (v.name == "Heirloom of Hyperborea") then + cardList[JsonCardRes.code].subName = "Artifact from Another Life (Advanced)" + else + cardList[JsonCardRes.code].subName = "Advanced" + end + else + if (cardList[JsonCardRes.code].subName == nil) then + if (v.name == "Heirloom of Hyperborea") then + cardList[JsonCardRes.code].subName = "Artifact from Another Life" + else + cardList[JsonCardRes.code].subName = "Signature" + end + end + end + end + end + + -- Check if card is permanent (always) + if (JsonCardRes.permanent == true or extraPermanents[JsonCardRes.real_name]) then + cardList[JsonCardRes.code].permanent = true + else + cardList[JsonCardRes.code].permanent = false + end + + -- Check for '1:3' bonding cards, which always brings in 3 bonded cards, where the original card is limit 1 per deck. + for k,v in pairs(bondedCardsOneThree) do + if (v.name == JsonCardRes.real_name) + then + + -- Check for Miss Doyle, who has a special exception since her 3 cards are different + if (v.name == "Miss Doyle") + then + local row = {} + local rowSecond = {} + local rowThird = {} + row.cardName = v.bondedName + rowSecond.cardName = v.bondedNameSecond + rowThird.cardName = v.bondedNameThird + row.cardCount = 1 + rowSecond.cardCount = 1 + rowThird.cardCount = 1 + row.permanent = true + rowSecond.permanent = true + rowThird.permanent = true + cardList[v.bondedCode] = row + cardList[v.bondedCodeSecond] = rowSecond + cardList[v.bondedCodeThird] = rowThird + else + local row = {} + row.cardName = v.bondedName + row.cardCount = 3 + row.permanent = true + cardList[v.bondedCode] = row + end + end + end + + -- Check for more complicated bonding cards + for k,v in pairs(bondedCardsBoolean) do + if (v.name == JsonCardRes.real_name and cardList[v.bondedCode] == nil) + then + local row = {} + row.cardName = v.bondedName + row.cardCount = v.bondCount + row.permanent = true + cardList[v.bondedCode] = row + end + end + + + -- Check for Taboos (add " (Taboo)" to card name) + if tabooID then + for k,v in pairs(tabooList[tabooID].cards) do + if v.code == JsonCardRes.code + then + cardList[JsonCardRes.code].cardName = cardList[JsonCardRes.code].cardName .. " (Taboo)" + end + end + end + + -- Update number of processed slots, if complete, start building the deck + doneSlots = doneSlots + 1 + if (doneSlots == numSlots) + then + createDeck() + end +end + +function createDeck() + for k,v in pairs(cardList) do + searchForCard(v.cardName, v.subName, v.cardCount, v.permanent) + end +end + +function searchForCard(cardName, subName, cardCount, permanent) + if cardName == 'Random Basic Weakness' then + -- pull a weakness card instead + weaknesses_bag.shuffle() + local taken = weaknesses_bag.takeObject({ + position = deckPos, + index = 0, + smooth = false, + params = { cardName, cardCount, false } + }) + -- just special case the one permanent for now + if taken.getName() == 'Indebted' then + taken.setPosition(permPos) + end + broadcastToAll("Drew random basic weakness: " .. taken.getName()) + return + end + + allCards = all_cards_bag.getObjects() + for k,v in pairs(allCards) do + if (v.nickname == cardName) + then + if(subName == nil or v.description == subName) + then + all_cards_bag.takeObject({ + position = {0, 1.5, 0}, + callback = 'cardTaken', + callback_owner=self, + index = v.index, + smooth = false, + params = { cardName, cardCount, permanent, v.guid } + }) + print('Added '.. cardCount .. ' of ' .. cardName) + return + end + end + end + broadcastToAll("Card not found: "..cardName, {0.5,0.5,0.5}) +end + +function cardTaken(card, params) + -- Check destination deck (permanent?) + local destPos + local rotation = self.getRotation() + if (params[3] == true) then -- permanent card + destPos = permPos + else + destPos = deckPos + rotation = rotation + Vector(0, 0, 180) -- Flip non-permanents facedown + end + + if (card.getName() == params[1]) then + for i=1, params[2] do + local cloneParams = {} + cloneParams.position=destPos + card.clone(cloneParams).setRotation(rotation) + end + all_cards_bag.putObject(card) + else + print('Wrong card: ' .. card.getName()) + all_cards_bag.putObject(card) + end +end + +function tabooListCallback(req) + -- Result check.. + if req.is_done and not req.is_error + then + -- Find unicode before using JSON.decode since it doesnt handle hex UTF-16 + local tmpText = string.gsub(req.text,"\\u(%w%w%w%w)", convertHexToDec) + JsonTabooRes = JSON.decode(tmpText) + else + print(req.error) + return + end + for k,v in pairs(JsonTabooRes) do + local row = {} + row.date = v.date_start + row.cards = JSON.decode(v.cards) + tabooList[v.id] = row + end +end + +function makeText() + -- Create textbox + local input_parameters = {} + input_parameters.input_function = "inputTyped" + input_parameters.function_owner = self + input_parameters.position = {0.33,0.1,-0.255} + input_parameters.width = 2200 + input_parameters.scale = {0.1,0.1,0.1} + input_parameters.height = 500 + input_parameters.font_size = 450 + input_parameters.tooltip = "*****PLEASE USE AN UNPUBLISHED DECK IF JUST FOR TTS TO AVOID FLOODING ARKHAMDB PUBLISHED DECK LISTS!*****\nInput deck ID from ArkhamDB URL of the deck\nExample: For the URL 'https://arkhamdb.com/decklist/view/101/knowledge-overwhelming-solo-deck-1.0', you should input '101'" + input_parameters.alignment = 3 -- (1 = Automatic, 2 = Left, 3 = Center, 4 = Right, 5 = Justified) –Optional + input_parameters.value="" + input_parameters.color = {0.9,0.7,0.5} + input_parameters.validation = 2 + self.createInput(input_parameters) +end + +function inputTyped(objectInputTyped, playerColorTyped, input_value, selected) + deckID = input_value +end + +function makeButton() + -- Create Button + local button_parameters = {} + button_parameters.click_function = "buttonClicked" + button_parameters.function_owner = self + button_parameters.position = {0,0.05,-0.1} + button_parameters.width = 300 + button_parameters.height = 100 + button_parameters.tooltip = "Click to build your deck!" + button_parameters.scale = {1,1,0.6} + self.createButton(button_parameters) +end + +function buttonClicked() + -- Reset + init() + + get_deck() +end + +function makeCheckboxPP() + -- Create Private/Published checkbox + local checkbox_parameters = {} + checkbox_parameters.click_function = "checkboxPPClicked" + checkbox_parameters.function_owner = self + checkbox_parameters.position = {-0.33,0.1,-0.255} + checkbox_parameters.width = 2100 + checkbox_parameters.height = 500 + checkbox_parameters.tooltip = "Click to toggle Private/Published deck ID" + checkbox_parameters.label = "Private" + checkbox_parameters.font_size = 350 + checkbox_parameters.scale = {0.1,0.1,0.1} + checkbox_parameters.color = {0.9,0.7,0.5} + checkbox_parameters.hover_color = {0.4,0.6,0.8} + self.createButton(checkbox_parameters) +end + +function checkboxPPClicked() + buttons = self.getButtons() + for k,v in pairs(buttons) do + if (v.label == "Private") then + local button_parameters = {} + button_parameters.label = "Published" + button_parameters.index = v.index + self.editButton(button_parameters) + privateDeck = false + else + if (v.label == "Published") then + local button_parameters = {} + button_parameters.label = "Private" + button_parameters.index = v.index + self.editButton(button_parameters) + privateDeck = true + end + end + end +end + +-- Function to convert utf-16 hex to actual character since JSON.decode doesn't seem to handle utf-16 hex very well.. +function convertHexToDec(a) + return string.char(tonumber(a,16)) +end diff --git a/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua b/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua index 8db8db16a..b7274d096 100644 --- a/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua +++ b/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua @@ -1,407 +1,407 @@ --- set true to enable debug logging -DEBUG = false --- we use this to turn off collision handling (for clue spawning) --- until after load is complete (probably a better way to do this) -COLLISION_ENABLED = false --- position offsets, adjust these to reposition things relative to mat [x,y,z] -DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} -DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} -DISCARD_BUTTON_OFFSETS = { - {-0.98, 0.2, -0.945}, - {-0.525, 0.2, -0.945}, - {-0.07, 0.2, -0.945}, - {0.39, 0.2, -0.945}, - {0.84, 0.2, -0.945}, -} --- draw deck and discard zone -DECK_POSITION = { x=-1.4, y=0, z=0.3 } -DECK_ZONE_SCALE = { x=3, y=5, z=8 } -DRAW_DECK_POSITION = { x=-55, y=2.5, z=4.5 } - --- play zone -PLAYER_COLOR = "White" -PLAY_ZONE_POSITION = { x=-55, y=4, z=17 } -PLAY_ZONE_ROTATION = { x=0, y=270, z=0 } -PLAY_ZONE_SCALE = { x=30, y=5, z=15 } - -RESOURCE_COUNTER_GUID = "4406f0" - --- the position of the global discard pile --- TODO: delegate to global for any auto discard actions -DISCARD_POSITION = {-3.85, 3, 10.38} - -function log(message) - if DEBUG then - print(message) - end -end - --- builds a function that discards things in searchPostion to discardPostition -function makeDiscardHandlerFor(searchPosition, discardPosition) - return function (_) - local discardItemList = findObjectsAtPosition(searchPosition) - for _, obj in ipairs(discardItemList) do - obj.setPositionSmooth(discardPosition, false, true) - obj.setRotation({0, -90, 0}) - end - end -end - --- build a discard button at position to discard from searchPosition to discardPosition --- number must be unique -function makeDiscardButton(position, searchPosition, discardPosition, number) - local handler = makeDiscardHandlerFor(searchPosition, discardPosition) - local handlerName = 'handler' .. number - self.setVar(handlerName, handler) - self.createButton({ - label = "Discard", - click_function= handlerName, - function_owner= self, - position = position, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180, - }) -end - -function onload(save_state) - self.interactable = DEBUG - DATA_HELPER = getObjectFromGUID('708279') - PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') - PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') - - -- positions of encounter card slots - local encounterSlots = { - {1, 0, -0.7}, - {0.55, 0, -0.7}, - {0.1, 0, -0.7}, - {-0.35, 0, -0.7}, - {-0.8, 0, -0.7} - } - - local i = 1 - while i <= 5 do - makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) - i = i + 1 - end - - self.createButton({ - label = " ", - click_function = "drawEncountercard", - function_owner = self, - position = {-1.45,0,-0.7}, - rotation = {0,-15,0}, - width = 170, - height = 255, - font_size = 50 - }) - - self.createButton({ - label=" ", - click_function = "drawChaostokenButton", - function_owner = self, - position = {1.48,0.0,-0.74}, - rotation = {0,-45,0}, - width = 125, - height = 125, - font_size = 50 - }) - - self.createButton({ - label="Upkeep", - click_function = "doUpkeep", - function_owner = self, - position = {1.48,0.1,-0.4}, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180 - }) - - local state = JSON.decode(save_state) - if state ~= nil and state.zoneID ~= nil then - zoneID = state.zoneID - Wait.time(checkDeckZoneExists, 30) - else - spawnDeckZone() - end - - COLLISION_ENABLED = true -end - -function onSave() - return JSON.encode({ zoneID=zoneID }) -end - -function doUpkeep(obj, color, alt_click) - -- right-click binds to new player color - if alt_click then - PLAYER_COLOR = color - printToColor("Upkeep button bound to " .. color, color) - return - end - - -- unexhaust cards in play zone - local objs = Physics.cast({ - origin = PLAY_ZONE_POSITION, - direction = { x=0, y=1, z=0 }, - type = 3, - size = PLAY_ZONE_SCALE, - orientation = PLAY_ZONE_ROTATION - }) - - local y = PLAY_ZONE_ROTATION.y - - local investigator = nil - for i,v in ipairs(objs) do - local obj = v.hit_object - local props = obj.getCustomObject() - if obj.tag == "Card" and not obj.is_face_down then - if props ~= nil and props.unique_back then - local name = obj.getName() - if string.match(name, "Jenny Barnes") ~= nil then - investigator = "Jenny Barnes" - elseif name == "Patrice Hathaway" then - investigator = name - end - else - local r = obj.getRotation() - if (r.y - y > 10) or (y - r.y > 10) then - obj.setRotationSmooth(PLAY_ZONE_ROTATION) - end - end - elseif obj.tag == "Board" and obj.getDescription() == "Action token" then - if obj.is_face_down then obj.flip() end - end - end - - -- gain resource - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - if investigator == "Jenny Barnes" then - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) - end - - -- draw card (shuffle discard if necessary) - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - drawDeck = nil - discardPile = nil - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Deck" or object.tag == "Card" then - if object.is_face_down then - drawDeck = object - else - discardPile = object - end - end - end - - if investigator == "Patrice Hathaway" then - patriceDraw() - return - end - - if drawDeck == nil then - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(1), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) - else - drawCards(1) - end -end - -function drawCards(numCards) - if drawDeck == nil then return end - drawDeck.deal(numCards, PLAYER_COLOR) -end - -function shuffleDiscardIntoDeck() - discardPile.flip() - discardPile.shuffle() - discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) - drawDeck = discardPile - discardPile = nil -end - -function patriceDraw() - local handSize = #Player[PLAYER_COLOR].getHandObjects() - if handSize >= 5 then return end - local cardsToDraw = 5 - handSize - local deckSize - printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) - if drawDeck == nil then - deckSize = 0 - elseif drawDeck.tag == "Deck" then - deckSize = #drawDeck.getObjects() - else - deckSize = 1 - end - - if deckSize >= cardsToDraw then - drawCards(cardsToDraw) - return - end - - drawCards(deckSize) - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(cardsToDraw - deckSize), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) -end - -function checkDeckZoneExists() - if getObjectFromGUID(zoneID) ~= nil then return end - spawnDeckZone() -end - -function spawnDeckZone() - local pos = self.positionToWorld(DECK_POSITION) - local zoneProps = { - position = pos, - scale = DECK_ZONE_SCALE, - type = 'ScriptingTrigger', - callback = 'zoneCallback', - callback_owner = self, - rotation = self.getRotation() - } - spawnObject(zoneProps) -end - -function zoneCallback(zone) - zoneID = zone.getGUID() -end - -function findObjectsAtPosition(localPos) - local globalPos = self.positionToWorld(localPos) - local objList = Physics.cast({ - origin=globalPos, --Where the cast takes place - direction={0,1,0}, --Which direction it moves (up is shown) - type=2, --Type. 2 is "sphere" - size={2,2,2}, --How large that sphere is - max_distance=1, --How far it moves. Just a little bit - debug=false --If it displays the sphere when casting. - }) - local decksAndCards = {} - for _, obj in ipairs(objList) do - if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then - table.insert(decksAndCards, obj.hit_object) - end - end - return decksAndCards -end - -function spawnTokenOn(object, offsets, tokenType) - local tokenPosition = object.positionToWorld(offsets) - spawnToken(tokenPosition, tokenType) -end - --- spawn a group of tokens of the given type on the object -function spawnTokenGroup(object, tokenType, tokenCount) - local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] - if offsets == nil then - error("couldn't find offsets for " .. tokenCount .. ' tokens') - end - local i = 0 - while i < tokenCount do - local offset = offsets[i + 1] - spawnTokenOn(object, offset, tokenType) - i = i + 1 - end -end - -function buildPlayerCardKey(object) - return object.getName() .. ':' .. object.getDescription() -end - -function getPlayerCardData(object) - return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] -end - -function shouldSpawnTokens(object) - -- we assume we shouldn't spawn tokens if in doubt, this should - -- only ever happen on load and in that case prevents respawns - local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) - local canSpawn = getPlayerCardData(object) - return not spawned and canSpawn -end - -function markSpawned(object) - local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) - if not saved then - error('attempt to mark player card spawned before data loaded') - end -end - -function spawnTokensFor(object) - local data = getPlayerCardData(object) - if data == nil then - error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') - end - log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) - spawnTokenGroup(object, data['tokenType'], data['tokenCount']) - markSpawned(object) -end - -function resetSpawnState() - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Card" then - local guid = object.getGUID() - if guid ~= nil then unmarkSpawned(guid, true) end - elseif object.tag == "Deck" then - local cards = object.getObjects() - if (cards ~= nil) then - for i,v in ipairs(cards) do - if v.guid ~= nil then unmarkSpawned(v.guid) end - end - end - end - end -end - -function unmarkSpawned(guid, force) - if not force and getObjectFromGUID(guid) ~= nil then return end - DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) -end - -function onCollisionEnter(collision_info) - if not COLLISION_ENABLED then - return - end - - local object = collision_info.collision_object - Wait.time(resetSpawnState, 1) - -- anything to the left of this is legal to spawn - local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) - local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) - if boundaryLocalToCard.x > 0 then - log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) - return - end - if not object.is_face_down and shouldSpawnTokens(object) then - spawnTokensFor(object) - end -end - --- functions delegated to Global -function drawChaostokenButton(object, player, isRightClick) - -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) - Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) -end - -function drawEncountercard(object, player, isRightClick) -local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) -Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) -end - -function spawnToken(position, tokenType) - Global.call('spawnToken', {position, tokenType}) +-- set true to enable debug logging +DEBUG = false +-- we use this to turn off collision handling (for clue spawning) +-- until after load is complete (probably a better way to do this) +COLLISION_ENABLED = false +-- position offsets, adjust these to reposition things relative to mat [x,y,z] +DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} +DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} +DISCARD_BUTTON_OFFSETS = { + {-0.98, 0.2, -0.945}, + {-0.525, 0.2, -0.945}, + {-0.07, 0.2, -0.945}, + {0.39, 0.2, -0.945}, + {0.84, 0.2, -0.945}, +} +-- draw deck and discard zone +DECK_POSITION = { x=-1.4, y=0, z=0.3 } +DECK_ZONE_SCALE = { x=3, y=5, z=8 } +DRAW_DECK_POSITION = { x=-55, y=2.5, z=4.5 } + +-- play zone +PLAYER_COLOR = "White" +PLAY_ZONE_POSITION = { x=-55, y=4, z=17 } +PLAY_ZONE_ROTATION = { x=0, y=270, z=0 } +PLAY_ZONE_SCALE = { x=30, y=5, z=15 } + +RESOURCE_COUNTER_GUID = "4406f0" + +-- the position of the global discard pile +-- TODO: delegate to global for any auto discard actions +DISCARD_POSITION = {-3.85, 3, 10.38} + +function log(message) + if DEBUG then + print(message) + end +end + +-- builds a function that discards things in searchPostion to discardPostition +function makeDiscardHandlerFor(searchPosition, discardPosition) + return function (_) + local discardItemList = findObjectsAtPosition(searchPosition) + for _, obj in ipairs(discardItemList) do + obj.setPositionSmooth(discardPosition, false, true) + obj.setRotation({0, -90, 0}) + end + end +end + +-- build a discard button at position to discard from searchPosition to discardPosition +-- number must be unique +function makeDiscardButton(position, searchPosition, discardPosition, number) + local handler = makeDiscardHandlerFor(searchPosition, discardPosition) + local handlerName = 'handler' .. number + self.setVar(handlerName, handler) + self.createButton({ + label = "Discard", + click_function= handlerName, + function_owner= self, + position = position, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180, + }) +end + +function onload(save_state) + self.interactable = DEBUG + DATA_HELPER = getObjectFromGUID('708279') + PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') + PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') + + -- positions of encounter card slots + local encounterSlots = { + {1, 0, -0.7}, + {0.55, 0, -0.7}, + {0.1, 0, -0.7}, + {-0.35, 0, -0.7}, + {-0.8, 0, -0.7} + } + + local i = 1 + while i <= 5 do + makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) + i = i + 1 + end + + self.createButton({ + label = " ", + click_function = "drawEncountercard", + function_owner = self, + position = {-1.45,0,-0.7}, + rotation = {0,-15,0}, + width = 170, + height = 255, + font_size = 50 + }) + + self.createButton({ + label=" ", + click_function = "drawChaostokenButton", + function_owner = self, + position = {1.48,0.0,-0.74}, + rotation = {0,-45,0}, + width = 125, + height = 125, + font_size = 50 + }) + + self.createButton({ + label="Upkeep", + click_function = "doUpkeep", + function_owner = self, + position = {1.48,0.1,-0.4}, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180 + }) + + local state = JSON.decode(save_state) + if state ~= nil and state.zoneID ~= nil then + zoneID = state.zoneID + Wait.time(checkDeckZoneExists, 30) + else + spawnDeckZone() + end + + COLLISION_ENABLED = true +end + +function onSave() + return JSON.encode({ zoneID=zoneID }) +end + +function doUpkeep(obj, color, alt_click) + -- right-click binds to new player color + if alt_click then + PLAYER_COLOR = color + printToColor("Upkeep button bound to " .. color, color) + return + end + + -- unexhaust cards in play zone + local objs = Physics.cast({ + origin = PLAY_ZONE_POSITION, + direction = { x=0, y=1, z=0 }, + type = 3, + size = PLAY_ZONE_SCALE, + orientation = PLAY_ZONE_ROTATION + }) + + local y = PLAY_ZONE_ROTATION.y + + local investigator = nil + for i,v in ipairs(objs) do + local obj = v.hit_object + local props = obj.getCustomObject() + if obj.tag == "Card" and not obj.is_face_down then + if props ~= nil and props.unique_back then + local name = obj.getName() + if string.match(name, "Jenny Barnes") ~= nil then + investigator = "Jenny Barnes" + elseif name == "Patrice Hathaway" then + investigator = name + end + else + local r = obj.getRotation() + if (r.y - y > 10) or (y - r.y > 10) then + obj.setRotationSmooth(PLAY_ZONE_ROTATION) + end + end + elseif obj.tag == "Board" and obj.getDescription() == "Action token" then + if obj.is_face_down then obj.flip() end + end + end + + -- gain resource + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + if investigator == "Jenny Barnes" then + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) + end + + -- draw card (shuffle discard if necessary) + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + drawDeck = nil + discardPile = nil + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Deck" or object.tag == "Card" then + if object.is_face_down then + drawDeck = object + else + discardPile = object + end + end + end + + if investigator == "Patrice Hathaway" then + patriceDraw() + return + end + + if drawDeck == nil then + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(1), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) + else + drawCards(1) + end +end + +function drawCards(numCards) + if drawDeck == nil then return end + drawDeck.deal(numCards, PLAYER_COLOR) +end + +function shuffleDiscardIntoDeck() + discardPile.flip() + discardPile.shuffle() + discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) + drawDeck = discardPile + discardPile = nil +end + +function patriceDraw() + local handSize = #Player[PLAYER_COLOR].getHandObjects() + if handSize >= 5 then return end + local cardsToDraw = 5 - handSize + local deckSize + printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) + if drawDeck == nil then + deckSize = 0 + elseif drawDeck.tag == "Deck" then + deckSize = #drawDeck.getObjects() + else + deckSize = 1 + end + + if deckSize >= cardsToDraw then + drawCards(cardsToDraw) + return + end + + drawCards(deckSize) + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(cardsToDraw - deckSize), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) +end + +function checkDeckZoneExists() + if getObjectFromGUID(zoneID) ~= nil then return end + spawnDeckZone() +end + +function spawnDeckZone() + local pos = self.positionToWorld(DECK_POSITION) + local zoneProps = { + position = pos, + scale = DECK_ZONE_SCALE, + type = 'ScriptingTrigger', + callback = 'zoneCallback', + callback_owner = self, + rotation = self.getRotation() + } + spawnObject(zoneProps) +end + +function zoneCallback(zone) + zoneID = zone.getGUID() +end + +function findObjectsAtPosition(localPos) + local globalPos = self.positionToWorld(localPos) + local objList = Physics.cast({ + origin=globalPos, --Where the cast takes place + direction={0,1,0}, --Which direction it moves (up is shown) + type=2, --Type. 2 is "sphere" + size={2,2,2}, --How large that sphere is + max_distance=1, --How far it moves. Just a little bit + debug=false --If it displays the sphere when casting. + }) + local decksAndCards = {} + for _, obj in ipairs(objList) do + if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then + table.insert(decksAndCards, obj.hit_object) + end + end + return decksAndCards +end + +function spawnTokenOn(object, offsets, tokenType) + local tokenPosition = object.positionToWorld(offsets) + spawnToken(tokenPosition, tokenType) +end + +-- spawn a group of tokens of the given type on the object +function spawnTokenGroup(object, tokenType, tokenCount) + local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] + if offsets == nil then + error("couldn't find offsets for " .. tokenCount .. ' tokens') + end + local i = 0 + while i < tokenCount do + local offset = offsets[i + 1] + spawnTokenOn(object, offset, tokenType) + i = i + 1 + end +end + +function buildPlayerCardKey(object) + return object.getName() .. ':' .. object.getDescription() +end + +function getPlayerCardData(object) + return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] +end + +function shouldSpawnTokens(object) + -- we assume we shouldn't spawn tokens if in doubt, this should + -- only ever happen on load and in that case prevents respawns + local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) + local canSpawn = getPlayerCardData(object) + return not spawned and canSpawn +end + +function markSpawned(object) + local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) + if not saved then + error('attempt to mark player card spawned before data loaded') + end +end + +function spawnTokensFor(object) + local data = getPlayerCardData(object) + if data == nil then + error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') + end + log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) + spawnTokenGroup(object, data['tokenType'], data['tokenCount']) + markSpawned(object) +end + +function resetSpawnState() + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Card" then + local guid = object.getGUID() + if guid ~= nil then unmarkSpawned(guid, true) end + elseif object.tag == "Deck" then + local cards = object.getObjects() + if (cards ~= nil) then + for i,v in ipairs(cards) do + if v.guid ~= nil then unmarkSpawned(v.guid) end + end + end + end + end +end + +function unmarkSpawned(guid, force) + if not force and getObjectFromGUID(guid) ~= nil then return end + DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) +end + +function onCollisionEnter(collision_info) + if not COLLISION_ENABLED then + return + end + + local object = collision_info.collision_object + Wait.time(resetSpawnState, 1) + -- anything to the left of this is legal to spawn + local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) + local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) + if boundaryLocalToCard.x > 0 then + log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) + return + end + if not object.is_face_down and shouldSpawnTokens(object) then + spawnTokensFor(object) + end +end + +-- functions delegated to Global +function drawChaostokenButton(object, player, isRightClick) + -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) + Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) +end + +function drawEncountercard(object, player, isRightClick) +local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) +Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) +end + +function spawnToken(position, tokenType) + Global.call('spawnToken', {position, tokenType}) end \ No newline at end of file diff --git a/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua b/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua index 2fd4e8020..6e7c9c59f 100644 --- a/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua +++ b/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua @@ -1,407 +1,407 @@ --- set true to enable debug logging -DEBUG = false --- we use this to turn off collision handling (for clue spawning) --- until after load is complete (probably a better way to do this) -COLLISION_ENABLED = false --- position offsets, adjust these to reposition things relative to mat [x,y,z] -DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} -DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} -DISCARD_BUTTON_OFFSETS = { - {-0.98, 0.2, -0.945}, - {-0.525, 0.2, -0.945}, - {-0.07, 0.2, -0.945}, - {0.39, 0.2, -0.945}, - {0.84, 0.2, -0.945}, -} --- draw deck and discard zone -DECK_POSITION = { x=-1.4, y=0, z=0.3 } -DECK_ZONE_SCALE = { x=3, y=5, z=8 } -DRAW_DECK_POSITION = { x=-55, y=2.5, z=-22.7 } - --- play zone -PLAYER_COLOR = "Orange" -PLAY_ZONE_POSITION = { x=-55, y=4, z=-17 } -PLAY_ZONE_ROTATION = { x=0, y=270, z=0 } -PLAY_ZONE_SCALE = { x=30, y=5, z=15 } - -RESOURCE_COUNTER_GUID = "816d84" - --- the position of the global discard pile --- TODO: delegate to global for any auto discard actions -DISCARD_POSITION = {-3.85, 3, 10.38} - -function log(message) - if DEBUG then - print(message) - end -end - --- builds a function that discards things in searchPostion to discardPostition -function makeDiscardHandlerFor(searchPosition, discardPosition) - return function (_) - local discardItemList = findObjectsAtPosition(searchPosition) - for _, obj in ipairs(discardItemList) do - obj.setPositionSmooth(discardPosition, false, true) - obj.setRotation({0, -90, 0}) - end - end -end - --- build a discard button at position to discard from searchPosition to discardPosition --- number must be unique -function makeDiscardButton(position, searchPosition, discardPosition, number) - local handler = makeDiscardHandlerFor(searchPosition, discardPosition) - local handlerName = 'handler' .. number - self.setVar(handlerName, handler) - self.createButton({ - label = "Discard", - click_function= handlerName, - function_owner= self, - position = position, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180, - }) -end - -function onload(save_state) - self.interactable = DEBUG - DATA_HELPER = getObjectFromGUID('708279') - PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') - PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') - - -- positions of encounter card slots - local encounterSlots = { - {1, 0, -0.7}, - {0.55, 0, -0.7}, - {0.1, 0, -0.7}, - {-0.35, 0, -0.7}, - {-0.8, 0, -0.7} - } - - local i = 1 - while i <= 5 do - makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) - i = i + 1 - end - - self.createButton({ - label = " ", - click_function = "drawEncountercard", - function_owner = self, - position = {-1.45,0,-0.7}, - rotation = {0,-15,0}, - width = 170, - height = 255, - font_size = 50 - }) - - self.createButton({ - label=" ", - click_function = "drawChaostokenButton", - function_owner = self, - position = {1.48,0.0,-0.74}, - rotation = {0,-45,0}, - width = 125, - height = 125, - font_size = 50 - }) - - self.createButton({ - label="Upkeep", - click_function = "doUpkeep", - function_owner = self, - position = {1.48,0.1,-0.4}, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180 - }) - - local state = JSON.decode(save_state) - if state ~= nil and state.zoneID ~= nil then - zoneID = state.zoneID - Wait.time(checkDeckZoneExists, 30) - else - spawnDeckZone() - end - - COLLISION_ENABLED = true -end - -function onSave() - return JSON.encode({ zoneID=zoneID }) -end - -function doUpkeep(obj, color, alt_click) - -- right-click binds to new player color - if alt_click then - PLAYER_COLOR = color - printToColor("Upkeep button bound to " .. color, color) - return - end - - -- unexhaust cards in play zone - local objs = Physics.cast({ - origin = PLAY_ZONE_POSITION, - direction = { x=0, y=1, z=0 }, - type = 3, - size = PLAY_ZONE_SCALE, - orientation = PLAY_ZONE_ROTATION - }) - - local y = PLAY_ZONE_ROTATION.y - - local investigator = nil - for i,v in ipairs(objs) do - local obj = v.hit_object - local props = obj.getCustomObject() - if obj.tag == "Card" and not obj.is_face_down then - if props ~= nil and props.unique_back then - local name = obj.getName() - if string.match(name, "Jenny Barnes") ~= nil then - investigator = "Jenny Barnes" - elseif name == "Patrice Hathaway" then - investigator = name - end - else - local r = obj.getRotation() - if (r.y - y > 10) or (y - r.y > 10) then - obj.setRotationSmooth(PLAY_ZONE_ROTATION) - end - end - elseif obj.tag == "Board" and obj.getDescription() == "Action token" then - if obj.is_face_down then obj.flip() end - end - end - - -- gain resource - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - if investigator == "Jenny Barnes" then - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) - end - - -- draw card (shuffle discard if necessary) - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - drawDeck = nil - discardPile = nil - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Deck" or object.tag == "Card" then - if object.is_face_down then - drawDeck = object - else - discardPile = object - end - end - end - - if investigator == "Patrice Hathaway" then - patriceDraw() - return - end - - if drawDeck == nil then - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(1), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) - else - drawCards(1) - end -end - -function drawCards(numCards) - if drawDeck == nil then return end - drawDeck.deal(numCards, PLAYER_COLOR) -end - -function shuffleDiscardIntoDeck() - discardPile.flip() - discardPile.shuffle() - discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) - drawDeck = discardPile - discardPile = nil -end - -function patriceDraw() - local handSize = #Player[PLAYER_COLOR].getHandObjects() - if handSize >= 5 then return end - local cardsToDraw = 5 - handSize - local deckSize - printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) - if drawDeck == nil then - deckSize = 0 - elseif drawDeck.tag == "Deck" then - deckSize = #drawDeck.getObjects() - else - deckSize = 1 - end - - if deckSize >= cardsToDraw then - drawCards(cardsToDraw) - return - end - - drawCards(deckSize) - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(cardsToDraw - deckSize), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) -end - -function checkDeckZoneExists() - if getObjectFromGUID(zoneID) ~= nil then return end - spawnDeckZone() -end - -function spawnDeckZone() - local pos = self.positionToWorld(DECK_POSITION) - local zoneProps = { - position = pos, - scale = DECK_ZONE_SCALE, - type = 'ScriptingTrigger', - callback = 'zoneCallback', - callback_owner = self, - rotation = self.getRotation() - } - spawnObject(zoneProps) -end - -function zoneCallback(zone) - zoneID = zone.getGUID() -end - -function findObjectsAtPosition(localPos) - local globalPos = self.positionToWorld(localPos) - local objList = Physics.cast({ - origin=globalPos, --Where the cast takes place - direction={0,1,0}, --Which direction it moves (up is shown) - type=2, --Type. 2 is "sphere" - size={2,2,2}, --How large that sphere is - max_distance=1, --How far it moves. Just a little bit - debug=false --If it displays the sphere when casting. - }) - local decksAndCards = {} - for _, obj in ipairs(objList) do - if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then - table.insert(decksAndCards, obj.hit_object) - end - end - return decksAndCards -end - -function spawnTokenOn(object, offsets, tokenType) - local tokenPosition = object.positionToWorld(offsets) - spawnToken(tokenPosition, tokenType) -end - --- spawn a group of tokens of the given type on the object -function spawnTokenGroup(object, tokenType, tokenCount) - local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] - if offsets == nil then - error("couldn't find offsets for " .. tokenCount .. ' tokens') - end - local i = 0 - while i < tokenCount do - local offset = offsets[i + 1] - spawnTokenOn(object, offset, tokenType) - i = i + 1 - end -end - -function buildPlayerCardKey(object) - return object.getName() .. ':' .. object.getDescription() -end - -function getPlayerCardData(object) - return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] -end - -function shouldSpawnTokens(object) - -- we assume we shouldn't spawn tokens if in doubt, this should - -- only ever happen on load and in that case prevents respawns - local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) - local canSpawn = getPlayerCardData(object) - return not spawned and canSpawn -end - -function markSpawned(object) - local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) - if not saved then - error('attempt to mark player card spawned before data loaded') - end -end - -function spawnTokensFor(object) - local data = getPlayerCardData(object) - if data == nil then - error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') - end - log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) - spawnTokenGroup(object, data['tokenType'], data['tokenCount']) - markSpawned(object) -end - -function resetSpawnState() - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Card" then - local guid = object.getGUID() - if guid ~= nil then unmarkSpawned(guid, true) end - elseif object.tag == "Deck" then - local cards = object.getObjects() - if (cards ~= nil) then - for i,v in ipairs(cards) do - if v.guid ~= nil then unmarkSpawned(v.guid) end - end - end - end - end -end - -function unmarkSpawned(guid, force) - if not force and getObjectFromGUID(guid) ~= nil then return end - DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) -end - -function onCollisionEnter(collision_info) - if not COLLISION_ENABLED then - return - end - - local object = collision_info.collision_object - Wait.time(resetSpawnState, 1) - -- anything to the left of this is legal to spawn - local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) - local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) - if boundaryLocalToCard.x > 0 then - log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) - return - end - if not object.is_face_down and shouldSpawnTokens(object) then - spawnTokensFor(object) - end -end - --- functions delegated to Global -function drawChaostokenButton(object, player, isRightClick) - -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) - Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) -end - -function drawEncountercard(object, player, isRightClick) -local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) -Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) -end - -function spawnToken(position, tokenType) - Global.call('spawnToken', {position, tokenType}) +-- set true to enable debug logging +DEBUG = false +-- we use this to turn off collision handling (for clue spawning) +-- until after load is complete (probably a better way to do this) +COLLISION_ENABLED = false +-- position offsets, adjust these to reposition things relative to mat [x,y,z] +DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} +DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} +DISCARD_BUTTON_OFFSETS = { + {-0.98, 0.2, -0.945}, + {-0.525, 0.2, -0.945}, + {-0.07, 0.2, -0.945}, + {0.39, 0.2, -0.945}, + {0.84, 0.2, -0.945}, +} +-- draw deck and discard zone +DECK_POSITION = { x=-1.4, y=0, z=0.3 } +DECK_ZONE_SCALE = { x=3, y=5, z=8 } +DRAW_DECK_POSITION = { x=-55, y=2.5, z=-22.7 } + +-- play zone +PLAYER_COLOR = "Orange" +PLAY_ZONE_POSITION = { x=-55, y=4, z=-17 } +PLAY_ZONE_ROTATION = { x=0, y=270, z=0 } +PLAY_ZONE_SCALE = { x=30, y=5, z=15 } + +RESOURCE_COUNTER_GUID = "816d84" + +-- the position of the global discard pile +-- TODO: delegate to global for any auto discard actions +DISCARD_POSITION = {-3.85, 3, 10.38} + +function log(message) + if DEBUG then + print(message) + end +end + +-- builds a function that discards things in searchPostion to discardPostition +function makeDiscardHandlerFor(searchPosition, discardPosition) + return function (_) + local discardItemList = findObjectsAtPosition(searchPosition) + for _, obj in ipairs(discardItemList) do + obj.setPositionSmooth(discardPosition, false, true) + obj.setRotation({0, -90, 0}) + end + end +end + +-- build a discard button at position to discard from searchPosition to discardPosition +-- number must be unique +function makeDiscardButton(position, searchPosition, discardPosition, number) + local handler = makeDiscardHandlerFor(searchPosition, discardPosition) + local handlerName = 'handler' .. number + self.setVar(handlerName, handler) + self.createButton({ + label = "Discard", + click_function= handlerName, + function_owner= self, + position = position, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180, + }) +end + +function onload(save_state) + self.interactable = DEBUG + DATA_HELPER = getObjectFromGUID('708279') + PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') + PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') + + -- positions of encounter card slots + local encounterSlots = { + {1, 0, -0.7}, + {0.55, 0, -0.7}, + {0.1, 0, -0.7}, + {-0.35, 0, -0.7}, + {-0.8, 0, -0.7} + } + + local i = 1 + while i <= 5 do + makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) + i = i + 1 + end + + self.createButton({ + label = " ", + click_function = "drawEncountercard", + function_owner = self, + position = {-1.45,0,-0.7}, + rotation = {0,-15,0}, + width = 170, + height = 255, + font_size = 50 + }) + + self.createButton({ + label=" ", + click_function = "drawChaostokenButton", + function_owner = self, + position = {1.48,0.0,-0.74}, + rotation = {0,-45,0}, + width = 125, + height = 125, + font_size = 50 + }) + + self.createButton({ + label="Upkeep", + click_function = "doUpkeep", + function_owner = self, + position = {1.48,0.1,-0.4}, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180 + }) + + local state = JSON.decode(save_state) + if state ~= nil and state.zoneID ~= nil then + zoneID = state.zoneID + Wait.time(checkDeckZoneExists, 30) + else + spawnDeckZone() + end + + COLLISION_ENABLED = true +end + +function onSave() + return JSON.encode({ zoneID=zoneID }) +end + +function doUpkeep(obj, color, alt_click) + -- right-click binds to new player color + if alt_click then + PLAYER_COLOR = color + printToColor("Upkeep button bound to " .. color, color) + return + end + + -- unexhaust cards in play zone + local objs = Physics.cast({ + origin = PLAY_ZONE_POSITION, + direction = { x=0, y=1, z=0 }, + type = 3, + size = PLAY_ZONE_SCALE, + orientation = PLAY_ZONE_ROTATION + }) + + local y = PLAY_ZONE_ROTATION.y + + local investigator = nil + for i,v in ipairs(objs) do + local obj = v.hit_object + local props = obj.getCustomObject() + if obj.tag == "Card" and not obj.is_face_down then + if props ~= nil and props.unique_back then + local name = obj.getName() + if string.match(name, "Jenny Barnes") ~= nil then + investigator = "Jenny Barnes" + elseif name == "Patrice Hathaway" then + investigator = name + end + else + local r = obj.getRotation() + if (r.y - y > 10) or (y - r.y > 10) then + obj.setRotationSmooth(PLAY_ZONE_ROTATION) + end + end + elseif obj.tag == "Board" and obj.getDescription() == "Action token" then + if obj.is_face_down then obj.flip() end + end + end + + -- gain resource + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + if investigator == "Jenny Barnes" then + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) + end + + -- draw card (shuffle discard if necessary) + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + drawDeck = nil + discardPile = nil + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Deck" or object.tag == "Card" then + if object.is_face_down then + drawDeck = object + else + discardPile = object + end + end + end + + if investigator == "Patrice Hathaway" then + patriceDraw() + return + end + + if drawDeck == nil then + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(1), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) + else + drawCards(1) + end +end + +function drawCards(numCards) + if drawDeck == nil then return end + drawDeck.deal(numCards, PLAYER_COLOR) +end + +function shuffleDiscardIntoDeck() + discardPile.flip() + discardPile.shuffle() + discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) + drawDeck = discardPile + discardPile = nil +end + +function patriceDraw() + local handSize = #Player[PLAYER_COLOR].getHandObjects() + if handSize >= 5 then return end + local cardsToDraw = 5 - handSize + local deckSize + printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) + if drawDeck == nil then + deckSize = 0 + elseif drawDeck.tag == "Deck" then + deckSize = #drawDeck.getObjects() + else + deckSize = 1 + end + + if deckSize >= cardsToDraw then + drawCards(cardsToDraw) + return + end + + drawCards(deckSize) + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(cardsToDraw - deckSize), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) +end + +function checkDeckZoneExists() + if getObjectFromGUID(zoneID) ~= nil then return end + spawnDeckZone() +end + +function spawnDeckZone() + local pos = self.positionToWorld(DECK_POSITION) + local zoneProps = { + position = pos, + scale = DECK_ZONE_SCALE, + type = 'ScriptingTrigger', + callback = 'zoneCallback', + callback_owner = self, + rotation = self.getRotation() + } + spawnObject(zoneProps) +end + +function zoneCallback(zone) + zoneID = zone.getGUID() +end + +function findObjectsAtPosition(localPos) + local globalPos = self.positionToWorld(localPos) + local objList = Physics.cast({ + origin=globalPos, --Where the cast takes place + direction={0,1,0}, --Which direction it moves (up is shown) + type=2, --Type. 2 is "sphere" + size={2,2,2}, --How large that sphere is + max_distance=1, --How far it moves. Just a little bit + debug=false --If it displays the sphere when casting. + }) + local decksAndCards = {} + for _, obj in ipairs(objList) do + if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then + table.insert(decksAndCards, obj.hit_object) + end + end + return decksAndCards +end + +function spawnTokenOn(object, offsets, tokenType) + local tokenPosition = object.positionToWorld(offsets) + spawnToken(tokenPosition, tokenType) +end + +-- spawn a group of tokens of the given type on the object +function spawnTokenGroup(object, tokenType, tokenCount) + local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] + if offsets == nil then + error("couldn't find offsets for " .. tokenCount .. ' tokens') + end + local i = 0 + while i < tokenCount do + local offset = offsets[i + 1] + spawnTokenOn(object, offset, tokenType) + i = i + 1 + end +end + +function buildPlayerCardKey(object) + return object.getName() .. ':' .. object.getDescription() +end + +function getPlayerCardData(object) + return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] +end + +function shouldSpawnTokens(object) + -- we assume we shouldn't spawn tokens if in doubt, this should + -- only ever happen on load and in that case prevents respawns + local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) + local canSpawn = getPlayerCardData(object) + return not spawned and canSpawn +end + +function markSpawned(object) + local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) + if not saved then + error('attempt to mark player card spawned before data loaded') + end +end + +function spawnTokensFor(object) + local data = getPlayerCardData(object) + if data == nil then + error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') + end + log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) + spawnTokenGroup(object, data['tokenType'], data['tokenCount']) + markSpawned(object) +end + +function resetSpawnState() + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Card" then + local guid = object.getGUID() + if guid ~= nil then unmarkSpawned(guid, true) end + elseif object.tag == "Deck" then + local cards = object.getObjects() + if (cards ~= nil) then + for i,v in ipairs(cards) do + if v.guid ~= nil then unmarkSpawned(v.guid) end + end + end + end + end +end + +function unmarkSpawned(guid, force) + if not force and getObjectFromGUID(guid) ~= nil then return end + DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) +end + +function onCollisionEnter(collision_info) + if not COLLISION_ENABLED then + return + end + + local object = collision_info.collision_object + Wait.time(resetSpawnState, 1) + -- anything to the left of this is legal to spawn + local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) + local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) + if boundaryLocalToCard.x > 0 then + log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) + return + end + if not object.is_face_down and shouldSpawnTokens(object) then + spawnTokensFor(object) + end +end + +-- functions delegated to Global +function drawChaostokenButton(object, player, isRightClick) + -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) + Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) +end + +function drawEncountercard(object, player, isRightClick) +local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) +Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) +end + +function spawnToken(position, tokenType) + Global.call('spawnToken', {position, tokenType}) end \ No newline at end of file diff --git a/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua b/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua index f0f52edf0..e49a0e18e 100644 --- a/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua +++ b/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua @@ -1,407 +1,407 @@ --- set true to enable debug logging -DEBUG = false --- we use this to turn off collision handling (for clue spawning) --- until after load is complete (probably a better way to do this) -COLLISION_ENABLED = false --- position offsets, adjust these to reposition things relative to mat [x,y,z] -DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} -DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} -DISCARD_BUTTON_OFFSETS = { - {-0.98, 0.2, -0.945}, - {-0.525, 0.2, -0.945}, - {-0.07, 0.2, -0.945}, - {0.39, 0.2, -0.945}, - {0.84, 0.2, -0.945}, -} --- draw deck and discard zone -DECK_POSITION = { x=-1.4, y=0, z=0.3 } -DECK_ZONE_SCALE = { x=3, y=5, z=8 } -DRAW_DECK_POSITION = { x=-37, y=2.5, z=26.5 } - --- play zone -PLAYER_COLOR = "Green" -PLAY_ZONE_POSITION = { x=-25, y=4, z=27 } -PLAY_ZONE_ROTATION = { x=0, y=0, z=0 } -PLAY_ZONE_SCALE = { x=30, y=5, z=15 } - -RESOURCE_COUNTER_GUID = "cd15ac" - --- the position of the global discard pile --- TODO: delegate to global for any auto discard actions -DISCARD_POSITION = {-3.85, 3, 10.38} - -function log(message) - if DEBUG then - print(message) - end -end - --- builds a function that discards things in searchPostion to discardPostition -function makeDiscardHandlerFor(searchPosition, discardPosition) - return function (_) - local discardItemList = findObjectsAtPosition(searchPosition) - for _, obj in ipairs(discardItemList) do - obj.setPositionSmooth(discardPosition, false, true) - obj.setRotation({0, -90, 0}) - end - end -end - --- build a discard button at position to discard from searchPosition to discardPosition --- number must be unique -function makeDiscardButton(position, searchPosition, discardPosition, number) - local handler = makeDiscardHandlerFor(searchPosition, discardPosition) - local handlerName = 'handler' .. number - self.setVar(handlerName, handler) - self.createButton({ - label = "Discard", - click_function= handlerName, - function_owner= self, - position = position, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180, - }) -end - -function onload(save_state) - self.interactable = DEBUG - DATA_HELPER = getObjectFromGUID('708279') - PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') - PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') - - -- positions of encounter card slots - local encounterSlots = { - {1, 0, -0.7}, - {0.55, 0, -0.7}, - {0.1, 0, -0.7}, - {-0.35, 0, -0.7}, - {-0.8, 0, -0.7} - } - - local i = 1 - while i <= 5 do - makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) - i = i + 1 - end - - self.createButton({ - label = " ", - click_function = "drawEncountercard", - function_owner = self, - position = {-1.45,0,-0.7}, - rotation = {0,-15,0}, - width = 170, - height = 255, - font_size = 50 - }) - - self.createButton({ - label=" ", - click_function = "drawChaostokenButton", - function_owner = self, - position = {1.48,0.0,-0.74}, - rotation = {0,-45,0}, - width = 125, - height = 125, - font_size = 50 - }) - - self.createButton({ - label="Upkeep", - click_function = "doUpkeep", - function_owner = self, - position = {1.48,0.1,-0.4}, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180 - }) - - local state = JSON.decode(save_state) - if state ~= nil and state.zoneID ~= nil then - zoneID = state.zoneID - Wait.time(checkDeckZoneExists, 30) - else - spawnDeckZone() - end - - COLLISION_ENABLED = true -end - -function onSave() - return JSON.encode({ zoneID=zoneID }) -end - -function doUpkeep(obj, color, alt_click) - -- right-click binds to new player color - if alt_click then - PLAYER_COLOR = color - printToColor("Upkeep button bound to " .. color, color) - return - end - - -- unexhaust cards in play zone - local objs = Physics.cast({ - origin = PLAY_ZONE_POSITION, - direction = { x=0, y=1, z=0 }, - type = 3, - size = PLAY_ZONE_SCALE, - orientation = PLAY_ZONE_ROTATION - }) - - local y = PLAY_ZONE_ROTATION.y - - local investigator = nil - for i,v in ipairs(objs) do - local obj = v.hit_object - local props = obj.getCustomObject() - if obj.tag == "Card" and not obj.is_face_down then - if props ~= nil and props.unique_back then - local name = obj.getName() - if string.match(name, "Jenny Barnes") ~= nil then - investigator = "Jenny Barnes" - elseif name == "Patrice Hathaway" then - investigator = name - end - else - local r = obj.getRotation() - if (r.y - y > 10) or (y - r.y > 10) then - obj.setRotationSmooth(PLAY_ZONE_ROTATION) - end - end - elseif obj.tag == "Board" and obj.getDescription() == "Action token" then - if obj.is_face_down then obj.flip() end - end - end - - -- gain resource - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - if investigator == "Jenny Barnes" then - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) - end - - -- draw card (shuffle discard if necessary) - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - drawDeck = nil - discardPile = nil - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Deck" or object.tag == "Card" then - if object.is_face_down then - drawDeck = object - else - discardPile = object - end - end - end - - if investigator == "Patrice Hathaway" then - patriceDraw() - return - end - - if drawDeck == nil then - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(1), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) - else - drawCards(1) - end -end - -function drawCards(numCards) - if drawDeck == nil then return end - drawDeck.deal(numCards, PLAYER_COLOR) -end - -function shuffleDiscardIntoDeck() - discardPile.flip() - discardPile.shuffle() - discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) - drawDeck = discardPile - discardPile = nil -end - -function patriceDraw() - local handSize = #Player[PLAYER_COLOR].getHandObjects() - if handSize >= 5 then return end - local cardsToDraw = 5 - handSize - local deckSize - printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) - if drawDeck == nil then - deckSize = 0 - elseif drawDeck.tag == "Deck" then - deckSize = #drawDeck.getObjects() - else - deckSize = 1 - end - - if deckSize >= cardsToDraw then - drawCards(cardsToDraw) - return - end - - drawCards(deckSize) - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(cardsToDraw - deckSize), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) -end - -function checkDeckZoneExists() - if getObjectFromGUID(zoneID) ~= nil then return end - spawnDeckZone() -end - -function spawnDeckZone() - local pos = self.positionToWorld(DECK_POSITION) - local zoneProps = { - position = pos, - scale = DECK_ZONE_SCALE, - type = 'ScriptingTrigger', - callback = 'zoneCallback', - callback_owner = self, - rotation = self.getRotation() - } - spawnObject(zoneProps) -end - -function zoneCallback(zone) - zoneID = zone.getGUID() -end - -function findObjectsAtPosition(localPos) - local globalPos = self.positionToWorld(localPos) - local objList = Physics.cast({ - origin=globalPos, --Where the cast takes place - direction={0,1,0}, --Which direction it moves (up is shown) - type=2, --Type. 2 is "sphere" - size={2,2,2}, --How large that sphere is - max_distance=1, --How far it moves. Just a little bit - debug=false --If it displays the sphere when casting. - }) - local decksAndCards = {} - for _, obj in ipairs(objList) do - if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then - table.insert(decksAndCards, obj.hit_object) - end - end - return decksAndCards -end - -function spawnTokenOn(object, offsets, tokenType) - local tokenPosition = object.positionToWorld(offsets) - spawnToken(tokenPosition, tokenType) -end - --- spawn a group of tokens of the given type on the object -function spawnTokenGroup(object, tokenType, tokenCount) - local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] - if offsets == nil then - error("couldn't find offsets for " .. tokenCount .. ' tokens') - end - local i = 0 - while i < tokenCount do - local offset = offsets[i + 1] - spawnTokenOn(object, offset, tokenType) - i = i + 1 - end -end - -function buildPlayerCardKey(object) - return object.getName() .. ':' .. object.getDescription() -end - -function getPlayerCardData(object) - return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] -end - -function shouldSpawnTokens(object) - -- we assume we shouldn't spawn tokens if in doubt, this should - -- only ever happen on load and in that case prevents respawns - local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) - local canSpawn = getPlayerCardData(object) - return not spawned and canSpawn -end - -function markSpawned(object) - local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) - if not saved then - error('attempt to mark player card spawned before data loaded') - end -end - -function spawnTokensFor(object) - local data = getPlayerCardData(object) - if data == nil then - error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') - end - log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) - spawnTokenGroup(object, data['tokenType'], data['tokenCount']) - markSpawned(object) -end - -function resetSpawnState() - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Card" then - local guid = object.getGUID() - if guid ~= nil then unmarkSpawned(guid, true) end - elseif object.tag == "Deck" then - local cards = object.getObjects() - if (cards ~= nil) then - for i,v in ipairs(cards) do - if v.guid ~= nil then unmarkSpawned(v.guid) end - end - end - end - end -end - -function unmarkSpawned(guid, force) - if not force and getObjectFromGUID(guid) ~= nil then return end - DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) -end - -function onCollisionEnter(collision_info) - if not COLLISION_ENABLED then - return - end - - local object = collision_info.collision_object - Wait.time(resetSpawnState, 1) - -- anything to the left of this is legal to spawn - local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) - local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) - if boundaryLocalToCard.x > 0 then - log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) - return - end - if not object.is_face_down and shouldSpawnTokens(object) then - spawnTokensFor(object) - end -end - --- functions delegated to Global -function drawChaostokenButton(object, player, isRightClick) - -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) - Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) -end - -function drawEncountercard(object, player, isRightClick) -local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) -Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) -end - -function spawnToken(position, tokenType) - Global.call('spawnToken', {position, tokenType}) +-- set true to enable debug logging +DEBUG = false +-- we use this to turn off collision handling (for clue spawning) +-- until after load is complete (probably a better way to do this) +COLLISION_ENABLED = false +-- position offsets, adjust these to reposition things relative to mat [x,y,z] +DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} +DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} +DISCARD_BUTTON_OFFSETS = { + {-0.98, 0.2, -0.945}, + {-0.525, 0.2, -0.945}, + {-0.07, 0.2, -0.945}, + {0.39, 0.2, -0.945}, + {0.84, 0.2, -0.945}, +} +-- draw deck and discard zone +DECK_POSITION = { x=-1.4, y=0, z=0.3 } +DECK_ZONE_SCALE = { x=3, y=5, z=8 } +DRAW_DECK_POSITION = { x=-37, y=2.5, z=26.5 } + +-- play zone +PLAYER_COLOR = "Green" +PLAY_ZONE_POSITION = { x=-25, y=4, z=27 } +PLAY_ZONE_ROTATION = { x=0, y=0, z=0 } +PLAY_ZONE_SCALE = { x=30, y=5, z=15 } + +RESOURCE_COUNTER_GUID = "cd15ac" + +-- the position of the global discard pile +-- TODO: delegate to global for any auto discard actions +DISCARD_POSITION = {-3.85, 3, 10.38} + +function log(message) + if DEBUG then + print(message) + end +end + +-- builds a function that discards things in searchPostion to discardPostition +function makeDiscardHandlerFor(searchPosition, discardPosition) + return function (_) + local discardItemList = findObjectsAtPosition(searchPosition) + for _, obj in ipairs(discardItemList) do + obj.setPositionSmooth(discardPosition, false, true) + obj.setRotation({0, -90, 0}) + end + end +end + +-- build a discard button at position to discard from searchPosition to discardPosition +-- number must be unique +function makeDiscardButton(position, searchPosition, discardPosition, number) + local handler = makeDiscardHandlerFor(searchPosition, discardPosition) + local handlerName = 'handler' .. number + self.setVar(handlerName, handler) + self.createButton({ + label = "Discard", + click_function= handlerName, + function_owner= self, + position = position, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180, + }) +end + +function onload(save_state) + self.interactable = DEBUG + DATA_HELPER = getObjectFromGUID('708279') + PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') + PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') + + -- positions of encounter card slots + local encounterSlots = { + {1, 0, -0.7}, + {0.55, 0, -0.7}, + {0.1, 0, -0.7}, + {-0.35, 0, -0.7}, + {-0.8, 0, -0.7} + } + + local i = 1 + while i <= 5 do + makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) + i = i + 1 + end + + self.createButton({ + label = " ", + click_function = "drawEncountercard", + function_owner = self, + position = {-1.45,0,-0.7}, + rotation = {0,-15,0}, + width = 170, + height = 255, + font_size = 50 + }) + + self.createButton({ + label=" ", + click_function = "drawChaostokenButton", + function_owner = self, + position = {1.48,0.0,-0.74}, + rotation = {0,-45,0}, + width = 125, + height = 125, + font_size = 50 + }) + + self.createButton({ + label="Upkeep", + click_function = "doUpkeep", + function_owner = self, + position = {1.48,0.1,-0.4}, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180 + }) + + local state = JSON.decode(save_state) + if state ~= nil and state.zoneID ~= nil then + zoneID = state.zoneID + Wait.time(checkDeckZoneExists, 30) + else + spawnDeckZone() + end + + COLLISION_ENABLED = true +end + +function onSave() + return JSON.encode({ zoneID=zoneID }) +end + +function doUpkeep(obj, color, alt_click) + -- right-click binds to new player color + if alt_click then + PLAYER_COLOR = color + printToColor("Upkeep button bound to " .. color, color) + return + end + + -- unexhaust cards in play zone + local objs = Physics.cast({ + origin = PLAY_ZONE_POSITION, + direction = { x=0, y=1, z=0 }, + type = 3, + size = PLAY_ZONE_SCALE, + orientation = PLAY_ZONE_ROTATION + }) + + local y = PLAY_ZONE_ROTATION.y + + local investigator = nil + for i,v in ipairs(objs) do + local obj = v.hit_object + local props = obj.getCustomObject() + if obj.tag == "Card" and not obj.is_face_down then + if props ~= nil and props.unique_back then + local name = obj.getName() + if string.match(name, "Jenny Barnes") ~= nil then + investigator = "Jenny Barnes" + elseif name == "Patrice Hathaway" then + investigator = name + end + else + local r = obj.getRotation() + if (r.y - y > 10) or (y - r.y > 10) then + obj.setRotationSmooth(PLAY_ZONE_ROTATION) + end + end + elseif obj.tag == "Board" and obj.getDescription() == "Action token" then + if obj.is_face_down then obj.flip() end + end + end + + -- gain resource + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + if investigator == "Jenny Barnes" then + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) + end + + -- draw card (shuffle discard if necessary) + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + drawDeck = nil + discardPile = nil + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Deck" or object.tag == "Card" then + if object.is_face_down then + drawDeck = object + else + discardPile = object + end + end + end + + if investigator == "Patrice Hathaway" then + patriceDraw() + return + end + + if drawDeck == nil then + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(1), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) + else + drawCards(1) + end +end + +function drawCards(numCards) + if drawDeck == nil then return end + drawDeck.deal(numCards, PLAYER_COLOR) +end + +function shuffleDiscardIntoDeck() + discardPile.flip() + discardPile.shuffle() + discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) + drawDeck = discardPile + discardPile = nil +end + +function patriceDraw() + local handSize = #Player[PLAYER_COLOR].getHandObjects() + if handSize >= 5 then return end + local cardsToDraw = 5 - handSize + local deckSize + printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) + if drawDeck == nil then + deckSize = 0 + elseif drawDeck.tag == "Deck" then + deckSize = #drawDeck.getObjects() + else + deckSize = 1 + end + + if deckSize >= cardsToDraw then + drawCards(cardsToDraw) + return + end + + drawCards(deckSize) + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(cardsToDraw - deckSize), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) +end + +function checkDeckZoneExists() + if getObjectFromGUID(zoneID) ~= nil then return end + spawnDeckZone() +end + +function spawnDeckZone() + local pos = self.positionToWorld(DECK_POSITION) + local zoneProps = { + position = pos, + scale = DECK_ZONE_SCALE, + type = 'ScriptingTrigger', + callback = 'zoneCallback', + callback_owner = self, + rotation = self.getRotation() + } + spawnObject(zoneProps) +end + +function zoneCallback(zone) + zoneID = zone.getGUID() +end + +function findObjectsAtPosition(localPos) + local globalPos = self.positionToWorld(localPos) + local objList = Physics.cast({ + origin=globalPos, --Where the cast takes place + direction={0,1,0}, --Which direction it moves (up is shown) + type=2, --Type. 2 is "sphere" + size={2,2,2}, --How large that sphere is + max_distance=1, --How far it moves. Just a little bit + debug=false --If it displays the sphere when casting. + }) + local decksAndCards = {} + for _, obj in ipairs(objList) do + if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then + table.insert(decksAndCards, obj.hit_object) + end + end + return decksAndCards +end + +function spawnTokenOn(object, offsets, tokenType) + local tokenPosition = object.positionToWorld(offsets) + spawnToken(tokenPosition, tokenType) +end + +-- spawn a group of tokens of the given type on the object +function spawnTokenGroup(object, tokenType, tokenCount) + local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] + if offsets == nil then + error("couldn't find offsets for " .. tokenCount .. ' tokens') + end + local i = 0 + while i < tokenCount do + local offset = offsets[i + 1] + spawnTokenOn(object, offset, tokenType) + i = i + 1 + end +end + +function buildPlayerCardKey(object) + return object.getName() .. ':' .. object.getDescription() +end + +function getPlayerCardData(object) + return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] +end + +function shouldSpawnTokens(object) + -- we assume we shouldn't spawn tokens if in doubt, this should + -- only ever happen on load and in that case prevents respawns + local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) + local canSpawn = getPlayerCardData(object) + return not spawned and canSpawn +end + +function markSpawned(object) + local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) + if not saved then + error('attempt to mark player card spawned before data loaded') + end +end + +function spawnTokensFor(object) + local data = getPlayerCardData(object) + if data == nil then + error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') + end + log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) + spawnTokenGroup(object, data['tokenType'], data['tokenCount']) + markSpawned(object) +end + +function resetSpawnState() + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Card" then + local guid = object.getGUID() + if guid ~= nil then unmarkSpawned(guid, true) end + elseif object.tag == "Deck" then + local cards = object.getObjects() + if (cards ~= nil) then + for i,v in ipairs(cards) do + if v.guid ~= nil then unmarkSpawned(v.guid) end + end + end + end + end +end + +function unmarkSpawned(guid, force) + if not force and getObjectFromGUID(guid) ~= nil then return end + DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) +end + +function onCollisionEnter(collision_info) + if not COLLISION_ENABLED then + return + end + + local object = collision_info.collision_object + Wait.time(resetSpawnState, 1) + -- anything to the left of this is legal to spawn + local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) + local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) + if boundaryLocalToCard.x > 0 then + log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) + return + end + if not object.is_face_down and shouldSpawnTokens(object) then + spawnTokensFor(object) + end +end + +-- functions delegated to Global +function drawChaostokenButton(object, player, isRightClick) + -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) + Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) +end + +function drawEncountercard(object, player, isRightClick) +local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) +Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) +end + +function spawnToken(position, tokenType) + Global.call('spawnToken', {position, tokenType}) end \ No newline at end of file diff --git a/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua b/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua index cddb3d0b4..3df1a762a 100644 --- a/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua +++ b/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua @@ -1,407 +1,407 @@ --- set true to enable debug logging -DEBUG = false --- we use this to turn off collision handling (for clue spawning) --- until after load is complete (probably a better way to do this) -COLLISION_ENABLED = false --- position offsets, adjust these to reposition things relative to mat [x,y,z] -DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} -DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} -DISCARD_BUTTON_OFFSETS = { - {-0.98, 0.2, -0.945}, - {-0.525, 0.2, -0.945}, - {-0.07, 0.2, -0.945}, - {0.39, 0.2, -0.945}, - {0.84, 0.2, -0.945}, -} --- draw deck and discard zone -DECK_POSITION = { x=-1.4, y=0, z=0.3 } -DECK_ZONE_SCALE = { x=3, y=5, z=8 } -DRAW_DECK_POSITION = { x=-18.9, y=2.5, z=-26.7 } - --- play zone -PLAYER_COLOR = "Red" -PLAY_ZONE_POSITION = { x=-25, y=4, z=-27 } -PLAY_ZONE_ROTATION = { x=0, y=180, z=0 } -PLAY_ZONE_SCALE = { x=30, y=5, z=15 } - -RESOURCE_COUNTER_GUID = "a4b60d" - --- the position of the global discard pile --- TODO: delegate to global for any auto discard actions -DISCARD_POSITION = {-3.85, 3, 10.38} - -function log(message) - if DEBUG then - print(message) - end -end - --- builds a function that discards things in searchPostion to discardPostition -function makeDiscardHandlerFor(searchPosition, discardPosition) - return function (_) - local discardItemList = findObjectsAtPosition(searchPosition) - for _, obj in ipairs(discardItemList) do - obj.setPositionSmooth(discardPosition, false, true) - obj.setRotation({0, -90, 0}) - end - end -end - --- build a discard button at position to discard from searchPosition to discardPosition --- number must be unique -function makeDiscardButton(position, searchPosition, discardPosition, number) - local handler = makeDiscardHandlerFor(searchPosition, discardPosition) - local handlerName = 'handler' .. number - self.setVar(handlerName, handler) - self.createButton({ - label = "Discard", - click_function= handlerName, - function_owner= self, - position = position, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180, - }) -end - -function onload(save_state) - self.interactable = DEBUG - DATA_HELPER = getObjectFromGUID('708279') - PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') - PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') - - -- positions of encounter card slots - local encounterSlots = { - {1, 0, -0.7}, - {0.55, 0, -0.7}, - {0.1, 0, -0.7}, - {-0.35, 0, -0.7}, - {-0.8, 0, -0.7} - } - - local i = 1 - while i <= 5 do - makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) - i = i + 1 - end - - self.createButton({ - label = " ", - click_function = "drawEncountercard", - function_owner = self, - position = {-1.45,0,-0.7}, - rotation = {0,-15,0}, - width = 170, - height = 255, - font_size = 50 - }) - - self.createButton({ - label=" ", - click_function = "drawChaostokenButton", - function_owner = self, - position = {1.48,0.0,-0.74}, - rotation = {0,-45,0}, - width = 125, - height = 125, - font_size = 50 - }) - - self.createButton({ - label="Upkeep", - click_function = "doUpkeep", - function_owner = self, - position = {1.48,0.1,-0.4}, - scale = {0.12, 0.12, 0.12}, - width = 800, - height = 280, - font_size = 180 - }) - - local state = JSON.decode(save_state) - if state ~= nil and state.zoneID ~= nil then - zoneID = state.zoneID - Wait.time(checkDeckZoneExists, 30) - else - spawnDeckZone() - end - - COLLISION_ENABLED = true -end - -function onSave() - return JSON.encode({ zoneID=zoneID }) -end - -function doUpkeep(obj, color, alt_click) - -- right-click binds to new player color - if alt_click then - PLAYER_COLOR = color - printToColor("Upkeep button bound to " .. color, color) - return - end - - -- unexhaust cards in play zone - local objs = Physics.cast({ - origin = PLAY_ZONE_POSITION, - direction = { x=0, y=1, z=0 }, - type = 3, - size = PLAY_ZONE_SCALE, - orientation = PLAY_ZONE_ROTATION - }) - - local y = PLAY_ZONE_ROTATION.y - - local investigator = nil - for i,v in ipairs(objs) do - local obj = v.hit_object - local props = obj.getCustomObject() - if obj.tag == "Card" and not obj.is_face_down then - if props ~= nil and props.unique_back then - local name = obj.getName() - if string.match(name, "Jenny Barnes") ~= nil then - investigator = "Jenny Barnes" - elseif name == "Patrice Hathaway" then - investigator = name - end - else - local r = obj.getRotation() - if (r.y - y > 10) or (y - r.y > 10) then - obj.setRotationSmooth(PLAY_ZONE_ROTATION) - end - end - elseif obj.tag == "Board" and obj.getDescription() == "Action token" then - if obj.is_face_down then obj.flip() end - end - end - - -- gain resource - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - if investigator == "Jenny Barnes" then - getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") - printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) - end - - -- draw card (shuffle discard if necessary) - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - drawDeck = nil - discardPile = nil - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Deck" or object.tag == "Card" then - if object.is_face_down then - drawDeck = object - else - discardPile = object - end - end - end - - if investigator == "Patrice Hathaway" then - patriceDraw() - return - end - - if drawDeck == nil then - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(1), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) - else - drawCards(1) - end -end - -function drawCards(numCards) - if drawDeck == nil then return end - drawDeck.deal(numCards, PLAYER_COLOR) -end - -function shuffleDiscardIntoDeck() - discardPile.flip() - discardPile.shuffle() - discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) - drawDeck = discardPile - discardPile = nil -end - -function patriceDraw() - local handSize = #Player[PLAYER_COLOR].getHandObjects() - if handSize >= 5 then return end - local cardsToDraw = 5 - handSize - local deckSize - printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) - if drawDeck == nil then - deckSize = 0 - elseif drawDeck.tag == "Deck" then - deckSize = #drawDeck.getObjects() - else - deckSize = 1 - end - - if deckSize >= cardsToDraw then - drawCards(cardsToDraw) - return - end - - drawCards(deckSize) - if discardPile ~= nil then - shuffleDiscardIntoDeck() - Wait.time(|| drawCards(cardsToDraw - deckSize), 1) - end - printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) -end - -function checkDeckZoneExists() - if getObjectFromGUID(zoneID) ~= nil then return end - spawnDeckZone() -end - -function spawnDeckZone() - local pos = self.positionToWorld(DECK_POSITION) - local zoneProps = { - position = pos, - scale = DECK_ZONE_SCALE, - type = 'ScriptingTrigger', - callback = 'zoneCallback', - callback_owner = self, - rotation = self.getRotation() - } - spawnObject(zoneProps) -end - -function zoneCallback(zone) - zoneID = zone.getGUID() -end - -function findObjectsAtPosition(localPos) - local globalPos = self.positionToWorld(localPos) - local objList = Physics.cast({ - origin=globalPos, --Where the cast takes place - direction={0,1,0}, --Which direction it moves (up is shown) - type=2, --Type. 2 is "sphere" - size={2,2,2}, --How large that sphere is - max_distance=1, --How far it moves. Just a little bit - debug=false --If it displays the sphere when casting. - }) - local decksAndCards = {} - for _, obj in ipairs(objList) do - if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then - table.insert(decksAndCards, obj.hit_object) - end - end - return decksAndCards -end - -function spawnTokenOn(object, offsets, tokenType) - local tokenPosition = object.positionToWorld(offsets) - spawnToken(tokenPosition, tokenType) -end - --- spawn a group of tokens of the given type on the object -function spawnTokenGroup(object, tokenType, tokenCount) - local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] - if offsets == nil then - error("couldn't find offsets for " .. tokenCount .. ' tokens') - end - local i = 0 - while i < tokenCount do - local offset = offsets[i + 1] - spawnTokenOn(object, offset, tokenType) - i = i + 1 - end -end - -function buildPlayerCardKey(object) - return object.getName() .. ':' .. object.getDescription() -end - -function getPlayerCardData(object) - return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] -end - -function shouldSpawnTokens(object) - -- we assume we shouldn't spawn tokens if in doubt, this should - -- only ever happen on load and in that case prevents respawns - local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) - local canSpawn = getPlayerCardData(object) - return not spawned and canSpawn -end - -function markSpawned(object) - local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) - if not saved then - error('attempt to mark player card spawned before data loaded') - end -end - -function spawnTokensFor(object) - local data = getPlayerCardData(object) - if data == nil then - error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') - end - log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) - spawnTokenGroup(object, data['tokenType'], data['tokenCount']) - markSpawned(object) -end - -function resetSpawnState() - local zone = getObjectFromGUID(zoneID) - if zone == nil then return end - - for i,object in ipairs(zone.getObjects()) do - if object.tag == "Card" then - local guid = object.getGUID() - if guid ~= nil then unmarkSpawned(guid, true) end - elseif object.tag == "Deck" then - local cards = object.getObjects() - if (cards ~= nil) then - for i,v in ipairs(cards) do - if v.guid ~= nil then unmarkSpawned(v.guid) end - end - end - end - end -end - -function unmarkSpawned(guid, force) - if not force and getObjectFromGUID(guid) ~= nil then return end - DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) -end - -function onCollisionEnter(collision_info) - if not COLLISION_ENABLED then - return - end - - local object = collision_info.collision_object - Wait.time(resetSpawnState, 1) - -- anything to the left of this is legal to spawn - local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) - local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) - if boundaryLocalToCard.x > 0 then - log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) - return - end - if not object.is_face_down and shouldSpawnTokens(object) then - spawnTokensFor(object) - end -end - --- functions delegated to Global -function drawChaostokenButton(object, player, isRightClick) - -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) - Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) -end - -function drawEncountercard(object, player, isRightClick) -local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) -Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) -end - -function spawnToken(position, tokenType) - Global.call('spawnToken', {position, tokenType}) +-- set true to enable debug logging +DEBUG = false +-- we use this to turn off collision handling (for clue spawning) +-- until after load is complete (probably a better way to do this) +COLLISION_ENABLED = false +-- position offsets, adjust these to reposition things relative to mat [x,y,z] +DRAWN_ENCOUNTER_CARD_OFFSET = {0.98, 0.5, -0.635} +DRAWN_CHAOS_TOKEN_OFFSET = {-1.2, 0.5, -0.45} +DISCARD_BUTTON_OFFSETS = { + {-0.98, 0.2, -0.945}, + {-0.525, 0.2, -0.945}, + {-0.07, 0.2, -0.945}, + {0.39, 0.2, -0.945}, + {0.84, 0.2, -0.945}, +} +-- draw deck and discard zone +DECK_POSITION = { x=-1.4, y=0, z=0.3 } +DECK_ZONE_SCALE = { x=3, y=5, z=8 } +DRAW_DECK_POSITION = { x=-18.9, y=2.5, z=-26.7 } + +-- play zone +PLAYER_COLOR = "Red" +PLAY_ZONE_POSITION = { x=-25, y=4, z=-27 } +PLAY_ZONE_ROTATION = { x=0, y=180, z=0 } +PLAY_ZONE_SCALE = { x=30, y=5, z=15 } + +RESOURCE_COUNTER_GUID = "a4b60d" + +-- the position of the global discard pile +-- TODO: delegate to global for any auto discard actions +DISCARD_POSITION = {-3.85, 3, 10.38} + +function log(message) + if DEBUG then + print(message) + end +end + +-- builds a function that discards things in searchPostion to discardPostition +function makeDiscardHandlerFor(searchPosition, discardPosition) + return function (_) + local discardItemList = findObjectsAtPosition(searchPosition) + for _, obj in ipairs(discardItemList) do + obj.setPositionSmooth(discardPosition, false, true) + obj.setRotation({0, -90, 0}) + end + end +end + +-- build a discard button at position to discard from searchPosition to discardPosition +-- number must be unique +function makeDiscardButton(position, searchPosition, discardPosition, number) + local handler = makeDiscardHandlerFor(searchPosition, discardPosition) + local handlerName = 'handler' .. number + self.setVar(handlerName, handler) + self.createButton({ + label = "Discard", + click_function= handlerName, + function_owner= self, + position = position, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180, + }) +end + +function onload(save_state) + self.interactable = DEBUG + DATA_HELPER = getObjectFromGUID('708279') + PLAYER_CARDS = DATA_HELPER.getTable('PLAYER_CARD_DATA') + PLAYER_CARD_TOKEN_OFFSETS = DATA_HELPER.getTable('PLAYER_CARD_TOKEN_OFFSETS') + + -- positions of encounter card slots + local encounterSlots = { + {1, 0, -0.7}, + {0.55, 0, -0.7}, + {0.1, 0, -0.7}, + {-0.35, 0, -0.7}, + {-0.8, 0, -0.7} + } + + local i = 1 + while i <= 5 do + makeDiscardButton(DISCARD_BUTTON_OFFSETS[i], encounterSlots[i], DISCARD_POSITION, i) + i = i + 1 + end + + self.createButton({ + label = " ", + click_function = "drawEncountercard", + function_owner = self, + position = {-1.45,0,-0.7}, + rotation = {0,-15,0}, + width = 170, + height = 255, + font_size = 50 + }) + + self.createButton({ + label=" ", + click_function = "drawChaostokenButton", + function_owner = self, + position = {1.48,0.0,-0.74}, + rotation = {0,-45,0}, + width = 125, + height = 125, + font_size = 50 + }) + + self.createButton({ + label="Upkeep", + click_function = "doUpkeep", + function_owner = self, + position = {1.48,0.1,-0.4}, + scale = {0.12, 0.12, 0.12}, + width = 800, + height = 280, + font_size = 180 + }) + + local state = JSON.decode(save_state) + if state ~= nil and state.zoneID ~= nil then + zoneID = state.zoneID + Wait.time(checkDeckZoneExists, 30) + else + spawnDeckZone() + end + + COLLISION_ENABLED = true +end + +function onSave() + return JSON.encode({ zoneID=zoneID }) +end + +function doUpkeep(obj, color, alt_click) + -- right-click binds to new player color + if alt_click then + PLAYER_COLOR = color + printToColor("Upkeep button bound to " .. color, color) + return + end + + -- unexhaust cards in play zone + local objs = Physics.cast({ + origin = PLAY_ZONE_POSITION, + direction = { x=0, y=1, z=0 }, + type = 3, + size = PLAY_ZONE_SCALE, + orientation = PLAY_ZONE_ROTATION + }) + + local y = PLAY_ZONE_ROTATION.y + + local investigator = nil + for i,v in ipairs(objs) do + local obj = v.hit_object + local props = obj.getCustomObject() + if obj.tag == "Card" and not obj.is_face_down then + if props ~= nil and props.unique_back then + local name = obj.getName() + if string.match(name, "Jenny Barnes") ~= nil then + investigator = "Jenny Barnes" + elseif name == "Patrice Hathaway" then + investigator = name + end + else + local r = obj.getRotation() + if (r.y - y > 10) or (y - r.y > 10) then + obj.setRotationSmooth(PLAY_ZONE_ROTATION) + end + end + elseif obj.tag == "Board" and obj.getDescription() == "Action token" then + if obj.is_face_down then obj.flip() end + end + end + + -- gain resource + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + if investigator == "Jenny Barnes" then + getObjectFromGUID(RESOURCE_COUNTER_GUID).call("add_subtract") + printToColor("Taking 2 resources (Jenny)", PLAYER_COLOR) + end + + -- draw card (shuffle discard if necessary) + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + drawDeck = nil + discardPile = nil + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Deck" or object.tag == "Card" then + if object.is_face_down then + drawDeck = object + else + discardPile = object + end + end + end + + if investigator == "Patrice Hathaway" then + patriceDraw() + return + end + + if drawDeck == nil then + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(1), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) + else + drawCards(1) + end +end + +function drawCards(numCards) + if drawDeck == nil then return end + drawDeck.deal(numCards, PLAYER_COLOR) +end + +function shuffleDiscardIntoDeck() + discardPile.flip() + discardPile.shuffle() + discardPile.setPositionSmooth(DRAW_DECK_POSITION, false, false) + drawDeck = discardPile + discardPile = nil +end + +function patriceDraw() + local handSize = #Player[PLAYER_COLOR].getHandObjects() + if handSize >= 5 then return end + local cardsToDraw = 5 - handSize + local deckSize + printToColor("Drawing " .. cardsToDraw .. " cards (Patrice)", PLAYER_COLOR) + if drawDeck == nil then + deckSize = 0 + elseif drawDeck.tag == "Deck" then + deckSize = #drawDeck.getObjects() + else + deckSize = 1 + end + + if deckSize >= cardsToDraw then + drawCards(cardsToDraw) + return + end + + drawCards(deckSize) + if discardPile ~= nil then + shuffleDiscardIntoDeck() + Wait.time(|| drawCards(cardsToDraw - deckSize), 1) + end + printToColor("Take 1 horror (drawing card from empty deck)", PLAYER_COLOR) +end + +function checkDeckZoneExists() + if getObjectFromGUID(zoneID) ~= nil then return end + spawnDeckZone() +end + +function spawnDeckZone() + local pos = self.positionToWorld(DECK_POSITION) + local zoneProps = { + position = pos, + scale = DECK_ZONE_SCALE, + type = 'ScriptingTrigger', + callback = 'zoneCallback', + callback_owner = self, + rotation = self.getRotation() + } + spawnObject(zoneProps) +end + +function zoneCallback(zone) + zoneID = zone.getGUID() +end + +function findObjectsAtPosition(localPos) + local globalPos = self.positionToWorld(localPos) + local objList = Physics.cast({ + origin=globalPos, --Where the cast takes place + direction={0,1,0}, --Which direction it moves (up is shown) + type=2, --Type. 2 is "sphere" + size={2,2,2}, --How large that sphere is + max_distance=1, --How far it moves. Just a little bit + debug=false --If it displays the sphere when casting. + }) + local decksAndCards = {} + for _, obj in ipairs(objList) do + if obj.hit_object.tag == "Deck" or obj.hit_object.tag == "Card" then + table.insert(decksAndCards, obj.hit_object) + end + end + return decksAndCards +end + +function spawnTokenOn(object, offsets, tokenType) + local tokenPosition = object.positionToWorld(offsets) + spawnToken(tokenPosition, tokenType) +end + +-- spawn a group of tokens of the given type on the object +function spawnTokenGroup(object, tokenType, tokenCount) + local offsets = PLAYER_CARD_TOKEN_OFFSETS[tokenCount] + if offsets == nil then + error("couldn't find offsets for " .. tokenCount .. ' tokens') + end + local i = 0 + while i < tokenCount do + local offset = offsets[i + 1] + spawnTokenOn(object, offset, tokenType) + i = i + 1 + end +end + +function buildPlayerCardKey(object) + return object.getName() .. ':' .. object.getDescription() +end + +function getPlayerCardData(object) + return PLAYER_CARDS[buildPlayerCardKey(object)] or PLAYER_CARDS[object.getName()] +end + +function shouldSpawnTokens(object) + -- we assume we shouldn't spawn tokens if in doubt, this should + -- only ever happen on load and in that case prevents respawns + local spawned = DATA_HELPER.call('getSpawnedPlayerCardGuid', {object.getGUID()}) + local canSpawn = getPlayerCardData(object) + return not spawned and canSpawn +end + +function markSpawned(object) + local saved = DATA_HELPER.call('setSpawnedPlayerCardGuid', {object.getGUID(), true}) + if not saved then + error('attempt to mark player card spawned before data loaded') + end +end + +function spawnTokensFor(object) + local data = getPlayerCardData(object) + if data == nil then + error('attempt to spawn tokens for ' .. object.getName() .. ': no token data') + end + log(object.getName() .. '[' .. object.getDescription() .. ']' .. ' : ' .. data['tokenType'] .. ' : ' .. data['tokenCount']) + spawnTokenGroup(object, data['tokenType'], data['tokenCount']) + markSpawned(object) +end + +function resetSpawnState() + local zone = getObjectFromGUID(zoneID) + if zone == nil then return end + + for i,object in ipairs(zone.getObjects()) do + if object.tag == "Card" then + local guid = object.getGUID() + if guid ~= nil then unmarkSpawned(guid, true) end + elseif object.tag == "Deck" then + local cards = object.getObjects() + if (cards ~= nil) then + for i,v in ipairs(cards) do + if v.guid ~= nil then unmarkSpawned(v.guid) end + end + end + end + end +end + +function unmarkSpawned(guid, force) + if not force and getObjectFromGUID(guid) ~= nil then return end + DATA_HELPER.call('setSpawnedPlayerCardGuid', {guid, false}) +end + +function onCollisionEnter(collision_info) + if not COLLISION_ENABLED then + return + end + + local object = collision_info.collision_object + Wait.time(resetSpawnState, 1) + -- anything to the left of this is legal to spawn + local discardSpawnBoundary = self.positionToWorld({-1.2, 0, 0}) + local boundaryLocalToCard = object.positionToLocal(discardSpawnBoundary) + if boundaryLocalToCard.x > 0 then + log('not checking for token spawn, boundary relative is ' .. boundaryLocalToCard.x) + return + end + if not object.is_face_down and shouldSpawnTokens(object) then + spawnTokensFor(object) + end +end + +-- functions delegated to Global +function drawChaostokenButton(object, player, isRightClick) + -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) + Global.call("drawChaostoken", {self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick}) +end + +function drawEncountercard(object, player, isRightClick) +local toPosition = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) +Global.call("drawEncountercard", {toPosition, self.getRotation(), isRightClick}) +end + +function spawnToken(position, tokenType) + Global.call('spawnToken', {position, tokenType}) end \ No newline at end of file diff --git a/unpacked/Custom_Token b7b45b.ttslua b/unpacked/Custom_Token b7b45b.ttslua index cba82b051..d80e1b252 100644 --- a/unpacked/Custom_Token b7b45b.ttslua +++ b/unpacked/Custom_Token b7b45b.ttslua @@ -1,199 +1,199 @@ - - -function onSave() - saved_data = JSON.encode({tid=tableImageData, cd=checkData}) - --saved_data = "" - return saved_data -end - -function onload(saved_data) - --Loads the tracking for if the game has started yet - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - tableImageData = loaded_data.tid - checkData = loaded_data.cd - else - tableImageData = {} - checkData = {move=false, scale=false} - end - - --Disables interactable status of objects with GUID in list - for _, guid in ipairs(ref_noninteractable) do - local obj = getObjectFromGUID(guid) - if obj then obj.interactable = false end - end - - - - obj_surface = getObjectFromGUID("721ba2") - - - controlActive = false - createOpenCloseButton() -end - - - ---Activation/deactivation of control panel - - - ---Activated by clicking on -function click_toggleControl(_, color) - if permissionCheck(color) then - if not controlActive then - --Activate control panel - controlActive = true - self.clearButtons() - createOpenCloseButton() - createSurfaceInput() - createSurfaceButtons() - - else - --Deactivate control panel - controlActive = false - self.clearButtons() - self.clearInputs() - createOpenCloseButton() - - end - end -end - - - - ---Table surface control - - - ---Changes table surface -function click_applySurface(_, color) - if permissionCheck(color) then - updateSurface() - broadcastToAll("New Playmat Image Applied", {0.2,0.9,0.2}) - end -end - ---Updates surface from the values in the input field -function updateSurface() - local customInfo = obj_surface.getCustomObject() - customInfo.image = self.getInputs()[1].value - obj_surface.setCustomObject(customInfo) - obj_surface = obj_surface.reload() -end - - - ---Information gathering - - - ---Checks if a color is promoted or host -function permissionCheck(color) - if Player[color].host==true or Player[color].promoted==true then - return true - else - return false - end -end - ---Locates a string saved within memory file -function findInImageDataIndex(...) - for _, str in ipairs({...}) do - for i, v in ipairs(tableImageData) do - if v.url == str or v.name == str then - return i - end - end - end - return nil -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end - ---Locates a button with a helper function -function findButton(obj, func) - if func==nil then error("No func supplied to findButton") end - for _, v in ipairs(obj.getButtons()) do - if func(v) then - return v - end - end - return nil -end - - - ---Creation of buttons/inputs - - - -function createOpenCloseButton() - local tooltip = "Open Playmat Panel" - if controlActive then - tooltip = "Close Playmat Panel" - end - self.createButton({ - click_function="click_toggleControl", function_owner=self, - position={0,0,0}, rotation={-45,0,0}, height=1500, width=1500, - color={1,1,1,0}, tooltip=tooltip - }) -end - -function createSurfaceInput() - local currentURL = obj_surface.getCustomObject().diffuse - local nickname = "" - if findInImageDataIndex(currentURL) ~= nil then - nickname = tableImageData[findInImageDataIndex(currentURL)].name - end - - self.createInput({ - label="URL", input_function="none", function_owner=self, - alignment=3, position={0,0.15,3}, height=224, width=4000, - font_size=200, tooltip="Enter URL for playmat image", - value=currentURL - }) -end - -function createSurfaceButtons() - --Label - self.createButton({ - label="Playmat Image Swapper", click_function="none", - position={0,0.15,2.2}, height=0, width=0, font_size=300, font_color={1,1,1} - }) - --Functional - self.createButton({ - label="Apply Image\nTo Playmat", click_function="click_applySurface", - function_owner=self, tooltip="Apply URL as playmat image", - position={0,0.15,4}, height=440, width=1400, font_size=200, - }) - -end - - - - - - ---Data tables - - - - -ref_noninteractable = { - "afc863","c8edca","393bf7","12c65e","f938a2","9f95fd","35b95f", - "5af8f2","4ee1f2","bd69bd" -} - -ref_playerColor = { - "White", "Brown", "Red", "Orange", "Yellow", - "Green", "Teal", "Blue", "Purple", "Pink", "Black" -} - ---Dummy function, absorbs unwanted triggers + + +function onSave() + saved_data = JSON.encode({tid=tableImageData, cd=checkData}) + --saved_data = "" + return saved_data +end + +function onload(saved_data) + --Loads the tracking for if the game has started yet + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + tableImageData = loaded_data.tid + checkData = loaded_data.cd + else + tableImageData = {} + checkData = {move=false, scale=false} + end + + --Disables interactable status of objects with GUID in list + for _, guid in ipairs(ref_noninteractable) do + local obj = getObjectFromGUID(guid) + if obj then obj.interactable = false end + end + + + + obj_surface = getObjectFromGUID("721ba2") + + + controlActive = false + createOpenCloseButton() +end + + + +--Activation/deactivation of control panel + + + +--Activated by clicking on +function click_toggleControl(_, color) + if permissionCheck(color) then + if not controlActive then + --Activate control panel + controlActive = true + self.clearButtons() + createOpenCloseButton() + createSurfaceInput() + createSurfaceButtons() + + else + --Deactivate control panel + controlActive = false + self.clearButtons() + self.clearInputs() + createOpenCloseButton() + + end + end +end + + + + +--Table surface control + + + +--Changes table surface +function click_applySurface(_, color) + if permissionCheck(color) then + updateSurface() + broadcastToAll("New Playmat Image Applied", {0.2,0.9,0.2}) + end +end + +--Updates surface from the values in the input field +function updateSurface() + local customInfo = obj_surface.getCustomObject() + customInfo.image = self.getInputs()[1].value + obj_surface.setCustomObject(customInfo) + obj_surface = obj_surface.reload() +end + + + +--Information gathering + + + +--Checks if a color is promoted or host +function permissionCheck(color) + if Player[color].host==true or Player[color].promoted==true then + return true + else + return false + end +end + +--Locates a string saved within memory file +function findInImageDataIndex(...) + for _, str in ipairs({...}) do + for i, v in ipairs(tableImageData) do + if v.url == str or v.name == str then + return i + end + end + end + return nil +end + +--Round number (num) to the Nth decimal (dec) +function round(num, dec) + local mult = 10^(dec or 0) + return math.floor(num * mult + 0.5) / mult +end + +--Locates a button with a helper function +function findButton(obj, func) + if func==nil then error("No func supplied to findButton") end + for _, v in ipairs(obj.getButtons()) do + if func(v) then + return v + end + end + return nil +end + + + +--Creation of buttons/inputs + + + +function createOpenCloseButton() + local tooltip = "Open Playmat Panel" + if controlActive then + tooltip = "Close Playmat Panel" + end + self.createButton({ + click_function="click_toggleControl", function_owner=self, + position={0,0,0}, rotation={-45,0,0}, height=1500, width=1500, + color={1,1,1,0}, tooltip=tooltip + }) +end + +function createSurfaceInput() + local currentURL = obj_surface.getCustomObject().diffuse + local nickname = "" + if findInImageDataIndex(currentURL) ~= nil then + nickname = tableImageData[findInImageDataIndex(currentURL)].name + end + + self.createInput({ + label="URL", input_function="none", function_owner=self, + alignment=3, position={0,0.15,3}, height=224, width=4000, + font_size=200, tooltip="Enter URL for playmat image", + value=currentURL + }) +end + +function createSurfaceButtons() + --Label + self.createButton({ + label="Playmat Image Swapper", click_function="none", + position={0,0.15,2.2}, height=0, width=0, font_size=300, font_color={1,1,1} + }) + --Functional + self.createButton({ + label="Apply Image\nTo Playmat", click_function="click_applySurface", + function_owner=self, tooltip="Apply URL as playmat image", + position={0,0.15,4}, height=440, width=1400, font_size=200, + }) + +end + + + + + + +--Data tables + + + + +ref_noninteractable = { + "afc863","c8edca","393bf7","12c65e","f938a2","9f95fd","35b95f", + "5af8f2","4ee1f2","bd69bd" +} + +ref_playerColor = { + "White", "Brown", "Red", "Orange", "Yellow", + "Green", "Teal", "Blue", "Purple", "Pink", "Black" +} + +--Dummy function, absorbs unwanted triggers function none() end \ No newline at end of file diff --git a/unpacked/Custom_Token Agenda Deck 85c4c6.ttslua b/unpacked/Custom_Token Agenda Deck 85c4c6.ttslua index ee5b7a827..7aacde2cb 100644 --- a/unpacked/Custom_Token Agenda Deck 85c4c6.ttslua +++ b/unpacked/Custom_Token Agenda Deck 85c4c6.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {1,1,1,95} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={0,0,0,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {1,1,1,95} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={0,0,0,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Chaos Bag Stat Tracker 766620.ttslua b/unpacked/Custom_Token Chaos Bag Stat Tracker 766620.ttslua index 11d95d262..56ef4b7fe 100644 --- a/unpacked/Custom_Token Chaos Bag Stat Tracker 766620.ttslua +++ b/unpacked/Custom_Token Chaos Bag Stat Tracker 766620.ttslua @@ -1,101 +1,101 @@ -function onload(saved_data) - light_mode = false - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - end - createAll() -end - --- functions delegated to Global -function printStats(object, player, isRightClick) - -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) - if isRightClick then - Global.call("resetStats") - else - Global.call("printStats") - end -end - -function updateSave() - local data_to_save = {light_mode } - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {1,1,1,95} - else - f_color = {0,0,0,100} - end - - self.createButton({ - click_function="printStats", - function_owner=self, - position={0,0.05,0}, - height=600, - width=1000, - alignment = 3, - tooltip = "Left Click to print stats. Right Click to reset them.", - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={0,0,0,0} - }) - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = "Left click to show stats. Right click to reset them." - }) -end - -function keepSample(_obj, _string, value) - reloadAll() -end - -function onDestroy() - Timer.destroy(timerID) +function onload(saved_data) + light_mode = false + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + end + createAll() +end + +-- functions delegated to Global +function printStats(object, player, isRightClick) + -- local toPosition = self.positionToWorld(DRAWN_CHAOS_TOKEN_OFFSET) + if isRightClick then + Global.call("resetStats") + else + Global.call("printStats") + end +end + +function updateSave() + local data_to_save = {light_mode } + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {1,1,1,95} + else + f_color = {0,0,0,100} + end + + self.createButton({ + click_function="printStats", + function_owner=self, + position={0,0.05,0}, + height=600, + width=1000, + alignment = 3, + tooltip = "Left Click to print stats. Right Click to reset them.", + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={0,0,0,0} + }) + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = "Left click to show stats. Right click to reset them." + }) +end + +function keepSample(_obj, _string, value) + reloadAll() +end + +function onDestroy() + Timer.destroy(timerID) end \ No newline at end of file diff --git a/unpacked/Custom_Token Damage 1f5a0a.ttslua b/unpacked/Custom_Token Damage 1f5a0a.ttslua index 3a20df99e..690cc9178 100644 --- a/unpacked/Custom_Token Damage 1f5a0a.ttslua +++ b/unpacked/Custom_Token Damage 1f5a0a.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0.1,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0.1,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Damage 591a45.ttslua b/unpacked/Custom_Token Damage 591a45.ttslua index 3a20df99e..690cc9178 100644 --- a/unpacked/Custom_Token Damage 591a45.ttslua +++ b/unpacked/Custom_Token Damage 591a45.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0.1,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0.1,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Damage e64eec.ttslua b/unpacked/Custom_Token Damage e64eec.ttslua index 3a20df99e..690cc9178 100644 --- a/unpacked/Custom_Token Damage e64eec.ttslua +++ b/unpacked/Custom_Token Damage e64eec.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0.1,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0.1,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Damage eb08d6.ttslua b/unpacked/Custom_Token Damage eb08d6.ttslua index 3a20df99e..690cc9178 100644 --- a/unpacked/Custom_Token Damage eb08d6.ttslua +++ b/unpacked/Custom_Token Damage eb08d6.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0.1,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0.1,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Horror 0257d9.ttslua b/unpacked/Custom_Token Horror 0257d9.ttslua index 639b2e969..895f01f1f 100644 --- a/unpacked/Custom_Token Horror 0257d9.ttslua +++ b/unpacked/Custom_Token Horror 0257d9.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Horror 468e88.ttslua b/unpacked/Custom_Token Horror 468e88.ttslua index 639b2e969..895f01f1f 100644 --- a/unpacked/Custom_Token Horror 468e88.ttslua +++ b/unpacked/Custom_Token Horror 468e88.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Horror 7b5729.ttslua b/unpacked/Custom_Token Horror 7b5729.ttslua index 639b2e969..895f01f1f 100644 --- a/unpacked/Custom_Token Horror 7b5729.ttslua +++ b/unpacked/Custom_Token Horror 7b5729.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Horror beb964.ttslua b/unpacked/Custom_Token Horror beb964.ttslua index 639b2e969..895f01f1f 100644 --- a/unpacked/Custom_Token Horror beb964.ttslua +++ b/unpacked/Custom_Token Horror beb964.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={-0.025,0.05,-0.025}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={-0.025,0.05,-0.025}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua b/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua index 07c0cf077..507874c32 100644 --- a/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua +++ b/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua @@ -1,158 +1,158 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = false - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - p1ClueCounter = getObjectFromGUID("37be78") - p2ClueCounter = getObjectFromGUID("1769ed") - p3ClueCounter = getObjectFromGUID("032300") - p4ClueCounter = getObjectFromGUID("d86b7c") - - timerID = self.getGUID()..math.random(9999999999999) - Timer.create({ - identifier=timerID, - function_name="totalCounters", function_owner=self, - repetitions=0, delay=1 - }) - createAll() -end - -function loadPlayerCounters() - p1ClueCounter = getObjectFromGUID("37be78") - p2ClueCounter = getObjectFromGUID("1769ed") - p3ClueCounter = getObjectFromGUID("032300") - p4ClueCounter = getObjectFromGUID("d86b7c") -end - - -function totalCounters() - if p1ClueCounter == nil or p2ClueCounter == nil or p3ClueCounter == nil or p4ClueCounter == nil then - loadPlayerCounters() - end - local p1ClueCount = p1ClueCounter.getVar("exposedValue") - local p2ClueCount = p2ClueCounter.getVar("exposedValue") - local p3ClueCount = p3ClueCounter.getVar("exposedValue") - local p4ClueCount = p4ClueCounter.getVar("exposedValue") - val = tonumber(p1ClueCount) + tonumber(p2ClueCount) + tonumber(p3ClueCount) + tonumber(p4ClueCount) - updateVal() - updateSave() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0.5, 0.5, 0.5, 95} - - if light_mode then - f_color = {1,1,1,95} - else - f_color = {0,0,0,100} - end - - self.createButton({ - label=tostring(val), - click_function="removeAllPlayerClues", - function_owner=self, - position={0,0.05,0}, - height=600, - width=1000, - alignment = 3, - tooltip = "Click button to remove all clues from all investigators", - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={0,0,0,0} - }) - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function removeAllPlayerClues() - p1ClueCounter.call("removeAllClues") - p2ClueCounter.call("removeAllClues") - p3ClueCounter.call("removeAllClues") - p4ClueCounter.call("removeAllClues") -end - - -function reloadAll() - removeAll() - createAll() - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function updateVal() - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = "Click button to remove all clues from all investigators" - }) - self.editButton({ - index = 0, - value = tostring(val), - - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() -end +MIN_VALUE = -99 +MAX_VALUE = 999 + +function onload(saved_data) + light_mode = false + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + p1ClueCounter = getObjectFromGUID("37be78") + p2ClueCounter = getObjectFromGUID("1769ed") + p3ClueCounter = getObjectFromGUID("032300") + p4ClueCounter = getObjectFromGUID("d86b7c") + + timerID = self.getGUID()..math.random(9999999999999) + Timer.create({ + identifier=timerID, + function_name="totalCounters", function_owner=self, + repetitions=0, delay=1 + }) + createAll() +end + +function loadPlayerCounters() + p1ClueCounter = getObjectFromGUID("37be78") + p2ClueCounter = getObjectFromGUID("1769ed") + p3ClueCounter = getObjectFromGUID("032300") + p4ClueCounter = getObjectFromGUID("d86b7c") +end + + +function totalCounters() + if p1ClueCounter == nil or p2ClueCounter == nil or p3ClueCounter == nil or p4ClueCounter == nil then + loadPlayerCounters() + end + local p1ClueCount = p1ClueCounter.getVar("exposedValue") + local p2ClueCount = p2ClueCounter.getVar("exposedValue") + local p3ClueCount = p3ClueCounter.getVar("exposedValue") + local p4ClueCount = p4ClueCounter.getVar("exposedValue") + val = tonumber(p1ClueCount) + tonumber(p2ClueCount) + tonumber(p3ClueCount) + tonumber(p4ClueCount) + updateVal() + updateSave() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0.5, 0.5, 0.5, 95} + + if light_mode then + f_color = {1,1,1,95} + else + f_color = {0,0,0,100} + end + + self.createButton({ + label=tostring(val), + click_function="removeAllPlayerClues", + function_owner=self, + position={0,0.05,0}, + height=600, + width=1000, + alignment = 3, + tooltip = "Click button to remove all clues from all investigators", + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={0,0,0,0} + }) + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function removeAllPlayerClues() + p1ClueCounter.call("removeAllClues") + p2ClueCounter.call("removeAllClues") + p3ClueCounter.call("removeAllClues") + p4ClueCounter.call("removeAllClues") +end + + +function reloadAll() + removeAll() + createAll() + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function updateVal() + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = "Click button to remove all clues from all investigators" + }) + self.editButton({ + index = 0, + value = tostring(val), + + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() +end function onDestroy() Timer.destroy(timerID) diff --git a/unpacked/Custom_Token Playarea 721ba2.ttslua b/unpacked/Custom_Token Playarea 721ba2.ttslua index 4f133e507..8eefcaa64 100644 --- a/unpacked/Custom_Token Playarea 721ba2.ttslua +++ b/unpacked/Custom_Token Playarea 721ba2.ttslua @@ -1,214 +1,214 @@ --- set true to enable debug logging -DEBUG = false - --- we use this to turn off collision handling (for clue spawning) --- until after load is complete (probably a better way to do this) -COLLISION_ENABLED = false - --- TODO get the log function from global instead --- log = Global.call('getLogFunction', this) -function getLogFunction(object) - return function (message) - if DEBUG then - print(message) - end - end -end - -log = getLogFunction(self) - -function onload(save_state) - self.interactable = DEBUG - local dataHelper = getObjectFromGUID('708279') - LOCATIONS = dataHelper.getTable('LOCATIONS_DATA') - - TOKEN_PLAYER_ONE = Global.getTable('tokenplayerone') - COUNTER = getObjectFromGUID('f182ee') - log('attempting to load state: ' .. save_state) - if save_state ~= '' then - SPAWNED_LOCATION_GUIDS = JSON.decode(save_state) - end - - COLLISION_ENABLED = true -end - -function onSave() - local spawned_locations = JSON.encode(SPAWNED_LOCATION_GUIDS) - self.script_state = spawned_locations -end - ---[[ -records locations we have spawned clues for, we write this to the save -file onsave() so we don't spawn clues again after a load -]] -SPAWNED_LOCATION_GUIDS = {} - -function isAlreadySpawned(object) - return SPAWNED_LOCATION_GUIDS[object.getGUID()] ~= nil -end - -function markSpawned(object) - SPAWNED_LOCATION_GUIDS[object.getGUID()] = 1 -end - -function buildKey(object) - return object.getName() .. '_' .. object.getGUID() -end - --- try the compound key then the name alone as default -function getLocation(object) - return LOCATIONS[buildKey(object)] or LOCATIONS[object.getName()] -end - -function isLocationWithClues(object) - return getLocation(object) ~= nil -end - ---[[ -Return the number of clues to spawn on this location -]] -function getClueCount(object, isFaceDown, playerCount) - if not isLocationWithClues(object) then - error('attempted to get clue for unexpected object: ' .. object.getName()) - end - local details = getLocation(object) - log(object.getName() .. ' : ' .. details['type'] .. ' : ' .. details['value'] .. ' : ' .. details['clueSide']) - if ((isFaceDown and details['clueSide'] == 'back') - or (not isFaceDown and details['clueSide'] == 'front')) then - if details['type'] == 'fixed' then - return details['value'] - elseif details['type'] == 'perPlayer' then - return details['value'] * playerCount - end - error('unexpected location type: ' .. details['type']) - end - return 0 -end - -function spawnToken(position, number) - local obj_parameters = { - position = position, - rotation = {3.87674022, -90, 0.239081308} - } - local custom = { - thickness = 0.1, - stackable = true - } - - if number == '1' or number == '2' then - obj_parameters.type = 'Custom_Token' - custom.merge_distance = 5.0 - local token = spawnObject(obj_parameters) - if number == '1' then - custom.image = TOKEN_PLAYER_ONE.damageone - token.setCustomObject(custom) - token.scale {0.17, 1, 0.17} - return token - end - - if number == '2' then - custom.image = TOKEN_PLAYER_ONE.damagethree - token.setCustomObject(custom) - token.scale {0.18, 1, 0.18} - return token - end - end - - if number == '3' or number == '4' then - obj_parameters.type = 'Custom_Tile' - custom.type = 2 - local token = spawnObject(obj_parameters) - if number == '3' then - custom.image = TOKEN_PLAYER_ONE.clue - custom.image_bottom = TOKEN_PLAYER_ONE.doom - token.setCustomObject(custom) - token.scale {0.25, 1, 0.25} - token.use_snap_points=false - return token - end - - if number == '4' then - custom.image = TOKEN_PLAYER_ONE.doom - custom.image_bottom = TOKEN_PLAYER_ONE.clue - token.setCustomObject(custom) - token.scale {0.25, 1, 0.25} - token.use_snap_points=false - return token - end - end - -end - - -function spawnCluesAtLocation(clueCount, collision_info) - local object = collision_info.collision_object - if isAlreadySpawned(object) then - error('tried to spawn clue for already spawned location:' .. object.getName()) - end - - local obj_parameters = {} - obj_parameters.type = 'Custom_Token' - obj_parameters.position = { - object.getPosition()[1], - object.getPosition()[2] + 1, - object.getPosition()[3] - } - - log('spawning clues for ' .. object.getName() .. '_' .. object.getGUID()) - local playerCount = COUNTER.getVar('val') - log('player count is ' .. playerCount .. ', clue count is ' .. clueCount) - -- mark this location as spawned, can't happen again - markSpawned(object) - i = 0 - while i < clueCount do - if i < 4 then - obj_parameters.position = { - collision_info.collision_object.getPosition()[1] + 0.3, - collision_info.collision_object.getPosition()[2] + 0.2, - collision_info.collision_object.getPosition()[3] - 0.8 + (0.55 * i) - } - elseif i < 8 then - obj_parameters.position = { - collision_info.collision_object.getPosition()[1] + 0.85, - collision_info.collision_object.getPosition()[2] + 0.2, - collision_info.collision_object.getPosition()[3] - 3 + (0.55 * i) - } - else - obj_parameters.position = { - collision_info.collision_object.getPosition()[1] + 0.575, - collision_info.collision_object.getPosition()[2] + 0.4, - collision_info.collision_object.getPosition()[3] - 5.2 + (0.55 * i)} - end - spawnToken(obj_parameters.position, '3') - i = i + 1 - end -end - - -function updateLocations(args) - local custom_data_helper = getObjectFromGUID(args[1]) - data_locations = custom_data_helper.getTable("LOCATIONS_DATA") - for k, v in pairs(data_locations) do - LOCATIONS[k] = v - end -end - -function onCollisionEnter(collision_info) - -- short circuit all collision stuff until we've loaded state - if not COLLISION_ENABLED then - return - end - - -- check if we should spawn clues here - local object = collision_info.collision_object - if isLocationWithClues(object) and not isAlreadySpawned(object) then - -- this isn't an either/or as down/up here means at a relatively low angle - -- local isFaceUp = not object.is_face_down - -- local isFaceDown = (object.getRotation()[3] > 160 and object.getRotation()[3] < 200) - local playerCount = COUNTER.getVar('val') - local clueCount = getClueCount(object, object.is_face_down, playerCount) - if clueCount > 0 then - spawnCluesAtLocation(clueCount, collision_info) - end - end +-- set true to enable debug logging +DEBUG = false + +-- we use this to turn off collision handling (for clue spawning) +-- until after load is complete (probably a better way to do this) +COLLISION_ENABLED = false + +-- TODO get the log function from global instead +-- log = Global.call('getLogFunction', this) +function getLogFunction(object) + return function (message) + if DEBUG then + print(message) + end + end +end + +log = getLogFunction(self) + +function onload(save_state) + self.interactable = DEBUG + local dataHelper = getObjectFromGUID('708279') + LOCATIONS = dataHelper.getTable('LOCATIONS_DATA') + + TOKEN_PLAYER_ONE = Global.getTable('tokenplayerone') + COUNTER = getObjectFromGUID('f182ee') + log('attempting to load state: ' .. save_state) + if save_state ~= '' then + SPAWNED_LOCATION_GUIDS = JSON.decode(save_state) + end + + COLLISION_ENABLED = true +end + +function onSave() + local spawned_locations = JSON.encode(SPAWNED_LOCATION_GUIDS) + self.script_state = spawned_locations +end + +--[[ +records locations we have spawned clues for, we write this to the save +file onsave() so we don't spawn clues again after a load +]] +SPAWNED_LOCATION_GUIDS = {} + +function isAlreadySpawned(object) + return SPAWNED_LOCATION_GUIDS[object.getGUID()] ~= nil +end + +function markSpawned(object) + SPAWNED_LOCATION_GUIDS[object.getGUID()] = 1 +end + +function buildKey(object) + return object.getName() .. '_' .. object.getGUID() +end + +-- try the compound key then the name alone as default +function getLocation(object) + return LOCATIONS[buildKey(object)] or LOCATIONS[object.getName()] +end + +function isLocationWithClues(object) + return getLocation(object) ~= nil +end + +--[[ +Return the number of clues to spawn on this location +]] +function getClueCount(object, isFaceDown, playerCount) + if not isLocationWithClues(object) then + error('attempted to get clue for unexpected object: ' .. object.getName()) + end + local details = getLocation(object) + log(object.getName() .. ' : ' .. details['type'] .. ' : ' .. details['value'] .. ' : ' .. details['clueSide']) + if ((isFaceDown and details['clueSide'] == 'back') + or (not isFaceDown and details['clueSide'] == 'front')) then + if details['type'] == 'fixed' then + return details['value'] + elseif details['type'] == 'perPlayer' then + return details['value'] * playerCount + end + error('unexpected location type: ' .. details['type']) + end + return 0 +end + +function spawnToken(position, number) + local obj_parameters = { + position = position, + rotation = {3.87674022, -90, 0.239081308} + } + local custom = { + thickness = 0.1, + stackable = true + } + + if number == '1' or number == '2' then + obj_parameters.type = 'Custom_Token' + custom.merge_distance = 5.0 + local token = spawnObject(obj_parameters) + if number == '1' then + custom.image = TOKEN_PLAYER_ONE.damageone + token.setCustomObject(custom) + token.scale {0.17, 1, 0.17} + return token + end + + if number == '2' then + custom.image = TOKEN_PLAYER_ONE.damagethree + token.setCustomObject(custom) + token.scale {0.18, 1, 0.18} + return token + end + end + + if number == '3' or number == '4' then + obj_parameters.type = 'Custom_Tile' + custom.type = 2 + local token = spawnObject(obj_parameters) + if number == '3' then + custom.image = TOKEN_PLAYER_ONE.clue + custom.image_bottom = TOKEN_PLAYER_ONE.doom + token.setCustomObject(custom) + token.scale {0.25, 1, 0.25} + token.use_snap_points=false + return token + end + + if number == '4' then + custom.image = TOKEN_PLAYER_ONE.doom + custom.image_bottom = TOKEN_PLAYER_ONE.clue + token.setCustomObject(custom) + token.scale {0.25, 1, 0.25} + token.use_snap_points=false + return token + end + end + +end + + +function spawnCluesAtLocation(clueCount, collision_info) + local object = collision_info.collision_object + if isAlreadySpawned(object) then + error('tried to spawn clue for already spawned location:' .. object.getName()) + end + + local obj_parameters = {} + obj_parameters.type = 'Custom_Token' + obj_parameters.position = { + object.getPosition()[1], + object.getPosition()[2] + 1, + object.getPosition()[3] + } + + log('spawning clues for ' .. object.getName() .. '_' .. object.getGUID()) + local playerCount = COUNTER.getVar('val') + log('player count is ' .. playerCount .. ', clue count is ' .. clueCount) + -- mark this location as spawned, can't happen again + markSpawned(object) + i = 0 + while i < clueCount do + if i < 4 then + obj_parameters.position = { + collision_info.collision_object.getPosition()[1] + 0.3, + collision_info.collision_object.getPosition()[2] + 0.2, + collision_info.collision_object.getPosition()[3] - 0.8 + (0.55 * i) + } + elseif i < 8 then + obj_parameters.position = { + collision_info.collision_object.getPosition()[1] + 0.85, + collision_info.collision_object.getPosition()[2] + 0.2, + collision_info.collision_object.getPosition()[3] - 3 + (0.55 * i) + } + else + obj_parameters.position = { + collision_info.collision_object.getPosition()[1] + 0.575, + collision_info.collision_object.getPosition()[2] + 0.4, + collision_info.collision_object.getPosition()[3] - 5.2 + (0.55 * i)} + end + spawnToken(obj_parameters.position, '3') + i = i + 1 + end +end + + +function updateLocations(args) + local custom_data_helper = getObjectFromGUID(args[1]) + data_locations = custom_data_helper.getTable("LOCATIONS_DATA") + for k, v in pairs(data_locations) do + LOCATIONS[k] = v + end +end + +function onCollisionEnter(collision_info) + -- short circuit all collision stuff until we've loaded state + if not COLLISION_ENABLED then + return + end + + -- check if we should spawn clues here + local object = collision_info.collision_object + if isLocationWithClues(object) and not isAlreadySpawned(object) then + -- this isn't an either/or as down/up here means at a relatively low angle + -- local isFaceUp = not object.is_face_down + -- local isFaceDown = (object.getRotation()[3] > 160 and object.getRotation()[3] < 200) + local playerCount = COUNTER.getVar('val') + local clueCount = getClueCount(object, object.is_face_down, playerCount) + if clueCount > 0 then + spawnCluesAtLocation(clueCount, collision_info) + end + end end \ No newline at end of file diff --git a/unpacked/Custom_Token Resources 4406f0.ttslua b/unpacked/Custom_Token Resources 4406f0.ttslua index 167a90f72..df6f93a6c 100644 --- a/unpacked/Custom_Token Resources 4406f0.ttslua +++ b/unpacked/Custom_Token Resources 4406f0.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Resources 816d84.ttslua b/unpacked/Custom_Token Resources 816d84.ttslua index 167a90f72..df6f93a6c 100644 --- a/unpacked/Custom_Token Resources 816d84.ttslua +++ b/unpacked/Custom_Token Resources 816d84.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Resources a4b60d.ttslua b/unpacked/Custom_Token Resources a4b60d.ttslua index 167a90f72..df6f93a6c 100644 --- a/unpacked/Custom_Token Resources a4b60d.ttslua +++ b/unpacked/Custom_Token Resources a4b60d.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file diff --git a/unpacked/Custom_Token Resources cd15ac.ttslua b/unpacked/Custom_Token Resources cd15ac.ttslua index 167a90f72..df6f93a6c 100644 --- a/unpacked/Custom_Token Resources cd15ac.ttslua +++ b/unpacked/Custom_Token Resources cd15ac.ttslua @@ -1,132 +1,132 @@ -MIN_VALUE = -99 -MAX_VALUE = 999 - -function onload(saved_data) - light_mode = true - val = 0 - - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - light_mode = loaded_data[1] - val = loaded_data[2] - end - - createAll() -end - -function updateSave() - local data_to_save = {light_mode, val} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function createAll() - s_color = {0,0,0,100} +MIN_VALUE = -99 +MAX_VALUE = 999 - if light_mode then - f_color = {1,1,1,100} - else - f_color = {0,0,0,100} - end - - - - self.createButton({ - label=tostring(val), - click_function="add_subtract", - function_owner=self, - position={0,0.05,0.1}, - height=600, - width=1000, - alignment = 3, - scale={x=1.5, y=1.5, z=1.5}, - font_size=600, - font_color=f_color, - color={1,1,1,0} - }) - - - - - if light_mode then - lightButtonText = "[ Set dark ]" - else - lightButtonText = "[ Set light ]" - end - -end - -function removeAll() - self.removeInput(0) - self.removeInput(1) - self.removeButton(0) - self.removeButton(1) - self.removeButton(2) -end - -function reloadAll() - removeAll() - createAll() - - updateSave() -end - -function swap_fcolor(_obj, _color, alt_click) - light_mode = not light_mode - reloadAll() -end - -function swap_align(_obj, _color, alt_click) - center_mode = not center_mode - reloadAll() -end - -function editName(_obj, _string, value) - self.setName(value) - setTooltips() -end - -function add_subtract(_obj, _color, alt_click) - mod = alt_click and -1 or 1 - new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) - if val ~= new_value then - val = new_value - updateVal() - updateSave() - end -end - -function updateVal() - - self.editButton({ - index = 0, - label = tostring(val), - - }) -end - -function reset_val() - val = 0 - updateVal() - updateSave() -end - -function setTooltips() - self.editInput({ - index = 0, - value = self.getName(), - tooltip = ttText - }) - self.editButton({ - index = 0, - value = tostring(val), - tooltip = ttText - }) -end - -function null() -end - -function keepSample(_obj, _string, value) - reloadAll() +function onload(saved_data) + light_mode = true + val = 0 + + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + light_mode = loaded_data[1] + val = loaded_data[2] + end + + createAll() +end + +function updateSave() + local data_to_save = {light_mode, val} + saved_data = JSON.encode(data_to_save) + self.script_state = saved_data +end + +function createAll() + s_color = {0,0,0,100} + + if light_mode then + f_color = {1,1,1,100} + else + f_color = {0,0,0,100} + end + + + + self.createButton({ + label=tostring(val), + click_function="add_subtract", + function_owner=self, + position={0,0.05,0.1}, + height=600, + width=1000, + alignment = 3, + scale={x=1.5, y=1.5, z=1.5}, + font_size=600, + font_color=f_color, + color={1,1,1,0} + }) + + + + + if light_mode then + lightButtonText = "[ Set dark ]" + else + lightButtonText = "[ Set light ]" + end + +end + +function removeAll() + self.removeInput(0) + self.removeInput(1) + self.removeButton(0) + self.removeButton(1) + self.removeButton(2) +end + +function reloadAll() + removeAll() + createAll() + + updateSave() +end + +function swap_fcolor(_obj, _color, alt_click) + light_mode = not light_mode + reloadAll() +end + +function swap_align(_obj, _color, alt_click) + center_mode = not center_mode + reloadAll() +end + +function editName(_obj, _string, value) + self.setName(value) + setTooltips() +end + +function add_subtract(_obj, _color, alt_click) + mod = alt_click and -1 or 1 + new_value = math.min(math.max(val + mod, MIN_VALUE), MAX_VALUE) + if val ~= new_value then + val = new_value + updateVal() + updateSave() + end +end + +function updateVal() + + self.editButton({ + index = 0, + label = tostring(val), + + }) +end + +function reset_val() + val = 0 + updateVal() + updateSave() +end + +function setTooltips() + self.editInput({ + index = 0, + value = self.getName(), + tooltip = ttText + }) + self.editButton({ + index = 0, + value = tostring(val), + tooltip = ttText + }) +end + +function null() +end + +function keepSample(_obj, _string, value) + reloadAll() end \ No newline at end of file